-
-
Notifications
You must be signed in to change notification settings - Fork 200
ENH: Improve parachute geometric parametrization #835
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from 7 commits
0873d21
02ddd1b
1119ef8
413503f
f09a4b0
78ef92e
7defc38
465f526
c5ce166
f84459d
4fcb406
159cce8
0c434f8
f136ffb
112b75a
40d10c5
1e2a2fd
65530fd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -92,6 +92,13 @@ class Parachute: | |||||||||
Function of noisy_pressure_signal. | ||||||||||
Parachute.clean_pressure_signal_function : Function | ||||||||||
Function of clean_pressure_signal. | ||||||||||
Parachute.parachute_radius : float | ||||||||||
Radius of the inflated parachute in meters. | ||||||||||
Parachute.parachute_height : float | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
or
Suggested change
|
||||||||||
Height of the inflated parachute in meters. | ||||||||||
Parachute.porosity : float | ||||||||||
Porosity of the parachute material, which is a measure of how much air can | ||||||||||
pass through the parachute material. | ||||||||||
""" | ||||||||||
|
||||||||||
def __init__( | ||||||||||
|
@@ -102,6 +109,9 @@ def __init__( | |||||||||
sampling_rate, | ||||||||||
lag=0, | ||||||||||
noise=(0, 0, 0), | ||||||||||
parachute_radius=1.5, | ||||||||||
parachute_height=None, | ||||||||||
porosity=0.0432, | ||||||||||
): | ||||||||||
"""Initializes Parachute class. | ||||||||||
|
||||||||||
|
@@ -154,6 +164,16 @@ def __init__( | |||||||||
The values are used to add noise to the pressure signal which is | ||||||||||
passed to the trigger function. Default value is ``(0, 0, 0)``. | ||||||||||
Units are in Pa. | ||||||||||
parachute_radius : float, optional | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you be more spacific on the parachute_radius definition please? I believe it is still not intuitive what the radius is. |
||||||||||
Radius of the inflated parachute. Default value is 1.5. | ||||||||||
Units are in meters. | ||||||||||
parachute_height : float, optional | ||||||||||
Height of the inflated parachute. Default value is the radius parachute. | ||||||||||
Units are in meters. | ||||||||||
porosity : float, optional | ||||||||||
Porosity of the parachute material, which is a measure of how much air can | ||||||||||
pass through the parachute material. | ||||||||||
Default value is 0.0432 (for consistency with previous versions). | ||||||||||
""" | ||||||||||
self.name = name | ||||||||||
self.cd_s = cd_s | ||||||||||
|
@@ -170,6 +190,11 @@ def __init__( | |||||||||
self.clean_pressure_signal_function = Function(0) | ||||||||||
self.noisy_pressure_signal_function = Function(0) | ||||||||||
self.noise_signal_function = Function(0) | ||||||||||
self.parachute_radius = parachute_radius | ||||||||||
if parachute_height is None: | ||||||||||
parachute_height = parachute_radius | ||||||||||
self.parachute_height = parachute_height | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. self.parachute_height = parachute_height or parachute_radius |
||||||||||
self.porosity = porosity | ||||||||||
|
||||||||||
alpha, beta = self.noise_corr | ||||||||||
self.noise_function = lambda: alpha * self.noise_signal[-1][ | ||||||||||
|
@@ -264,6 +289,9 @@ def to_dict(self, include_outputs=False): | |||||||||
"sampling_rate": self.sampling_rate, | ||||||||||
"lag": self.lag, | ||||||||||
"noise": self.noise, | ||||||||||
"parachute_radius": self.parachute_radius, | ||||||||||
"parachute_height": self.parachute_height, | ||||||||||
"porosity": self.porosity, | ||||||||||
} | ||||||||||
|
||||||||||
if include_outputs: | ||||||||||
|
@@ -290,6 +318,9 @@ def from_dict(cls, data): | |||||||||
sampling_rate=data["sampling_rate"], | ||||||||||
lag=data["lag"], | ||||||||||
noise=data["noise"], | ||||||||||
parachute_radius=data.get("parachute_radius", 1.5), | ||||||||||
parachute_height=data.get("parachute_height", None), | ||||||||||
porosity=data.get("porosity", 0.0432), | ||||||||||
) | ||||||||||
|
||||||||||
return parachute |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Question: how should the Monte Carlo simulations be affected by this PR? |
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -1434,7 +1434,16 @@ def add_free_form_fins( | |||||||||
return fin_set | ||||||||||
|
||||||||||
def add_parachute( | ||||||||||
self, name, cd_s, trigger, sampling_rate=100, lag=0, noise=(0, 0, 0) | ||||||||||
self, | ||||||||||
name, | ||||||||||
cd_s, | ||||||||||
trigger, | ||||||||||
sampling_rate=100, | ||||||||||
lag=0, | ||||||||||
noise=(0, 0, 0), | ||||||||||
parachute_radius=1.5, | ||||||||||
parachute_height=None, | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I just noticed it now... Since it is the Parachute class, there's no need to specify this is the parachute radius or the parachute height.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was looking in other Rocket class methods such as add_trapezoidal_fins and set_rail_buttons, and both use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also, since we already use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would like to hear a third opinion here, maybe @MateusStano or @phmbressan . Based on my experience, I don't think parachute_radius is a good idea, it sounds verbose to me. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think the simpler naming is better. If the documentation is there we can rely on that |
||||||||||
porosity=0.0432, | ||||||||||
): | ||||||||||
"""Creates a new parachute, storing its parameters such as | ||||||||||
opening delay, drag coefficients and trigger function. | ||||||||||
|
@@ -1493,16 +1502,36 @@ def add_parachute( | |||||||||
The values are used to add noise to the pressure signal which is | ||||||||||
passed to the trigger function. Default value is (0, 0, 0). Units | ||||||||||
are in pascal. | ||||||||||
parachute_radius : float, optional | ||||||||||
Radius of the inflated parachute. Default value is 1.5. | ||||||||||
Units are in meters. | ||||||||||
parachute_height : float, optional | ||||||||||
Height of the inflated parachute. Default value is the radius parachute. | ||||||||||
Units are in meters. | ||||||||||
porosity : float, optional | ||||||||||
Porosity of the parachute material, which is a measure of how much air can | ||||||||||
pass through the parachute material. | ||||||||||
Default value is 0.0432 (for consistency with previous versions). | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you define more precisely what porosity is? Something like: "The ratio of the area of the porous structure to the total area of the canopy" (I don't know if this is the correct definition in our case, just an example) |
||||||||||
|
||||||||||
Returns | ||||||||||
------- | ||||||||||
parachute : Parachute | ||||||||||
Parachute containing trigger, sampling_rate, lag, cd_s, noise | ||||||||||
and name. Furthermore, it stores clean_pressure_signal, | ||||||||||
Parachute containing trigger, sampling_rate, lag, cd_s, noise, radius, | ||||||||||
height, porosity and name. Furthermore, it stores clean_pressure_signal, | ||||||||||
noise_signal and noisyPressureSignal which are filled in during | ||||||||||
Flight simulation. | ||||||||||
""" | ||||||||||
parachute = Parachute(name, cd_s, trigger, sampling_rate, lag, noise) | ||||||||||
parachute = Parachute( | ||||||||||
name, | ||||||||||
cd_s, | ||||||||||
trigger, | ||||||||||
sampling_rate, | ||||||||||
lag, | ||||||||||
noise, | ||||||||||
parachute_radius, | ||||||||||
parachute_height, | ||||||||||
porosity, | ||||||||||
) | ||||||||||
self.parachutes.append(parachute) | ||||||||||
return self.parachutes[-1] | ||||||||||
|
||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -767,7 +767,18 @@ def __simulate(self, verbose): | |||||||||
callbacks = [ | ||||||||||
lambda self, parachute_cd_s=parachute.cd_s: setattr( | ||||||||||
self, "parachute_cd_s", parachute_cd_s | ||||||||||
) | ||||||||||
), | ||||||||||
lambda self, | ||||||||||
parachute_radius=parachute.parachute_radius: setattr( | ||||||||||
self, "parachute_radius", parachute_radius | ||||||||||
), | ||||||||||
lambda self, | ||||||||||
parachute_height=parachute.parachute_height: setattr( | ||||||||||
self, "parachute_height", parachute_height | ||||||||||
), | ||||||||||
lambda self, parachute_porosity=parachute.porosity: setattr( | ||||||||||
self, "parachute_porosity", parachute_porosity | ||||||||||
), | ||||||||||
] | ||||||||||
self.flight_phases.add_phase( | ||||||||||
node.t + parachute.lag, | ||||||||||
|
@@ -1013,7 +1024,25 @@ def __simulate(self, verbose): | |||||||||
lambda self, | ||||||||||
parachute_cd_s=parachute.cd_s: setattr( | ||||||||||
self, "parachute_cd_s", parachute_cd_s | ||||||||||
) | ||||||||||
), | ||||||||||
lambda self, | ||||||||||
parachute_radius=parachute.parachute_radius: setattr( | ||||||||||
self, | ||||||||||
"parachute_radius", | ||||||||||
parachute_radius, | ||||||||||
), | ||||||||||
lambda self, | ||||||||||
parachute_height=parachute.parachute_height: setattr( | ||||||||||
self, | ||||||||||
"parachute_height", | ||||||||||
parachute_height, | ||||||||||
), | ||||||||||
lambda self, | ||||||||||
parachute_porosity=parachute.porosity: setattr( | ||||||||||
self, | ||||||||||
"parachute_porosity", | ||||||||||
parachute_porosity, | ||||||||||
), | ||||||||||
] | ||||||||||
self.flight_phases.add_phase( | ||||||||||
overshootable_node.t + parachute.lag, | ||||||||||
|
@@ -1961,22 +1990,28 @@ def u_dot_parachute(self, t, u, post_processing=False): | |||||||||
|
||||||||||
# Get Parachute data | ||||||||||
cd_s = self.parachute_cd_s | ||||||||||
parachute_radius = self.parachute_radius | ||||||||||
parachute_height = self.parachute_height | ||||||||||
porosity = self.parachute_porosity | ||||||||||
|
||||||||||
# Get the mass of the rocket | ||||||||||
mp = self.rocket.dry_mass | ||||||||||
|
||||||||||
# Define constants | ||||||||||
ka = 1 # Added mass coefficient (depends on parachute's porosity) | ||||||||||
R = 1.5 # Parachute radius | ||||||||||
ka = 1.068 * ( | ||||||||||
1 - 1.465 * porosity - 0.25975 * porosity**2 + 1.2626 * porosity**3 | ||||||||||
) | ||||||||||
# to = 1.2 | ||||||||||
# eta = 1 | ||||||||||
# Rdot = (6 * R * (1 - eta) / (1.2**6)) * ( | ||||||||||
# (1 - eta) * t**5 + eta * (to**3) * (t**2) | ||||||||||
# ) | ||||||||||
# Rdot = 0 | ||||||||||
|
||||||||||
# tf = 8 * nominal diameter / velocity at line stretch | ||||||||||
|
||||||||||
# Calculate added mass | ||||||||||
ma = ka * rho * (4 / 3) * np.pi * R**3 | ||||||||||
ma = ka * rho * (4 / 3) * np.pi * parachute_radius**2 * parachute_height | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The added mass calculation uses the full ellipsoid volume (4/3·π·a²·c) but the parachute is modeled as a hemispheroid; this should use half the volume (2/3·π·a²·c) to correctly compute added mass.
Suggested change
Copilot uses AI. Check for mistakes. Positive FeedbackNegative Feedback |
||||||||||
|
||||||||||
# Calculate freestream speed | ||||||||||
freestream_x = vx - wind_velocity_x | ||||||||||
|
@@ -1987,12 +2022,12 @@ def u_dot_parachute(self, t, u, post_processing=False): | |||||||||
# Determine drag force | ||||||||||
pseudo_drag = -0.5 * rho * cd_s * free_stream_speed | ||||||||||
# pseudo_drag = pseudo_drag - ka * rho * 4 * np.pi * (R**2) * Rdot | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These comments??? Should we start using it?
Suggested change
|
||||||||||
Dx = pseudo_drag * freestream_x | ||||||||||
Dx = pseudo_drag * freestream_x # add eta efficiency for wake | ||||||||||
Dy = pseudo_drag * freestream_y | ||||||||||
Dz = pseudo_drag * freestream_z | ||||||||||
ax = Dx / (mp + ma) | ||||||||||
ay = Dy / (mp + ma) | ||||||||||
az = (Dz - 9.8 * mp) / (mp + ma) | ||||||||||
az = (Dz - mp * self.env.gravity.get_value_opt(z)) / (mp + ma) | ||||||||||
|
||||||||||
if post_processing: | ||||||||||
self.__post_processed_variables.append( | ||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
having both
cds
andparachute_radius
? do you think we could possible calculate the cd based on these other parameters?