Closes 443

When the events STAGE_SEPARATION and EJECTION_CHARGE are both triggered by
BURNOUT, both events occur simultaneously and either can be inserted
in EventQueue first.  If STAGE_SEPARATION is inserted first, the
filter in BasicEventSimulationEngine.java ignoring events from
components that are no longer attached to the rocket drops ignores
EJECTION_CHARGE.  If second stage IGNITION is triggered by
EJECTION_CHARGE it is filtered out, and second stage IGNITION fails to
happen.  This can be seen in the following snippet of a log file:

10592          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Handling event FlightEvent[type=BURNOUT,time=1.03,source=Body tube,data=B4]
10592          DEBUG [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine -  detected Motor Burnout for motor B4@ 1.03  on stage 1: Stage
10592          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=STAGE_SEPARATION,time=1.03,source=Stage,data=null]
10592          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = [FlightEvent[type=EJECTION_CHARGE,time=1.0311458852237796,source=Stage,data=B4], FlightEvent[type=ALTITUDE,time=1.0311458852237796,source=Rocket,data=[25.502739793351193;25.603323566419885]]]
10592          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Handling event FlightEvent[type=STAGE_SEPARATION,time=1.03,source=Stage,data=null]
10592          INFO  [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - ==>> @ 1.03115; from Branch: Sustainer ---- Branching: Stage ----

10593          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=EJECTION_CHARGE,time=1.0311458852237796,source=Stage,data=B4]
10593          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = [FlightEvent[type=ALTITUDE,time=1.0311458852237796,source=Rocket,data=[25.502739793351193;25.603323566419885]]]
10593          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Ignoring event from unattached componenent
10593          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=ALTITUDE,time=1.0311458852237796,source=Rocket,data=[25.502739793351193;25.603323566419885]]
10593          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = []
10593          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Handling event FlightEvent[type=ALTITUDE,time=1.0311458852237796,source=Rocket,data=[25.502739793351193;25.603323566419885]]
10593          TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Taking simulation step at t=1.0311458852237796 altitude 25.603323566419885
10593          TRACE [pool-4-thread-1] n.s.o.s.RK4SimulationStepper - Too small time step 0.0014030377018961126 (limiting factor 5), using 0.0025 instead.
10593          TRACE [pool-4-thread-1] n.s.o.s.RK4SimulationStepper - Thrust = 0.0

Note here that there was no IGNITION in the sustainer branch, and the
Thrust is 0.0 at the end of the snippet.

Moving the test for ignition events ahead of the filter assures the
IGNITION is scheduled, as seen in this log file snippet:

8994           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=BURNOUT,time=1.03,source=Body tube,data=B4]
8994           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = [FlightEvent[type=ALTITUDE,time=1.0302951181945657,source=Rocket,data=[25.478255057184594;25.5788943164009]]]
8994           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Handling event FlightEvent[type=BURNOUT,time=1.03,source=Body tube,data=B4]
8994           DEBUG [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine -  detected Motor Burnout for motor B4@ 1.03  on stage 1: Stage
8994           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=STAGE_SEPARATION,time=1.03,source=Stage,data=null]
8994           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = [FlightEvent[type=EJECTION_CHARGE,time=1.0302951181945657,source=Stage,data=B4], FlightEvent[type=ALTITUDE,time=1.0302951181945657,source=Rocket,data=[25.478255057184594;25.5788943164009]]]
8994           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Handling event FlightEvent[type=STAGE_SEPARATION,time=1.03,source=Stage,data=null]
8995           INFO  [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - ==>> @ 1.03030; from Branch: Sustainer ---- Branching: Stage ----

8995           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=EJECTION_CHARGE,time=1.0302951181945657,source=Stage,data=B4]
8995           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = [FlightEvent[type=ALTITUDE,time=1.0302951181945657,source=Rocket,data=[25.478255057184594;25.5788943164009]]]
8995           INFO  [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Queueing Ignition Event for:               Body tube/334ebb79 /   A8 - Armed @: 1.0302951181945657
8995           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Ignoring event from unattached componenent
8995           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=IGNITION,time=1.0302951181945657,source=Body tube,data=A8]
8995           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = [FlightEvent[type=ALTITUDE,time=1.0302951181945657,source=Rocket,data=[25.478255057184594;25.5788943164009]]]
8996           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Handling event FlightEvent[type=IGNITION,time=1.0302951181945657,source=Body tube,data=A8]
8996           INFO  [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine -   Igniting motor:               Body tube/334ebb79 /   A8 - Armed @1.0302951181945657
8996           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Obtained event from queue:  FlightEvent[type=ALTITUDE,time=1.0302951181945657,source=Rocket,data=[25.478255057184594;25.5788943164009]]
8996           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Remaining EventQueue = [FlightEvent[type=BURNOUT,time=1.7602951181945656,source=Body tube,data=A8]]
8996           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Handling event FlightEvent[type=ALTITUDE,time=1.0302951181945657,source=Rocket,data=[25.478255057184594;25.5788943164009]]
8996           TRACE [pool-4-thread-1] n.s.o.s.BasicEventSimulationEngine - Taking simulation step at t=1.0302951181945657 altitude 25.5788943164009
8996           TRACE [pool-4-thread-1] n.s.o.s.RK4SimulationStepper - Too small time step 0.0012514398786730699 (limiting factor 5), using 0.0025 instead.
8996           TRACE [pool-4-thread-1] n.s.o.s.RK4SimulationStepper - Thrust = 0.015609756097560644

Here, the IGNITION does take place, and Thrust is non-zero.
Displaying a plot of the flight, and saving CSV files, shows a normal
two-stage flight profile.

This commit does two things:

(1) adds a little more logging, in particular logging what event has been
    obtained from EventQueue and logging when that event is ignored.

(2) moves the motor ignition events test ahead of the filter, as
    described above.
This commit is contained in:
JoePfeiffer 2018-09-19 13:42:05 -06:00
parent 1448cde5aa
commit 7d4c73f32b

View File

@ -251,25 +251,8 @@ public class BasicEventSimulationEngine implements SimulationEngine {
log.trace("HandleEvents: current branch = " + currentStatus.getFlightData().getBranchName());
for (event = nextEvent(); event != null; event = nextEvent()) {
log.trace("EventQueue = " + currentStatus.getEventQueue().toString());
// Ignore events for components that are no longer attached to the rocket
if (event.getSource() != null && event.getSource().getParent() != null &&
!currentStatus.getConfiguration().isComponentActive(event.getSource())) {
continue;
}
// Call simulation listeners, allow aborting event handling
if (!SimulationListenerHelper.fireHandleFlightEvent(currentStatus, event)) {
continue;
}
if (event.getType() == FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT) {
RecoveryDevice device = (RecoveryDevice) event.getSource();
if (!SimulationListenerHelper.fireRecoveryDeviceDeployment(currentStatus, device)) {
continue;
}
}
log.trace("Obtained event from queue: " + event.toString());
log.trace("Remaining EventQueue = " + currentStatus.getEventQueue().toString());
// Check for motor ignition events, add ignition events to queue
for (MotorClusterState state : currentStatus.getActiveMotors() ){
@ -291,6 +274,25 @@ public class BasicEventSimulationEngine implements SimulationEngine {
}
}
// Ignore events for components that are no longer attached to the rocket
if (event.getSource() != null && event.getSource().getParent() != null &&
!currentStatus.getConfiguration().isComponentActive(event.getSource())) {
log.trace("Ignoring event from unattached componenent");
continue;
}
// Call simulation listeners, allow aborting event handling
if (!SimulationListenerHelper.fireHandleFlightEvent(currentStatus, event)) {
continue;
}
if (event.getType() == FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT) {
RecoveryDevice device = (RecoveryDevice) event.getSource();
if (!SimulationListenerHelper.fireRecoveryDeviceDeployment(currentStatus, device)) {
continue;
}
}
// Check for stage separation event
for (AxialStage stage : currentStatus.getConfiguration().getActiveStages()) {