Skip to content

Commit

Permalink
Merge pull request #617 from RocketPy-Team/enh/roll-moment-from-eccen…
Browse files Browse the repository at this point in the history
…tricity

ENH: CP and Thrust Eccentricity Effects Generate Roll Moment

Tests not passing on CI
  • Loading branch information
Gui-FernandesBR authored Jun 16, 2024
2 parents 9322646 + 240585b commit 84a2a16
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 5 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ You can install this version by running `pip install rocketpy==1.3.0`

### Added

- ENH: CP and Thrust Eccentricity Effects Generate Roll Moment [#617](https://github.com/RocketPy-Team/RocketPy/pull/617)
- ENH: Add Prandtl-Gauss transformation to NoseCone and Tail [#609](https://github.com/RocketPy-Team/RocketPy/pull/609)
- DOC: Adds prometheus data, Spaceport America 2022 [#601](https://github.com/RocketPy-Team/RocketPy/pull/601)
- ENH: Pre-calculate attributes in Rocket class [#595](https://github.com/RocketPy-Team/RocketPy/pull/595)
Expand Down
22 changes: 17 additions & 5 deletions rocketpy/simulation/flight.py
Original file line number Diff line number Diff line change
Expand Up @@ -1494,6 +1494,9 @@ def u_dot(self, t, u, post_processing=False):
M3 += M3f - M3d
except AttributeError:
pass
# Off center moment
M3 += self.rocket.cp_eccentricity_x * R2 - self.rocket.cp_eccentricity_y * R1

# Calculate derivatives
# Angular acceleration
alpha1 = (
Expand Down Expand Up @@ -1651,10 +1654,6 @@ def u_dot_generalized(self, t, u, post_processing=False):
R3 = air_brakes_force # Substitutes rocket drag coefficient
else:
R3 += air_brakes_force
## Off center moment
M1 += self.rocket.cp_eccentricity_y * R3
M2 -= self.rocket.cp_eccentricity_x * R3

# Get rocket velocity in body frame
vB = Kt @ v
# Calculate lift and moment for each component of the rocket
Expand Down Expand Up @@ -1724,11 +1723,24 @@ def u_dot_generalized(self, t, u, post_processing=False):
M3 += M3f - M3d
except AttributeError:
pass

# Off center moment
thrust = self.rocket.motor.thrust.get_value_opt(t)
M1 += (
self.rocket.cp_eccentricity_y * R3
+ self.rocket.thrust_eccentricity_x * thrust
)
M2 -= (
self.rocket.cp_eccentricity_x * R3
- self.rocket.thrust_eccentricity_y * thrust
)
M3 += self.rocket.cp_eccentricity_x * R2 - self.rocket.cp_eccentricity_y * R1

weightB = Kt @ Vector([0, 0, -total_mass * self.env.gravity.get_value_opt(z)])
T00 = total_mass * r_CM
T03 = 2 * total_mass_dot * (r_NOZ - r_CM) - 2 * total_mass * r_CM_dot
T04 = (
Vector([0, 0, self.rocket.motor.thrust.get_value_opt(t)])
Vector([0, 0, thrust])
- total_mass * r_CM_ddot
- 2 * total_mass_dot * r_CM_dot
+ total_mass_ddot * (r_NOZ - r_CM)
Expand Down
31 changes: 31 additions & 0 deletions tests/test_flight.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,37 @@ def test_rolling_flight(
assert test_flight.all_info() == None


@patch("matplotlib.pyplot.show")
def test_eccentricity_on_flight(
mock_show,
example_plain_env,
cesaroni_m1670,
calisto,
calisto_nose_cone,
calisto_trapezoidal_fins,
calisto_tail,
):
test_rocket = calisto

test_rocket.set_rail_buttons(0.082, -0.618)
test_rocket.add_motor(cesaroni_m1670, position=-1.373)
calisto.aerodynamic_surfaces.add(calisto_trapezoidal_fins, position=-1.04956)
calisto.aerodynamic_surfaces.add(calisto_nose_cone, 1.160)
calisto.aerodynamic_surfaces.add(calisto_tail, -1.313)
calisto.add_cm_eccentricity(x=-0.01, y=-0.01)

test_flight = Flight(
rocket=test_rocket,
environment=example_plain_env,
rail_length=5.2,
inclination=85,
heading=0,
terminate_on_apogee=True,
)

assert test_flight.all_info() == None


@patch("matplotlib.pyplot.show")
def test_air_brakes_flight(mock_show, flight_calisto_air_brakes):
"""Test the flight of a rocket with air brakes. This test only validates
Expand Down
16 changes: 16 additions & 0 deletions tests/unit/test_rocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,3 +496,19 @@ def test_get_inertia_tensor_derivative_at_time(calisto):
assert pytest.approx(0, atol) == inertia_tensor.y[2]
assert pytest.approx(0, atol) == inertia_tensor.z[0]
assert pytest.approx(0, atol) == inertia_tensor.z[1]


def test_add_thrust_eccentricity(calisto):
"""Test add_thrust_eccentricity method of the Rocket class."""
calisto.add_thrust_eccentricity(0.1, 0.1)
assert calisto.thrust_eccentricity_x == 0.1
assert calisto.thrust_eccentricity_y == 0.1


def test_add_cm_eccentricity(calisto):
"""Test add_cm_eccentricity method of the Rocket class."""
calisto.add_cm_eccentricity(-0.1, -0.1)
assert calisto.cp_eccentricity_x == 0.1
assert calisto.cp_eccentricity_y == 0.1
assert calisto.thrust_eccentricity_x == 0.1
assert calisto.thrust_eccentricity_y == 0.1

0 comments on commit 84a2a16

Please sign in to comment.