-
Pre-release versioning terminology:
-alpha.N→-dev.N. The
development line ondevelopnow usesX.Y.Z-dev.Npre-release versions
(first:0.21.0-dev.0) instead ofX.Y.Z-alpha.N. The
check-version-incrementPR gate accepts exactlydev,beta,rc
(orderingdev < beta < rc < release); the main→develop sync workflow
rolls develop forward to the next minor's-dev.0after a release. Docs,
skills, and the PR template were updated to match. Existing-alpha.N
versions in git history and in declared module-compat ranges remain valid
historical references. -
Single, revamped repo README. The repo now has one
README.md(at the
root —docs/README.mdwas removed), rewritten around the redesigned docs
home page: quickstart, one-command bring-up, sim-to-real parity, CI flight
campaigns, and agent-driven workflows. -
Module-catalog sync automation + drift alarm. Registering a module is
two merges (registry PR to
airstack-modules-index- trunk fixture/catalog sync), and the docs deploy regenerates the
published catalog from the live registry — so a missed half used to
drop the module from the site silently. Now the develop docs deploy
raises adocs-catalog-driftissue whenever the committed catalog and
the live registry disagree, and the newsync-modules-indexworkflow
(daily + manual dispatch) opens the trunk sync PR automatically
(.github/workflows/scripts/registry_sync.py).
- trunk fixture/catalog sync), and the docs deploy regenerates the
-
Trustworthy system-test outcomes. A red system-tests run now always
means the code under test got worse, never that CI infrastructure hiccuped:
run_meta.json(schema v2) classifies every failure as
assertion/infrastructure/collection/ci_integrity, and CI fails
only on those — comparable numeric metric deltas (Hz, CPU, error metrics)
are advisory in the report and no longer fail the PR. Metric
comparisons only happen between fingerprint-identical campaigns (same
tests and same behavior-changing CLI config: sim, robot count,
trajectories, velocities, tolerances), with the baseline selected from
recent base-branch artifacts by fingerprint instead of "newest artifact of
any shape". Bring-up/readiness failures fail fast when the simulator
process dies (instead of burning the full/clocktimeout on an ephemeral
GPU pod) and capture a bounded, secret-freediagnostics/bundle before
the pod is destroyed. Maintainers can dispatch focused flight campaigns
(trajectory_types,takeoff_velocities) fromworkflow_dispatch. New
airstack up --config-only: dry-run restricted to logical launch-config
contracts (no Docker/credentials/image/submodule prerequisites). -
CI un-redded: Metrics Report and Unit Tests fixed. Every PR had been
failing since ~2026-08-20 for reasons unrelated to the code under test.
The system-tests Metrics Report job installed onlytabulate, so
tests/parse_metrics.py(which imports thetests/harnesspackage)
crashed withModuleNotFoundError: No module named 'yaml'— and the crash
was misreported as "Metric regression detected"; the job now installs
tests/requirements.txt, and the regression verdict additionally requires
a writtenreport.mdso a parser crash can never masquerade as a metric
regression. The Unit Tests workflow ran thetests/meta/contract
suite on a checkout with no submodules and noomni_pass.env, so every
airstack up --dry-run --sim isaaccontract hard-failed preflight and the
docs-catalog contract missed the submodule-resident vdb_mapping_ros2
README; the workflow now checks out submodules recursively and provisions
the same guestomni_pass.envstub thatmodule-system-tests.ymluses
(preflight itself stays strict). -
New reference stack
full_mighty+ registeredmightymodule. The
MIGHTY Hermite-spline local planner (MIT ACL, RA-L 2026) with its
acl-mapping voxel world model and a NavigateTask/trajectory_controller
bridge, packaged as the external
asm_mighty module (pinned at
v0.1.1 in the stack'smodules.repos; repo private until the AirStack
agent study concludes).full_mighty
isfull_defaultwith only the local-planner include swapped — the
module-swap demonstration for the modular architecture. Registered in the
module catalog; validated on Isaac Sim (44/44
vendored gtests, empty-world route flight, 7/7 pillar-field traversals,
5/5 judged obstacle-route flights at 1.59–1.65 m min clearance vs a 1.0 m
gate). -
Fixed: the docs search dropdown rendered behind the nav-tabs bar and the
version-selector text (custom z-indexes inside the header's stacking
context); the search subtree is now lifted above both.
Documentation overhaul (Diátaxis restructuring). The docs site was
audited against the Diátaxis framework and
reorganized; page URLs are preserved (moves are covered by redirects):
- The nav is now organized by document kind — Tutorials / How-to Guides /
Reference / Concepts tabs — replacing the difficulty-tier
("Beginner/Intermediate/Advanced Tutorials") buckets, which contained no
tutorials. The doc-authoring standards (Documentation Guide, mkdocs
skills) now prescribe the quadrant taxonomy and include a decision tree. - 18 verified doc/code mismatches fixed, including: a phantom
--recreateflag and missing--scenein the CLI reference; phantom
ROBOT_LAUNCH_PACKAGE/ROBOT_LAUNCH_FILEenv vars (real:LAUNCH_PACKAGE);
nonexistentairstack_msgs/TrajectorySegment/TrajectoryOverridetypes in
doc templates (real:TrajectoryXYZVYaw); the MS-AirSim tmux window
ordering (bridges launch before PX4) and MAVLink port math; the Getting
Started Foxglove step (layout now auto-seeds; manual import retired). - Removed superseded pages with redirects: the Ascent-era scene-setup pair,
the pre-harness testing-frameworks page, the orphaned tutorials index and
two stale duplicate pages (development_environment, airstack-cli index).
The git-hooks docker-versioning READMEs are now deprecation notices — the
hook they described conflicts with the semvercheck-version-increment
gate (note:airstack config git-hooksstill installs it; CLI removal is
a follow-up). - Pages that documented never-built or fabricated behavior were rewritten
from the code: global planning (the unimplemented Global-Manager/
PlanRequest protocol is gone), the robot interface page (state flows via
odometry_conversion), robot configuration, HITL (now uses the
gcs-realhitlprofile and Foxglove verification), rosbags, and the
robot-side data-offloading page (now points at the storage-tools
workflow). - Hybrid pages split by audience:
system_architecture.md(explanation
core; drifted topic tables replaced with links into the interface
conventions spec), CI/CD (new Using CI how-to), GCS Foxglove (new
Extending the Visualizer), Isaac Sim docker (new Container
Workflows). Duplicated hot tables (topics, CLI flags, pytest marks,
requirements) now live in one canonical home each. - Previously off-site references added to the nav: the
vehicle.yamland
module.yamlschemas, local calibration contract, the RViz tasks/waypoint
panel manuals, the LiDAR point-cloud filter README, and the OSMO lab-admin
guide. New reference pages: the complete.envschema, the
airstack_msgsinterface reference, the trajectory-library YAML format,
and a supported-platform matrix. New/rewritten onboarding: Deploying to
Hardware and Operating the GCS. - The Interface Conventions Specification was bumped to v1.0.1: §8 now
lists all eighttask_msgsactions (addedtasks/coverageand
tasks/chat, both defined with no shipped executor). - Six new how-to guides: Adding a State Estimator, Adding a Planner,
Creating a Multi-Agent Coordination Algorithm (grouped under a new
How-to → Autonomy section), Creating a Custom Stack Topology, Adding a
Vehicle Type/Unit/Platform, and Getting the Most out of Your Coding
Agent (the feature-notebook workflow). Each presents the in-tree
package vsairstack module create --in-treemodule-scaffolding
choice. The Concepts tab now sits directly after Tutorials, and the
UE→Isaac export tutorial was refreshed (new walkthrough video, export
as Z-up in meters, note that UE Decals — paint markings, dirt,
puddles — do not export). - Five new beginner tutorials completing the learning path: Fly a Mission
from the GCS, Change a Parameter (the edit→relaunch loop; config YAML is
symlink-installed from the bind-mounted source, so no rebuild), Write
Your First Module (airstack module create --in-treescaffold, with a
fix-it note for the scaffold's double-namespace stub), Your First Fleet
(two-robot fleet file, per-robot Foxglove tabs), and Build and Fly Your
Own Scene (GUI stage → scene catalog →--sceneflight → baked
*.scene.usd). New how-to: Adding a Controller (verified
trajectory_controller → pid_controller → interface command chain);
Adding a Planner expanded into Adding a World Model and Planner
(local world-model/planner matched pairs vs the spec'd global map
interchange).
This release restructures AirStack from a monolith into modules,
stacks, and fleets, implementing
RFC #379 (Modular AirStack)
scales 1–2 of
RFC #380 (Heterogeneous AirStack),
and the stack-folder anatomy of
RFC #385 (Directory Atlas).
Feature docs deliberately cite none of these — the design sources live here:
- Modules are thin external repos with a small
module.yaml, pulled on
demand:airstack module add <url> --version <pin>. Three capabilities
were extracted from trunk into new repos:
asm_macvo (with its torch/TensorRT
stack moved out of the base robot image — 17.1 GB → ~6 GB, −65%),
asm_optitrack (including the
Isaac Sim NatNet emulator), and
asm_dfm2_disturbances.
The registry lives at
castacks/airstack-modules-index. - Stacks (
stacks/) are self-contained topology folders — pinned
modules.repos, plain XML entry launch files, and a CI-observed
wiring.mdgraph baseline. Wiring that used to be spread across per-layer
*_bringuppackages (local_bringup,onboard_all, and the
local*.launch.xmlvariant files) now lives in one place: the selected
stack's entry launch file. - Module provenance: asm_dfm2_disturbances originates from the DFM2
("don't fool me twice") AirStack fork, hand-built as the pilot module
before the tooling existed (its FRICTION_LOG.md records every manual
step; the port dropsomni.isaac.dynamic_controlin favor of the PhysX
simulation interface). asm_optitrack was extracted from the trunk
OptiTrack PR series (#359/#374/#375/#376) with git history preserved; its
unit/integration/e2e tests run in the module's own CI. - Fleets (
config/fleets/) declare who exists, which vehicle, which
stack, and which ground hosts run split-stack halves:
airstack up --fleet <name>.
Launch-path changes (breaking)
-
AUTONOMY_ROLEis removed. The env-var role dispatch
(full/onboard/offboard) is gone; a setAUTONOMY_ROLEis a preflight
hard error (as is setting it alongside--stack, which previously let the
stack silently win). Stacks are the only dispatch:airstack up --stack <name>[:<entry>], defaulting tofull_default. The per-role launch trees
(onboard_all/,onboard_local_offboard_global/) are deleted, the
wrap-then-flatten migration is complete (every reference stack composes
flat module-launch includes; the launch-lint allowlist is down to the two
deliberately wrapped blocks:interface.launch.pyand the DDS-router/
gossip helpers). Migration map:Before Now no role set / AUTONOMY_ROLE=fullfull_default(default; machine-proven graph-identical)full+local_droan_cpu.launch.xmlvariant--stack full_droan_cpu(variant file deleted; wiring captured from it before deletion)local_macvo_obstacle_avoidance.launch.xmlvariant--stack full_macvo— the variant was broken three ways (unprefixed args silently ignored, stale disparity topic,launch_macvonever enabled); the stack fixes all threeAUTONOMY_ROLE=onboard(no split)--stack lite_default(on the desktop profile the onboard role was unreachable anyway —robot-desktophardcodedfull)onboard/offboardsplit pair--stack lite_offload_global:onboard/:offboard -
The split onboard/offboard deployment is now the
lite_offload_global
stack (:onboard/:offboardentries) bridged per itsbridge.yaml;
the DDS-router config is generated bytools/gen_dds_router.pyrather
than hand-maintained. The generated bridge deliberately drops the legacy
split'sset_trajectory_modecrossing (control-mode topics may not cross
a bridge —airstack doctorhard gate). -
Module launch files are remap-free and declare prefixed, described
arguments with canonical defaults; generically named arguments (like
config_file) were renamed with per-module prefixes because ROS 2 launch
configurations are global across includes. -
Shared DDS-router configs moved out of the per-role
onboard_all/tree up
toautonomy_bringup/config/. -
OptiTrack activation changed: trunk's
overrides/isaac-optitrack-simulation.envand theLAUNCH_NATNETtoggle
are gone (a setLAUNCH_NATNETdraws a preflight warning). Mocap is
brought up by a stack that includesnatnet_ros2unconditionally — the
asm_optitrack module'stest_stack/is the reference. -
SKIP_MACVO/SKIP_TENSORRTbuild args removed fromDockerfile.robot
along with the payload they gated; MAC-VO deps enter an image only via
airstack module lock --build.stacks/full_macvoincludes the module's
ownmacvo.launch.xml(the in-treeperception/macvo_ros2copy is
deleted; the module preserves its git history, and fixes the previously
hardcodedcamera_infosubscription to honor its topic parameter).
Added
airstack up --stack <name>[:<entry>]stack dispatch with 5 reference
stacks understacks/(full_default,full_droan_cpu,full_macvo,
lite_default,lite_offload_global), each carrying pinned
modules.reposand a CI-observedwiring.mdgraph baseline- Module CLI —
airstack module add <url> --version <tag|sha>(branches
refused; local paths allowed),list|sync|remove|create --in-tree|doctor,
workspace overlay of module packages, and auto-generated module compose
overrides included byairstack up; Docker module layers composed via
modules.lock(airstack module lock --build) - Fleet system:
airstack up --fleet <name>driven by
config/fleets/*.yaml(identity, vehicle fromconfig/vehicles/, stack
selection, spawns) withhosts:split-stack placement onto ground hosts;
airstack fleet list|generateper-robot compose for heterogeneous fleets;
airstack syncreconcilesairstack.yaml(modules, external stack repos,
fleet validation) airstack doctor [--live|--snapshot] [--stack NAME]— observe-and-report
checks with exactly two hard gates (module dependency-conflict gate;
bridge gate: no control-setpoint / trajectory-group topics may cross a
split-stack bridge);--livediffs the RUNNING ROS graph against the
stack's committedwiring.mdairstack stack list|new <src> <dst>|diff <a> <b>(diff compares
generated wiring, not launch XML)tests/meta/contract-test tier (unit mark) pinning the CLI/docs/stack
contracts, plus thewiringsystem-test mark: an observed wiring snapshot
of the running graph drift-checked against the stack's committed
stacks/<name>/wiring.md- Split-stack bridging:
stacks/lite_offload_global/bridge.yamlexplicitly
lists every boundary crossing andtools/gen_dds_router.pygenerates the
DDS-router config from it deterministically (--checkenforces the bridge
hard gate) - New docs: Modules, Stacks, Fleets, Module CI guides, the generated
Module & Stack Catalog marketplace, and the Modular AirStack Walkthrough - Intent flags on
airstack up—--sim isaac|airsim|simple,--robots N,
--headless,--play/--no-play,--no-autolaunch,--wait,
--dry-run— deriving the coordinated env-var sets as exported leaf
values, with a resolved-config banner and a per-run
.airstack/runs/<ts>/effective_config.envdump; contract-tested airstack up --scene <shortname>: simulator-agnostic scene selection via
a new catalog (simulation/scenes.yaml, resolved host-side by
simulation/resolve_scene.py). Isaac maps shortnames to Pegasus catalog
keys or Nucleus USD URLs (exported asISAAC_SIM_SCENE+
ISAAC_SIM_STAGE_SCALE; the example launch scripts andfleet_spawn.py
now resolve their scene from these instead of hardcodingenv_url);
MS AirSim maps tofetch_scene.shkeys (MS_AIRSIM_SCENE— the
entrypoint's auto-fetch, previously Blocks-only, now fetches any catalog
scene, and an interactiveairstack upasks before a multi-GB download).
Thefetch_scene.shcatalog was corrected to the UE4 binaries that
actually exist in the AirSim v1.8.1 release:forest,soccerfield, and
building99were removed (their zips were never published, or are empty),
airsimnhnow downloadsAirSimNH.zip(was the nonexistent
Neighborhood.zip), andafricasavannah/msbuild2018were added; the
entrypoint resolves the UE launcher by glob after extraction, so zips whose
inner.shdoesn't match the folder name still boot.
Unknown scene = error + per-simulator availability table. Five stages were
published to the guest-readable
omniverse://airlab-nucleus.andrew.cmu.edu:443/Public/AirStack/Stages/
(AbandonedFactory, AbandonedWarehouse day/night, ChemicalPlant,
ConstructionSite, RetroNeighborhood) and cataloged with per-stage scale.
See Simulation Scenesairstack ready(andairstack up --wait): staged flight-readiness gates
mirroring the system-test budgets — containers → sim/clock→ per-robot
sentinel nodes → PX4 MAVROS-connected +local_position/odomstreaming —
with per-gate diagnostics and--jsonfor scripts- Preflight validation in
airstack upon resolved configuration (env >
--env-file>.env): one-simulator guard,NUM_ROBOTS>1vs
single-drone Isaac script as a named hard error, missing images listed
with animage-pullhint, missingomni_pass.env/ empty Pegasus
submodule / Docker < 29 surfaced on the host
(AIRSTACK_SKIP_PREFLIGHT=1downgrades errors to warnings) - tmux pane output mirrored to container stdout via shared
.tmux.conf
hooks, sodocker logs/airstack logsshow colcon builds,
ros2 launchoutput, sim loading, and crashes - simple-sim as a first-class simulator:
airstack up --sim simpleand a
simple_simsmoke-test mark (it had been broken since the ROS Jazzy
migration — its container sourced a Humble path — and is fixed) - Automatic
unit-tests.ymlPR gate onubuntu-latest, plus
run_meta.jsonoutcome metadata so reports distinguish completed
simulation campaigns from collection errors, empty selections, timeouts,
and cancellations - Feature notebook workflow (
use-feature-notebookskill): gitignored
notebook/NNN-feature-slug/entries whosedesign_spec.mdand
results_summary.mdpopulate feature PR descriptions - Battery and telemetry display in the GCS control panel (voltage and
percentage per robot when the MAVROS battery topic is bridged) TARGET_ARCHbuild arg (defaultx86_64) inDockerfile.robot;
docker-compose.yamlpassesTARGET_ARCH: aarch64to thevoxland
l4treal-robot image buildsros-${ROS_DISTRO}-mavros-extrasin the robot image (provides the
vision_pose plugin used for external-pose deployments)overrides/l4t-px4-realrobot.env— site-agnostic deployment override for
a single real PX4 robot on a Jetson (aarch64/l4t)integrationtest tier (tests/integration/,integrationmark) with a
sharedrobot_autonomy_stackfixture (robot container, no sim/GPU)waypoint_flightsystem test: takeoff → ordered waypoint route via
NavigateTask→ land, judged on the odometry track by the standalone
tests/waypoint_checker.py; the standard acceptance check after
integrating or swapping a planner module- Foxglove auto-loaded layout:
render_layout.pyseeds the rendered
NUM_ROBOTS-matched layout directly into the Foxglove desktop app's
local layout store andgcs.launch.xmlselects it via thelayoutId
deep link, so Foxglove opens on the right layout with no manual
Import from file... step; user-saved edits are hash-detected and
never overwritten (delete the layout in the UI to reset). Requires the
pinned Foxglove version — see Changed
Changed
- The simulator now starts playing by default:
PLAY_SIM_ON_START
defaults totruein.env(wasfalse). Passairstack up --no-play
to come up paused and press Play yourself;--playremains available as
an explicit override - Container autolaunch (robot desktop/voxl/l4t and GCS) now runs through an
autolaunchshell helper instead of a barebws && sws && ros2 launch
chain: a build failure or launch crash prints an unmissable red
"AUTOLAUNCH FAILED" banner in the tmux pane (mirrored todocker logs/
airstack logs) instead of silently returning to a prompt with the stack
down Dockerfile.gcspins the Foxglove desktop version (FOXGLOVE_VERSION
build arg, currently 3.0.0) instead of installinglatest, since the
layout auto-load writes the app's on-disk local-layout record format
directly (verified against 3.0.0; re-verify before bumping the pin)robot-desktopimage slimmed 17.1 GB → ~6 GB (−65%) by moving MACVO's
torch/TensorRT/weights into theasm_macvomodule Docker layer; a further
dependency purge removed unused apt/pip packages (−152 MB) anddroan_gl's
GL dependencies are declared explicitly- Isaac launch scripts deduplicated onto a shared
pegasus_app.PegasusApp
base: the scripts become scenario declarations (~40–170 lines each, net
−438 lines) with hooks for NatNet/scene-import extras; behavior verified
by full system-test parity.ISAAC_SIM_HEADLESSand
ISAAC_SIM_LIVESTREAMwork uniformly in every launch script (each was
honored by only half of them before) - Launch-workflow docs corrected against actual behavior:
ISAAC_SIM_SCENE
(nonexistent) replaced byISAAC_SIM_SCRIPT_NAME/ISAAC_SIM_GUI,
getting-started reflects the paused-by-default sim and Foxglove UI, isaac
docker.md defaults match.env, ms-airsim MAVROS ports/FOV/vehicle naming
fixed - Unit-test documentation matches the co-located layout: C++ gtests run via
colcon testunder thebuild_packagesmark; Python via the root harness
(conftest.pyapplies theunitmark by file location) - The CI orchestrator polls a
repos:list (one instance covers trunk and
every asm_* module repo; the singularrepo:key still works) — module CI
jobs onairstack-ephemeralno longer need per-repo orchestrator instances - Ephemeral CI GPU runners spawn via NVIDIA OSMO as a drop-in replacement
for the earlier OpenStack-Nova backend: the GitHub side (labels, JIT
tokens, fork guard) is unchanged; only the spawn target moved. The OSMO
service-account token plays the old application-credential role,
osmo workflow execreplaces SSH-via-floating-IP debugging, and the
runner image prebakes what cloud-init used to install at boot - Pegasus launch scripts drive lidar through the RTX OmniLidar API
(add_rtx_lidar_subgraph) in place of the Ouster graph path, with ROS
topics reconciled (raw cloud on…/sensors/ouster/point_cloud_raw,
filtered on…/sensors/ouster/point_cloud) - The
airstack-osmoSSH config block for OSMO IDE sessions is
StrictHostKeyChecking no+UserKnownHostsFile /dev/null(replacing
accept-new); users with the earlier block should replace it and run
ssh-keygen -R "[localhost]:2200"once - Default system-test
--simisisaacsim; pass--sim msairsimto opt in -m build_packagesCI runs pullcache_*images instead of baking sim
images;docker-build.ymlretags unchanged images on VERSION bumps
(content fingerprint) instead of always rebuilding- Automatic OSMO validation runs the pull-only
build_packagesgate on
every PR update; GPU simulation campaigns are selected through/pytest
orworkflow_dispatch robot-l4tcompose service knobs are env-overridable (FCU_URL, rosbag
path viaBAG_STORAGE_PATH);FCU_URLunquoted so the literal serial
path reaches MAVROSzed-l4timage: ZED SDK 4.2 → 5.2 with coupled ROS deps (zed_msgs
5.2.1,point_cloud_transport(_plugins)4.x,backward_ros)- Unit tests are defined by
tests/colcon_unit_test_packages.yaml - Repo-wide relicense to BSD 3-Clause Clear (vendored packages keep
their upstream licenses);airstack_msgsstabilized at 1.0.0; every
package.xml carries a real maintainer and description (contract-tested) DOCKER_IMAGE_BUILD_MODE=prebuiltis a tag discriminator only; a real
prebuilt-workspace image stage is future work- The repository CHANGELOG.md is removed in favor of this page — all
change records live here, per version - Docs policy: standalone snapshots. Feature docs describe only the
current system; all change-relative language (including RFC citations)
coalesces here. A full docs audit applied the policy and corrected pages
that had drifted from the code, notably: bag recording is NOT
auto-triggered at takeoff (the recorder starts idle; toggle via
/{robot_name}/bag_record/set_recording_status);tracking_point/
look_aheadcarryairstack_msgs/msg/Odometry(older docs said
geometry_msgs/PointStamped) and trajectory topics are
airstack_msgs/TrajectoryXYZVYaw; MAVROSInterface targets any
MAVLink-compatible FC (the documented Ascent/Ardupilot specificity does
not exist in code); the RobotInterface command topic iscmd_pose; the
DDS-router allowlist table is regenerated from the real config; the
Jetson install flow is./airstack.sh setup+ therobot-l4tservice.
Two orphaned pages documenting the behavior-tree framework
(behavior_tree,behavior_executive— packages removed in an earlier
release, PR #332; onlybehavior_tree_msgsremains) were deleted; the
behavior layer isdrone_safety_monitorwith mission sequencing via
GCS-sent task goals
Removed
An audit removed dead or superseded code wholesale. Anything here is
recoverable from git history, and hardware-specific capabilities return as
out-of-trunk modules:
- The
AUTONOMY_ROLElaunch dispatch and its per-role launch trees —
stacks are the only launch path - MACVO extracted to castacks/asm_macvo;
OptiTrack/NatNet extracted to
castacks/asm_optitrack
(client, PX4 external-vision fusion, NatNet emulator + Isaac wrapper,
e2e/integration tests, env overrides) px4_interface+ vendoredpx4_msgs— a native PX4 uXRCE-DDS interface
is tracked as a fresh design in
#387; MAVROS remains
the flight interfacewaypoint_interface,attitude_controller(+_msgs) — dead code- The RQT/RViz GUI set:
rviz_behavior_tree_panel(with thexdot_cpp
submodule),rqt_behavior_tree_command,rqt_behavior_tree,rqt_gcs,
rqt_airstack_control_panel— Foxglove is the GCS surface - Sensors-layer hardware packages
camera_param_server,
gimbal_stabilizer,sensor_interfaces
(lidar_point_cloud_filterremains) - WinTAK / TAK integration (
ros2tak_tools, CLI plumbing, GCS image
dependencies) — can return as a module - Isaac Sim
standalone_examplescopies, stale robot-docker helpers, the
ensemble_plannerskeleton, the Gazebo parallel-bringup tree, and
pre-co-location test scaffolding - trajectory_library's vestigial rqt selector (catkin-era GUI source,
plugin.xml,setup.py, launcher script — never installed by its
CMakeLists), the orphaned behavior-tree docs images, and an empty
integration-testing stub page tests/goldens/wiring/— wiring baselines live per-stack as
stacks/<name>/wiring.md
Fixed
airstack upguards (one-simulator, URDF pairing) validated.envonly
and were bypassed by--env-file; they now check the resolved
configurationpytest tests/collects the co-located unit tests before mark filtering
(CI previously collected 97 of 252 items, so the Python unit tests ran
nowhere); empty CI pytest arguments no longer recurse the repository;
non-comparable artifacts are reported instead of false 0% resultsbarebones_pegasus_launch.pycrashed withNameError: os;
isaac-sim-livestreamproduced a black stream with multi-drone scripts;
NATNET_BODY_NAME/NATNET_TARGET_NAMEoverrides now work- Isaac Sim image: PX4
ubuntu.shno longer fails dpkg configure on the
NVIDIA base; robot image pinspytest<8.1and disableslaunch_testing
for colcon unit tests - Robot identity: a pre-set
ROBOT_NAMEis honored; the name-map catch-all
maps tounknown_robot(valid ROS namespace token) and logs a warning
naming both fixes; inertROBOT_NAME/ROS_DOMAIN_IDlines dropped from
overrides/l4t-px4-realrobot.env - l4t robot image: dustynv's
/ros_entrypoint.shreplaced with a
passthrough so stale prebuiltfastcdrlibs no longer crash apt-built
nodes like MAVROS; the GeographicLibegm96-5geoid is asserted at build
time (MAVROS dies at startup without it) - Bag recording:
RECORD_BAGS=truenow actually starts the recorder on a
robot; recorder status is bridged in the correct direction so GCS
indicators work;ros2 bag record --excludeupdated for Jazzy's
--exclude-regex(multiple excludes alternated into one regex) - OptiTrack/NatNet:
NATNET_SERVER_IPis forwarded to the robot container;
the default tracked body matches the emulator; EKF2 external-vision
parameters are passed asPX4_PARAM_*so PX4 actually fuses mocap;
external-vision tuning corrected from real-flight bags (EKF2_EV_DELAY
7.0,EKF2_EVP_NOISE0.05); an unrecognizedconnection_typefails at
startup instead of silently falling back; MODELDEF drone-body count is
cross-checked againstNUM_ROBOTSafter the handshake; the emulator is
installed as a Kit extension so launch scripts can import it
Landing page & simulation camera/lighting (alpha.13)
- Docs landing page redesigned around four demonstrated pillars
(one-command bring-up, sim-to-vehicle code parity, full-stack CI, agent
readiness): real quickstart commands with copy buttons, the actual
airstack readychecklist, a live test-mark matrix, and a fresh
autoplay hero video (Isaac full-warehouse and office, Foxglove's live
3-robot trajectory traces, MS AirSim neighborhood and ZhangJiajie) —
40 s / 5.4 MB, replacing the 37 MB splash GIF. Per-simulator and Foxglove
clips are embedded in their docs sections, and the architecture image is
now an unedited full-system desktop capture (sim + GCS + CLI, live). - Isaac launch scripts grew camera/spawn/lighting env knobs
(pegasus_app.py, plumbed through the isaac-sim compose service):
ISAAC_SIM_FOLLOW_CAM/_OFFSET— a smoothed viewport chase camera
tracking a drone via live Pegasus vehicle state (also fixes the black
viewport at spawn on cm-authored stages; on by default,offdisables);
ISAAC_SIM_SPAWN_XY— recenter the spawn row away from a cluttered scene
origin;ISAAC_SIM_LIGHT_BOOST— multiply the scene's own lights
(de-instances light-bearing subtrees first, so e.g. the NVIDIA office's
121 instanceable ceiling lights become editable);
ISAAC_SIM_FOLLOW_CAM_LIGHT— headlight riding the follow camera;
ISAAC_SIM_DOME_LIGHT— dome-light intensity/exposure override.