Skip to content

l4t deployment fixes: make the Jetson profile build + boot on real hardware - #371

Merged
krrishj18 merged 4 commits into
developfrom
johnliu/l4t-deployment-fix
Jul 22, 2026
Merged

l4t deployment fixes: make the Jetson profile build + boot on real hardware#371
krrishj18 merged 4 commits into
developfrom
johnliu/l4t-deployment-fix

Conversation

@JohnYanxinLiu

@JohnYanxinLiuJohnYanxinLiu commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

What features did you add and/or bugs did you address?

  • Which GitHub issue does this address?

    No dedicated issue. Second PR in the real-robot deployment series (follows l4t infra fixes: aarch64 build args + robot-name resolution #370, "general robot deployment infra"). Makes the existing robot-l4t (Jetson / aarch64) profile actually build and boot on real hardware, and documents the name-resolution + build gotchas so they don't get rediscovered.

  • Additional description if not fully described in the GitHub issue

    Three concerns, committed separately:

    1. robot-l4t deployment knobs (compose + skill)commit 1

    • AUTONOMY_ROLE and FCU_URL are now ${VAR:-default} overridable (and FCU_URL is unquoted so the literal serial path reaches mavros).
    • Rosbag output path is BAG_STORAGE_PATH-overridable (default unchanged: /media/airlab/Storage/airstack_collection).
    • Mount full /dev so a hot-plugged USB FCU (ttyACM*) appears without a container restart.
    • configure-multi-robot skill updated for the honor-pre-set-ROBOT_NAME guard from l4t infra fixes: aarch64 build args + robot-name resolution #370.

    2. Deployment override template (env)commit 2

    • overrides/l4t-px4-realrobot.env: site-agnostic template surfacing the common knobs. ROBOT_NAME pinned directly (single-robot shortcut, with the fleet caveat documented). Mocap-agnostic — NatNet settings come in a later optitrack override.

    3. l4t image build fixes (dockerfiles + skill + docs)commit 3

    • Dockerfile.l4t-stack-base: overwrite dustynv's /ros_entrypoint.sh with an exec "$@" passthrough. Its prebuilt source-ROS libs (fastcdr 2.2.5) were shadowing the apt Jazzy (2.2.7) Dockerfile.robot layers on, crashing mavros with symbol-lookup errors under tmux autolaunch.
    • zed/Dockerfile.zed-l4t: bump ZED SDK 4.2 → 5.2 with the coupled ROS deps (zed_msgs 5.2.1, point_cloud_transport(_plugins) 4.x, add backward_ros).
  • Please add videos and images to demonstrate the feature.

    N/A — build/config plumbing, no runtime UI.

How did you implement it?

  • The robot-l4t service already existed on develop; this parametrizes its hardcoded values rather than adding a new service, so multi-robot/hostname resolution stays the default and per-deployment values live in an override env file.
  • ROBOT_NAME is pinned only in the override, never on the shared service — a hardcoded name on the service collapses all robots onto one name/domain (see the configure-multi-robot skill).
  • The entrypoint fix is a single RUN that replaces the base image's entrypoint; shells still get ROS from /opt/ros/jazzy/setup.bash via .bashrc.

How do you run and use it?

# Build the Jetson images (on an aarch64 Jetson):
airstack image-build --profile l4t robot-l4t
# Run a single real robot with the override:
airstack up --env-file overrides/l4t-px4-realrobot.env robot-l4t
# Verify identity + FCU inside the container:
docker exec<robot-l4t-container> bash -lc 'echo "$ROBOT_NAME $ROS_DOMAIN_ID $FCU_URL"'# robot_1 1 /dev/ttyTHS4:115200

Testing with PyTest

  • No new pytests. This is infra/build plumbing with no hermetic runtime surface; the build_docker suite exercises the changed Dockerfiles/compose. Full l4t verification is hardware (Jetson + PX4 + ZED) and can't run on the x86 CI runner.
  • Optional: airstack test -m "build_docker or build_packages" -v

Documentation

  • Was mkdocs.yml updated? (y/n) n — no new page; updated the configure-multi-robot and docker-build-profiles skills and corrected docs/robot/docker/robot_identity.md.
  • Docs scope: name-resolution flow + l4t build gotchas now captured for the next agent/maintainer.
  • Visual media: N/A.

Versioning

  • Bumped .envVERSION0.19.0-alpha.60.19.0-alpha.7 (commit 4) with matching CHANGELOG [Unreleased] entries, clearing the version-increment gate.

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown

Test Metrics — 798ad5439f6e74cb31412a1279e8a3a3072bef55

Pass rates

TestPassFailSkipRate
isaac-sim.extensions.PegasusSimulator.extensions.pegasus.simulator.pegasus.simulator.tests.test_hello_world0100%
isaac-sim.standalone_examples.replicator.pose_generation.pose_tests.test_utils0100%
isaac-sim.standalone_examples.testing.isaacsim.benchmark.services.test_no_rendering0100%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_determinism0100%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_root0100%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_delete_in_contact0100%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_rendering0100%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_save_stage0100%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_time_stepping0100%
isaac-sim.standalone_examples.testing.isaacsim.cortex.framework.cortex_bringup_test0100%
isaac-sim.standalone_examples.testing.isaacsim.ros1.bridge.test_carter_lidar0100%
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_carter_camera_multi_robot_nav0100%
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_people_sim0100%
isaac-sim.standalone_examples.testing.isaacsim.sensors.physics.contact_sensor_test0100%
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_lidar_test0100%
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_radar_test0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_createstage_config0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extension_count0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_external0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extra_args0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fabric_frame_delay0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fetch_results0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_frame_delay0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ogn0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ovd0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_syntheticdata0100%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_unsaved_on_exit0100%
isaac-sim.standalone_examples.testing.omni.isaac.dynamic_control.test_zero_step0100%
isaac-sim.standalone_examples.testing.omni.replicator.agent.test_scripting0100%
isaac-sim.standalone_examples.testing.omni.syntheticdata.test_basic0100%
perception.natnet_ros2.test_natnet_ros20100%
ros_packages.gui.rviz.rviz_behavior_tree_panel.scripts.test_behavior_tree_publisher0100%
ros_packages.logging.bag_recorder_pid.test.test_copyright0100%
ros_packages.logging.bag_recorder_pid.test.test_flake80100%
ros_packages.logging.bag_recorder_pid.test.test_pep2570100%
ros_ws.src.local.planners.takeoff_landing_planner.test.scripts.test_takeoff_landing_planner0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Baseline.DPVO.Pangolin.components.pango_python.pybind11.tests0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_circular_buffer0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_loadable0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_macvo0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_modules0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_sequence0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_tartanvo0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_frontend0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_matching0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_performance_macvo0100%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_stereo_depth0100%
ros_ws.src.ros2tak_tools.test.test_copyright0100%
ros_ws.src.ros2tak_tools.test.test_flake80100%
ros_ws.src.ros2tak_tools.test.test_pep2570100%
ros_ws.src.sensors.camera_param_server.test.test_copyright0100%
ros_ws.src.sensors.camera_param_server.test.test_flake80100%
ros_ws.src.sensors.camera_param_server.test.test_pep2570100%
ros_ws.src.sensors.gimbal_stabilizer.test.test_copyright0100%
ros_ws.src.sensors.gimbal_stabilizer.test.test_flake80100%
ros_ws.src.sensors.gimbal_stabilizer.test.test_pep2570100%
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_copyright0100%
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_flake80100%
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_pep2570100%
sensors.lidar_point_cloud_filter.test_validation_core0100%

Metrics

TestMetricValue
ros_packages.gui.rviz.rviz_behavior_tree_panel.scripts.test_behavior_tree_publisherduration_s0s
ros_packages.logging.bag_recorder_pid.test.test_copyrightduration_s0s
ros_packages.logging.bag_recorder_pid.test.test_flake8duration_s0s
ros_packages.logging.bag_recorder_pid.test.test_pep257duration_s0s
ros_ws.src.ros2tak_tools.test.test_copyrightduration_s0s
ros_ws.src.ros2tak_tools.test.test_flake8duration_s0s
ros_ws.src.ros2tak_tools.test.test_pep257duration_s0s
ros_ws.src.local.planners.takeoff_landing_planner.test.scripts.test_takeoff_landing_plannerduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Baseline.DPVO.Pangolin.components.pango_python.pybind11.testsduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_circular_bufferduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_loadableduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_macvoduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_modulesduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_sequenceduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_tartanvoduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_frontendduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_matchingduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_performance_macvoduration_s0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_stereo_depthduration_s0s
ros_ws.src.sensors.camera_param_server.test.test_copyrightduration_s0s
ros_ws.src.sensors.camera_param_server.test.test_flake8duration_s0s
ros_ws.src.sensors.camera_param_server.test.test_pep257duration_s0s
ros_ws.src.sensors.gimbal_stabilizer.test.test_copyrightduration_s0s
ros_ws.src.sensors.gimbal_stabilizer.test.test_flake8duration_s0s
ros_ws.src.sensors.gimbal_stabilizer.test.test_pep257duration_s0s
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_copyrightduration_s0s
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_flake8duration_s0s
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_pep257duration_s0s
isaac-sim.extensions.PegasusSimulator.extensions.pegasus.simulator.pegasus.simulator.tests.test_hello_worldduration_s0s
isaac-sim.standalone_examples.replicator.pose_generation.pose_tests.test_utilsduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.benchmark.services.test_no_renderingduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_determinismduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_rootduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_delete_in_contactduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_renderingduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_save_stageduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_time_steppingduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.cortex.framework.cortex_bringup_testduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.ros1.bridge.test_carter_lidarduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_carter_camera_multi_robot_navduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_people_simduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.sensors.physics.contact_sensor_testduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_lidar_testduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_radar_testduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_createstage_configduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extension_countduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_externalduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extra_argsduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fabric_frame_delayduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fetch_resultsduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_frame_delayduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ognduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ovdduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_syntheticdataduration_s0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_unsaved_on_exitduration_s0s
isaac-sim.standalone_examples.testing.omni.isaac.dynamic_control.test_zero_stepduration_s0s
isaac-sim.standalone_examples.testing.omni.replicator.agent.test_scriptingduration_s0s
isaac-sim.standalone_examples.testing.omni.syntheticdata.test_basicduration_s0s
perception.natnet_ros2.test_natnet_ros2duration_s0s
sensors.lidar_point_cloud_filter.test_validation_coreduration_s0s

JohnYanxinLiuand others added 4 commits July 21, 2026 12:58
…e resolution
Parametrize the robot-l4t compose service so a single service covers real
deployments without editing compose:
- AUTONOMY_ROLE and FCU_URL are now ${VAR:-default} overridable (and FCU_URL is
unquoted so the literal serial path reaches mavros).
- Rosbag output path is BAG_STORAGE_PATH-overridable.
Update the configure-multi-robot skill to reflect the honor-pre-set-ROBOT_NAME
guard (#370): document pinning ROBOT_NAME in an override for a single real robot,
the never-on-the-shared-service caveat, and the unknown_robot fallback fixes by
topology.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Deployment override for a single real PX4 robot on a Jetson (aarch64/l4t).
Surfaces the common knobs at the top with sensible defaults: ROBOT_NAME pinned
directly (single-robot shortcut honored by .bashrc), FCU_URL, AUTONOMY_ROLE,
BAG_STORAGE_PATH, and RECORD_BAGS. Mocap-agnostic — NatNet/external-vision
settings are added by a separate optitrack override.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Two real-hardware build fixes for the Jetson profile:
- Dockerfile.l4t-stack-base: overwrite dustynv's /ros_entrypoint.sh with an
`exec "$@"` passthrough. Its prebuilt source-ROS libs (fastcdr 2.2.5) were
shadowing the apt Jazzy (2.2.7) that Dockerfile.robot layers on, crashing
apt-built nodes like mavros with symbol-lookup errors under tmux autolaunch.
- zed/Dockerfile.zed-l4t: bump ZED SDK 4.2 -> 5.2 and move the coupled ROS deps
together (zed_msgs 5.2.1, point_cloud_transport(_plugins) 4.x, add backward_ros).
Document both gotchas in the docker-build-profiles skill, and correct the stale
unknown-robot -> unknown_robot in the robot_identity reference doc.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Version-increment gate: bump above develop's 0.19.0-alpha.6 and record the l4t
deployment changes in the changelog.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@JohnYanxinLiu
JohnYanxinLiuforce-pushed the johnliu/l4t-deployment-fix branch from 35b4b0a to 61a94b9CompareJuly 21, 2026 16:59
@JohnYanxinLiu

Copy link
Copy Markdown
CollaboratorAuthor

Successfully built and ran on real jetson hardware.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@JohnYanxinLiu@krrishj18