Skip to content

Follow-ups from the v0.1.0 release review #64

Description

@thc1006

Tracking issue for the smaller items that came out of reviewing the v0.0.3 release (#61). None of these were introduced by that PR; they are pre-existing and each one is a small, separate change. The pop-detection question is bigger and needs a decision, so it lives in its own issue.

An agent that never launches crashes at timeout

balloon_world.py leaves _rocket_flight as None until a launch action arrives, but the timeout branch calls post_process_simulation() and initialize_prints_plots() unconditionally:

if _timeout:
    logger.info("Terminated: Reached max time")
    self._rocket_flight.post_process_simulation()   # AttributeError when never launched

A competitor whose agent decides not to launch gets an AttributeError instead of a normal episode end. Fix is a None guard plus a full-episode test that steps with launch=False.

The first interval after launch can never register a pop

step() reads previous_rocket_position from _rocket_states at the top of the step, but on the launch step that array is still all-NaN from reset(); it is only filled from y_sol after step_simulation() runs. Every distance comparison against NaN is false, so that first sweep is skipped. The practical effect is small, since the rocket is still on the pad for that 0.01 s, but the fix is cheap: populate _rocket_states from the initial solution when the flight is created.

Package version does not match the release

pyproject.toml still declares version = "0.0.1" while the release is v0.0.3, so wheel metadata and importlib.metadata.version() report the wrong number. @zuorenchen the version bump is yours to decide since it is the release name.

Actuator dynamics ship untested

gimbal_time_constant, roll_torque_time_constant and throttle_time_constant are null in both scenarios, so the golden masters only prove that the new actuator API preserves the old no-dynamics trajectories. A focused test with non-null time constants would cover the feature itself: initial lag, convergence under a repeated command, how the rate limit and time constant compose, and reset behavior.

Two test files can skip silently instead of failing

test_pop_detection.py and test_sensor_determinism.py wrap numpy and the internal package imports in one try / except ImportError, so a renamed symbol or a broken internal import turns them into skips rather than failures. test_scenario0_regression.py already does this properly by guarding only import rocketpy. These are my own tests, so I will fix them.

Python 3.10 is claimed but never tested

requires-python = ">=3.10" while CI pins 3.14 in both jobs. Since competitors run this locally on their own machines, the supported floor matters. Either add 3.10 to a matrix or narrow requires-python to what is actually tested.

Already handled

The stale uv.lock (recording ActiveRocketPy 1.12.0 against a 1.13.0 submodule) is #62.

I can take the code fixes above; the version bump and the Python floor are calls for @zuorenchen.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions