Changelog¶
0.6.1 (2026-10-21)¶
Bug Fixes¶
- peers: a run keeps PX4's store across a restart unless asked to start clean (#355) (9463732), closes #354
0.6.0 (2026-10-20)¶
Features¶
- ci: a labelled PR touching a peer's folder flies that peer real (#337) (b9d4eea), closes #162
- config: a catalog vehicle entry composes a base vehicle and its layers (#346) (877eae2), closes #331
- peers: a declared peer's link reads the signals it names (#347) (03f82ae), closes #341
- peers: the run joins a declared peer and PX4 SITL over a serial link it owns (#345) (60949e1), closes #342
- vehicle: each rotor flies its own propeller values, not one shared set (#348) (f92a746), closes #185
Bug Fixes¶
0.5.0 (2026-10-19)¶
⚠ BREAKING CHANGES¶
- peers: a run's folder holds
px4_sitl/console.logandpx4_sitl/<date>/<time>.ulgin place ofpx4.logandulog/, andkit/console.login place ofkit.log.
Features¶
- peers: a peer states how it keeps time, and a run that can't keep it fails first (#336) (317ebfb), closes #325
- peers: a project's container peer subclasses the public container peer (#333) (9cab39e), closes #306
Bug Fixes¶
0.4.0 (2026-10-15)¶
⚠ BREAKING CHANGES¶
- NewtonPhysics takes no step_actuators, and the examples library drops Rotors and rigid_body_wrench_batched. The nexus-rl GoTo env still imports the latter until it moves to the articulated plant.
- core: a run with no verdict raises the public RunError (#324)
- build: NexusPx4API is retired for NexusPx4API_1, which authors no airframe; nexus:airframe is an attribute of NexusPx4SitlAPI, declared on a Scope of its own, and a layer drops the peer by deactivating that Scope. build_from_launch takes no peers mapping, the receipt's px4 field is gone, Px4MavlinkController takes the run's instance in place of port and target_system, and KitPeer takes its pin in place of an image.
Features¶
- api: a run writes its files to the folder the caller names (#323) (2a6617b), closes #320
- assets: s3:// assets come through boto3 under nexus-uav[s3] (#326) (a4d9d62), closes #322
- build: every role and peer builds from the vehicle's USD (#315) (46764ac), closes #261
- core: a run with no verdict raises the public RunError (#324) (2c2c1d9), closes #321
- every controller flies one plant on the vehicle's Newton motors (#319) (1c6afe6)
0.3.0 (2026-10-13)¶
⚠ BREAKING CHANGES¶
- catalog: an installed package adds a catalog layer and its pin files (#313)
Features¶
0.2.0 (2026-10-13)¶
⚠ BREAKING CHANGES¶
- peers: PX4_DIR goes; set NEXUS_PX4_SITL_REF to a checkout's absolute path instead. A project's nexus.px4.ref becomes nexus.px4_sitl.ref, and the old name now fails the run.
Features¶
Bug Fixes¶
- loop: a run whose PX4 never starts lockstep fails (#308) (b6e5b57), closes #129
- px4: a run's artifacts name the ULog PX4 wrote for that run (#310) (dc13009), closes #145
0.1.0 (2026-10-12)¶
⚠ BREAKING CHANGES¶
- the import package is nexus_uav and the distribution nexus-uav.
- sensors: every sensor decimates by one due-time rule (#294)
- api: History.latest() is gone, and Signal.read gives a struct instance or an array without the leading axis.
- sensors: Component.connect takes the links of the peers the class requires; SensorRun, Site and the scene's origin reader are gone, and a sensor's class takes the model and its site.
- scene: --geo, Sim(geo=), LaunchConfig.set_geodetic_origin and the catalog's and receipt's geodetic_origin are gone, and a catalog scene names its USD file. An override layer moves a scene's origin.
- recording: Sim and Sim.from_orchestrator take no observe argument.
- sensors: Px4MavlinkController takes no gps_rate_hz; the GPS receiver's nexus:rate sets how often HIL_GPS goes out.
- nexus_sim.Measurement is gone, and a controller's exchange takes (t, timeout).
- a component schema that includes no role schema, or two, fails the build. A project's own schema includes one, such as NexusSensorRoleAPI.
- a vehicle declares NexusPx4API and NexusPx4SitlAPI on a Scope under its root prim, named Controller by convention; a vehicle that declares them on its root prim fails the build.
- Measurement has no state field; an estimator's estimate signal carries the vehicle's state.
- each concept has one word, defined once on a Concepts page (#251)
- Sim.controller is gone; a flight reads a component it built from the object it holds.
- the hand-run ground stack and --stream go (#242)
- packaging: import nexus_sim, not nexus.
- guidance: Sim and Sim.from_orchestrator take no reached_m, final_hold_s or operator; a flight passes guidance= and reads sim.guidance.
- px4: a script opens OffboardClient on the run's port map (#204)
- actuators: the actuator seam splits into a command seam and a force seam (#205)
- config: LaunchConfig loses six fields, and runtime.device rejects a device ordinal such as cuda:0.
- actuators: a vehicle USD declares each rotor's propeller with NexusPropellerAPI on the rotor's rigid body. A vehicle that authors propeller:* attributes on its rotor joints no longer builds.
- build: --px4, --px4-instance, Sim(px4=, px4_instance=), LaunchConfig.peers, Peers and Px4Peer are gone. A vehicle declares its PX4 SITL peer with NexusPx4SitlAPI, and a layer drops it to fly an external autopilot.
- config: a catalog with a defaults block no longer loads, and Sim and nexus run require a vehicle and a scene.
- core: Sim(control=), --control, LaunchConfig.control and set_control, and the catalog's px4 field are gone. A vehicle declares its controller in its USD.
- core: nexus.EnvSample is no longer exported.
- cli: --runtime leaves the command-line tool, LaunchConfig's runtime.backend and the empty isaacsim extra go, the isaacsim compose service and its image go, and nexus script runs only Kit-only asset scripts in the Kit image, with no nexus code inside.
- config: ship two Astro Max vehicles in the catalog (#4)
Features¶
- a component with no geometry sits on a scope prim of its own (#259) (1cbc90f), closes #258
- actuators: each rotor declares its propeller on its rigid body (#166) (2668f83), closes #32
- actuators: the actuator seam splits into a command seam and a force seam (#205) (1c9fb2c), closes #169
- api: a script reads a signal's live value by its path, and the sim time (#287) (8d3e5e4), closes #280
- api: export the component, registry and peer contracts (#277) (2ce4b9b), closes #44
- api: the RL project imports only the public surface (#279) (80d4036), closes #53
- assets: a photoreal catalog scene with static geometry (#153) (cda6cc7), closes #101
- build: a run composes an override layer, and the peer flags go (#160) (b0e586a), closes #156
- components declare typed signals, and the builder wires them once (#249) (eafeb68), closes #241
- config: a project catalog extends the bundled one (#17) (b520f74)
- config: a run names its vehicle and scene, and the catalog's defaults go (#154) (e3fc6f0), closes #34
- config: ship two Astro Max vehicles in the catalog (#4) (32e1b2f), closes #3
- core: scene ambient values resolve at build, and the Environment seam goes (#117) (087085c), closes #38
- core: the loop runs each component's work as device and host stages (#120) (5180cd5), closes #39
- core: the vehicle USD declares its controller, and --control goes (#151) (4faa4d1), closes #33
- docs: the Benchmarking page plots each gated metric over the commits (#201) (1ded2b9), closes #81
- each component's schema states its role (#260) (cb4fa3e), closes #257
- each sensor's output is a signal of its own type, cameras included (#256) (10430fb), closes #149
- guidance and control read an estimator's estimate (#252) (b4443f7), closes #228
- guidance: guidance is a loop seam, the Operator protocol goes (#203) (d825885), closes #210
- logging: an entity path names its process, component and instance (#193) (4d59000), closes #47
- loop: each tick has one exact sim time, and its rows describe it (#290) (5122ce1), closes #229
- peers: every peer ships a fake that speaks its link (#155) (0125759), closes #113
- px4: a script opens OffboardClient on the run's port map (#204) (f2ff238), closes #194
- px4: PX4 is a peer the run starts, built from its controller's pin (#119) (618fb70), closes #37
- recording: the plant writes signals, and every history reads as records (#282) (149be06), closes #275
- recording: the Recorder keeps each signal's history, and no component records itself (#273) (fd098f7), closes #250
- recording: the recording holds every row, written from the Recorder's histories (#264) (722ff3b), closes #111
- rendering: the Kit peer runs NVIDIA's image as pulled (#126) (32ebe1c), closes #124
- scene: a scene's PhysicsScene prim holds its geodetic origin (#284) (9dca7ac), closes #281
- sensors: a sensor's prim is a Newton site, and SensorRun goes (#283) (35b16ff), closes #278
- sensors: sensors are declared by API schemas in the vehicle USD (#180) (1eed48b), closes #9
- sensors: the IMU honours its prim's full transform on any body (#212) (c7bf2bd), closes #52
- sensors: the in-graph sensors sample at their declared rates (#223) (9d74670), closes #51
- the hand-run ground stack and --stream go (#242) (26c6b61), closes #42
- usd: a schema plugin and an open registry for components (#140) (8d6d494), closes #31
- usd: schemas evolve by version, and the build fails an unknown one (#176) (c79c3f2), closes #114
Bug Fixes¶
- assets: a scene re-root keeps material bindings and shader links (#128) (1f238f1), closes #65
- ci: a runner cancelled mid-start no longer outlives its run (#136) (a2b0d9b), closes #78
- ci: an upload run holds back a red flight's docs recording (#197) (2e439e4), closes #95
- ci: gate the rl leg by the kind of quantity each check reads (#68) (ab8dc8a), closes #15
- ci: let an approved fork run check out the fork's code (#24) (7ab3a28)
- ci: lint reds a pull request that stales nexus-rl/uv.lock (#207) (a984b80), closes #202
- ci: the bench feed reads under a ListBucket grant, and the runner says so (#138) (80bc50c), closes #116
- ci: the release pull request keeps both locks fresh (#183) (f63336b)
- cli: launch the Kit container from an installed package (#22) (821a007), closes #12
- config: the receipt records only what a run applies (#184) (02ea594), closes #173
- docs: the docs and the config name only what the tree holds (#225) (2f6c819), closes #220
- examples: goto_policy fetches its hosted policy from the catalog base (#67) (1445f6a), closes #66
- examples: the acados extra names only packages PyPI serves (#192) (872045d), closes #182
- examples: the PX4 gate forgives a logger cap line for any topic (#141) (3068275), closes #137
- notices: name every file a foreign header marks; goto_env is Apache-2.0 (#227) (dc292cb), closes #219
- orchestrator: capture the host-exchange graph before PX4 dials in (#61) (94009bc), closes #26
- packaging: an installed nexus-sim pins the warp-lang CI flies (#127) (cec9165), closes #62
- packaging: the wheel and sdist ship no CLAUDE.md (#240) (7613209), closes #217
- px4: a late PX4 dial-in logs no ekf2 missing data line (#60) (cab8ef9), closes #57
- px4: allowlist the missing-parameter message, not [param] (#23) (eb78bb9), closes #21
- sensors: every sensor decimates by one due-time rule (#294) (f964a1b), closes #263
Performance Improvements¶
- tests: fixture-vehicle tests share their builds, and the Kit fake stops at once (#232) (9224844), closes #209
Miscellaneous Chores¶
Code Refactoring¶
- each concept has one word, defined once on a Concepts page (#251) (6d50ebb), closes #247
- packaging: the import package is nexus_sim, imported as nx (#230) (c77617c), closes #216
Build System¶
Changelog¶
All notable changes to the project are documented here. This file is maintained automatically by release-please from Conventional Commit messages on main; release entries are prepended below as versions are tagged.