Parachute trigger comparison
54 lignes
for parachute in node.parachutes:
for parachute in overshootable_node.parachutes:
# Calculate and save pressure signal
# Calculate and save pressure signal
(
(
noisy_pressure,
noisy_pressure,
height_above_ground_level,
height_above_ground_level,
) = self.__calculate_and_save_pressure_signals(
) = self.__calculate_and_save_pressure_signals(
parachute, node.t, self.y_sol[2]
parachute,
overshootable_node.t,
overshootable_node.y_sol[2],
)
)
# Check for parachute trigger
if not parachute.triggerfunc(
if not parachute.triggerfunc(
noisy_pressure,
noisy_pressure,
height_above_ground_level,
height_above_ground_level,
self.y_sol,
overshootable_node.y_sol,
self.sensors,
self.sensors,
):
):
return False # Early exit: parachute not deployed
return False # Early exit, parachute not triggred
# Remove parachute from flight parachutes
# Remove parachute from flight parachutes
self.parachutes.remove(parachute)
self.parachutes.remove(parachute)
# Create phase for time after detection and before inflation
# Create phase for time after detection and before inflation
# Must only be created if parachute has any lag
# Must only be created if parachute has any lag
i = 1
i = 1
if parachute.lag != 0:
if parachute.lag != 0:
self.flight_phases.add_phase(
self.flight_phases.add_phase(
node.t,
overshootable_node.t,
phase.derivative,
phase.derivative,
clear=True,
clear=True,
index=phase_index + i,
index=phase_index + i,
)
)
i += 1
i += 1
# Create flight phase for time after inflation
# Create flight phase for time after inflation
callbacks = [
callbacks = [
lambda self, parachute_cd_s=parachute.cd_s: setattr(
lambda self, parachute_cd_s=parachute.cd_s: setattr(
self, "parachute_cd_s", parachute_cd_s
self, "parachute_cd_s", parachute_cd_s
)
)
]
]
self.flight_phases.add_phase(
self.flight_phases.add_phase(
node.t + parachute.lag,
overshootable_node.t + parachute.lag,
self.u_dot_parachute,
self.u_dot_parachute,
callbacks,
callbacks,
clear=False,
clear=False,
index=phase_index + i,
index=phase_index + i,
)
)
# Rollback history
self.t = overshootable_node.t
self.y_sol = overshootable_node.y_sol
self.solution[-1] = [overshootable_node.t, *overshootable_node.y_sol]
# Prepare to leave loops and start new flight phase
# Prepare to leave loops and start new flight phase
overshootable_nodes.flush_after(overshootable_index)
phase.time_nodes.flush_after(node_index)
phase.time_nodes.flush_after(node_index)
phase.time_nodes.add_node(self.t, [], [], [])
phase.time_nodes.add_node(self.t, [], [], [])
phase.solver.status = "finished"
phase.solver.status = "finished"
# Save parachute event
self.parachute_events.append([self.t, parachute])
self.parachute_events.append([self.t, parachute])
return True
return True
return False
return False