Skip to content

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

Draft
JohnYanxinLiu wants to merge 4 commits into
developfrom
johnliu/l4t-deployment-fix
Draft

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

Conversation

@JohnYanxinLiu

@JohnYanxinLiu JohnYanxinLiu 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 .env VERSION 0.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

Test Pass Fail Skip Rate
isaac-sim.extensions.PegasusSimulator.extensions.pegasus.simulator.pegasus.simulator.tests.test_hello_world 0 1 0 0%
isaac-sim.standalone_examples.replicator.pose_generation.pose_tests.test_utils 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.benchmark.services.test_no_rendering 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_determinism 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_root 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_delete_in_contact 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_rendering 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_save_stage 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_time_stepping 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.cortex.framework.cortex_bringup_test 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.ros1.bridge.test_carter_lidar 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_carter_camera_multi_robot_nav 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_people_sim 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.sensors.physics.contact_sensor_test 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_lidar_test 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_radar_test 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_createstage_config 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extension_count 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_external 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extra_args 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fabric_frame_delay 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fetch_results 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_frame_delay 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ogn 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ovd 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_syntheticdata 0 1 0 0%
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_unsaved_on_exit 0 1 0 0%
isaac-sim.standalone_examples.testing.omni.isaac.dynamic_control.test_zero_step 0 1 0 0%
isaac-sim.standalone_examples.testing.omni.replicator.agent.test_scripting 0 1 0 0%
isaac-sim.standalone_examples.testing.omni.syntheticdata.test_basic 0 1 0 0%
perception.natnet_ros2.test_natnet_ros2 0 1 0 0%
ros_packages.gui.rviz.rviz_behavior_tree_panel.scripts.test_behavior_tree_publisher 0 1 0 0%
ros_packages.logging.bag_recorder_pid.test.test_copyright 0 1 0 0%
ros_packages.logging.bag_recorder_pid.test.test_flake8 0 1 0 0%
ros_packages.logging.bag_recorder_pid.test.test_pep257 0 1 0 0%
ros_ws.src.local.planners.takeoff_landing_planner.test.scripts.test_takeoff_landing_planner 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Baseline.DPVO.Pangolin.components.pango_python.pybind11.tests 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_circular_buffer 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_loadable 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_macvo 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_modules 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_sequence 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_tartanvo 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_frontend 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_matching 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_performance_macvo 0 1 0 0%
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_stereo_depth 0 1 0 0%
ros_ws.src.ros2tak_tools.test.test_copyright 0 1 0 0%
ros_ws.src.ros2tak_tools.test.test_flake8 0 1 0 0%
ros_ws.src.ros2tak_tools.test.test_pep257 0 1 0 0%
ros_ws.src.sensors.camera_param_server.test.test_copyright 0 1 0 0%
ros_ws.src.sensors.camera_param_server.test.test_flake8 0 1 0 0%
ros_ws.src.sensors.camera_param_server.test.test_pep257 0 1 0 0%
ros_ws.src.sensors.gimbal_stabilizer.test.test_copyright 0 1 0 0%
ros_ws.src.sensors.gimbal_stabilizer.test.test_flake8 0 1 0 0%
ros_ws.src.sensors.gimbal_stabilizer.test.test_pep257 0 1 0 0%
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_copyright 0 1 0 0%
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_flake8 0 1 0 0%
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_pep257 0 1 0 0%
sensors.lidar_point_cloud_filter.test_validation_core 0 1 0 0%

Metrics

Test Metric Value
ros_packages.gui.rviz.rviz_behavior_tree_panel.scripts.test_behavior_tree_publisher duration_s 0s
ros_packages.logging.bag_recorder_pid.test.test_copyright duration_s 0s
ros_packages.logging.bag_recorder_pid.test.test_flake8 duration_s 0s
ros_packages.logging.bag_recorder_pid.test.test_pep257 duration_s 0s
ros_ws.src.ros2tak_tools.test.test_copyright duration_s 0s
ros_ws.src.ros2tak_tools.test.test_flake8 duration_s 0s
ros_ws.src.ros2tak_tools.test.test_pep257 duration_s 0s
ros_ws.src.local.planners.takeoff_landing_planner.test.scripts.test_takeoff_landing_planner duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Baseline.DPVO.Pangolin.components.pango_python.pybind11.tests duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_circular_buffer duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_loadable duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_macvo duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_modules duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_sequence duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_config_tartanvo duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_frontend duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_matching duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_performance_macvo duration_s 0s
ros_ws.src.perception.macvo_ros2.macvo_ros2.macvo.Scripts.UnitTest.test_stereo_depth duration_s 0s
ros_ws.src.sensors.camera_param_server.test.test_copyright duration_s 0s
ros_ws.src.sensors.camera_param_server.test.test_flake8 duration_s 0s
ros_ws.src.sensors.camera_param_server.test.test_pep257 duration_s 0s
ros_ws.src.sensors.gimbal_stabilizer.test.test_copyright duration_s 0s
ros_ws.src.sensors.gimbal_stabilizer.test.test_flake8 duration_s 0s
ros_ws.src.sensors.gimbal_stabilizer.test.test_pep257 duration_s 0s
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_copyright duration_s 0s
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_flake8 duration_s 0s
ros_ws.src.sensors.lidar_point_cloud_filter.test.test_pep257 duration_s 0s
isaac-sim.extensions.PegasusSimulator.extensions.pegasus.simulator.pegasus.simulator.tests.test_hello_world duration_s 0s
isaac-sim.standalone_examples.replicator.pose_generation.pose_tests.test_utils duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.benchmark.services.test_no_rendering duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_determinism duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_articulation_root duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_delete_in_contact duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_rendering duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_save_stage duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.core.api.test_time_stepping duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.cortex.framework.cortex_bringup_test duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.ros1.bridge.test_carter_lidar duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_carter_camera_multi_robot_nav duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.ros2.bridge.test_people_sim duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.sensors.physics.contact_sensor_test duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_lidar_test duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.sensors.rtx.rtx_radar_test duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_createstage_config duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extension_count duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_external duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_extra_args duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fabric_frame_delay duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_fetch_results duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_frame_delay duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ogn duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_ovd duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_syntheticdata duration_s 0s
isaac-sim.standalone_examples.testing.isaacsim.simulation_app.test_unsaved_on_exit duration_s 0s
isaac-sim.standalone_examples.testing.omni.isaac.dynamic_control.test_zero_step duration_s 0s
isaac-sim.standalone_examples.testing.omni.replicator.agent.test_scripting duration_s 0s
isaac-sim.standalone_examples.testing.omni.syntheticdata.test_basic duration_s 0s
perception.natnet_ros2.test_natnet_ros2 duration_s 0s
sensors.lidar_point_cloud_filter.test_validation_core duration_s 0s

JohnYanxinLiu and 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
JohnYanxinLiu force-pushed the johnliu/l4t-deployment-fix branch from 35b4b0a to 61a94b9 Compare July 21, 2026 16:59
@JohnYanxinLiu
JohnYanxinLiu requested a review from krrishj18 July 21, 2026 17:06
@JohnYanxinLiu

Copy link
Copy Markdown
Collaborator Author

Successfully built and ran on real jetson hardware.

Sign up for free to 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.

1 participant