Task A — Orin Nano Super platform update: - docker-compose.yml: update header/comments, switch all service image tags to jetson-orin, update devices to udev symlinks (/dev/rplidar, /dev/stm32-bridge, i2c-7), add NVMe volume mounts (/mnt/nvme/saltybot), update stm32-bridge to saltybot_bridge launch, add csi-cameras service - docs/pinout.md: full rewrite for Orin Nano Super — i2c-7, ttyTHS0, CSI-A/B connectors, M.2 NVMe slot, IMX219 15-pin FFC pinout, V4L2 nodes, GStreamer test commands, updated udev rules - docs/power-budget.md: full rewrite — 25W TDP, 8GB LPDDR5, 67 TOPS, 4-camera CSI bandwidth analysis, nvpmodel modes, Nano vs Orin comparison, 5V 6A PSU recommendation, 4S LiPo architecture - scripts/setup-jetson.sh: full rewrite — JetPack 6 / Ubuntu 22.04, nvidia-container-toolkit new keyring method, NVMe partition/format/fstab, CSI driver check (imx219 modprobe), video group, jtop install, 8GB swap Task B — saltybot_cameras ROS2 package: - launch/csi_cameras.launch.py: 4x v4l2_camera nodes, namespace per camera (front/left/rear/right), 640x480x30fps, includes TF launch automatically - launch/camera_tf.launch.py: static TF for 4 cameras at 90deg intervals on sensor_head_link (r=5cm offset), yaw 0/90/180/-90 deg - package.xml, setup.py, setup.cfg, __init__.py, resource marker - config/cameras_params.yaml: per-camera device/frame/offset configuration Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
196 lines
6.2 KiB
YAML
196 lines
6.2 KiB
YAML
version: "3.8"
|
||
|
||
# Jetson Orin Nano Super — ROS2 Humble SLAM stack
|
||
# Run with: docker compose up -d
|
||
# Requires: NVIDIA Container Toolkit (JetPack 6) on host
|
||
|
||
services:
|
||
|
||
# ── Core ROS2 + SLAM node ─────────────────────────────────────────────────
|
||
saltybot-ros2:
|
||
image: saltybot/ros2-humble:jetson-orin
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
container_name: saltybot-ros2
|
||
restart: unless-stopped
|
||
runtime: nvidia # JetPack NVIDIA runtime
|
||
privileged: false # use device passthrough instead
|
||
network_mode: host # ROS2 DDS multicast needs host networking
|
||
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||
- ROS_DOMAIN_ID=42
|
||
- DISPLAY=${DISPLAY:-:0} # for RViz2 on host X11
|
||
|
||
volumes:
|
||
# X11 socket for RViz2
|
||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||
# ROS2 workspace (host-mounted for live dev)
|
||
- ./ros2_ws/src:/ros2_ws/src:rw
|
||
# Persistent SLAM maps on NVMe
|
||
- /mnt/nvme/saltybot/maps:/maps
|
||
# NVMe data volume
|
||
- /mnt/nvme/saltybot:/data:rw
|
||
# Config files
|
||
- ./config:/config:ro
|
||
|
||
devices:
|
||
# RPLIDAR A1M8 — stable symlink via udev
|
||
- /dev/rplidar:/dev/rplidar
|
||
# STM32 USB CDC bridge — stable symlink via udev
|
||
- /dev/stm32-bridge:/dev/stm32-bridge
|
||
# RealSense D435i — USB3 device, needs udev rules
|
||
- /dev/bus/usb:/dev/bus/usb
|
||
# I2C bus (Orin Nano i2c-7 = 40-pin header pins 3/5)
|
||
- /dev/i2c-7:/dev/i2c-7
|
||
# CSI cameras via V4L2
|
||
- /dev/video0:/dev/video0
|
||
- /dev/video2:/dev/video2
|
||
- /dev/video4:/dev/video4
|
||
- /dev/video6:/dev/video6
|
||
|
||
command: >
|
||
bash -c "
|
||
source /opt/ros/humble/setup.bash &&
|
||
ros2 launch saltybot_bringup slam_rtabmap.launch.py
|
||
"
|
||
|
||
# ── RPLIDAR driver node ────────────────────────────────────────────────────
|
||
rplidar:
|
||
image: saltybot/ros2-humble:jetson-orin
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
container_name: saltybot-rplidar
|
||
restart: unless-stopped
|
||
runtime: nvidia
|
||
network_mode: host
|
||
environment:
|
||
- ROS_DOMAIN_ID=42
|
||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||
devices:
|
||
- /dev/rplidar:/dev/rplidar
|
||
command: >
|
||
bash -c "
|
||
source /opt/ros/humble/setup.bash &&
|
||
ros2 launch rplidar_ros rplidar_a1_launch.py
|
||
serial_port:=/dev/rplidar
|
||
frame_id:=laser
|
||
"
|
||
|
||
# ── RealSense D435i driver node ────────────────────────────────────────────
|
||
realsense:
|
||
image: saltybot/ros2-humble:jetson-orin
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
container_name: saltybot-realsense
|
||
restart: unless-stopped
|
||
runtime: nvidia
|
||
network_mode: host
|
||
environment:
|
||
- ROS_DOMAIN_ID=42
|
||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||
devices:
|
||
- /dev/bus/usb:/dev/bus/usb
|
||
volumes:
|
||
- /dev:/dev
|
||
command: >
|
||
bash -c "
|
||
source /opt/ros/humble/setup.bash &&
|
||
ros2 launch realsense2_camera rs_launch.py
|
||
enable_color:=true
|
||
enable_depth:=true
|
||
enable_gyro:=true
|
||
enable_accel:=true
|
||
unite_imu_method:=linear_interpolation
|
||
depth_module.profile:=640x480x30
|
||
rgb_camera.profile:=640x480x30
|
||
"
|
||
|
||
# ── STM32 bridge node (bidirectional serial↔ROS2) ─────────────────────────
|
||
stm32-bridge:
|
||
image: saltybot/ros2-humble:jetson-orin
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
container_name: saltybot-stm32-bridge
|
||
restart: unless-stopped
|
||
runtime: nvidia
|
||
network_mode: host
|
||
environment:
|
||
- ROS_DOMAIN_ID=42
|
||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||
devices:
|
||
- /dev/stm32-bridge:/dev/stm32-bridge
|
||
command: >
|
||
bash -c "
|
||
source /opt/ros/humble/setup.bash &&
|
||
ros2 launch saltybot_bridge bridge.launch.py
|
||
mode:=bidirectional
|
||
serial_port:=/dev/stm32-bridge
|
||
"
|
||
|
||
# ── 4× IMX219 CSI cameras ─────────────────────────────────────────────────
|
||
csi-cameras:
|
||
image: saltybot/ros2-humble:jetson-orin
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
container_name: saltybot-csi-cameras
|
||
restart: unless-stopped
|
||
runtime: nvidia
|
||
network_mode: host
|
||
privileged: true # CSI camera access requires elevated perms
|
||
environment:
|
||
- ROS_DOMAIN_ID=42
|
||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||
devices:
|
||
- /dev/video0:/dev/video0
|
||
- /dev/video2:/dev/video2
|
||
- /dev/video4:/dev/video4
|
||
- /dev/video6:/dev/video6
|
||
command: >
|
||
bash -c "
|
||
source /opt/ros/humble/setup.bash &&
|
||
ros2 launch saltybot_cameras csi_cameras.launch.py
|
||
width:=640
|
||
height:=480
|
||
fps:=30
|
||
"
|
||
|
||
# ── Nav2 autonomous navigation stack ────────────────────────────────────────
|
||
saltybot-nav2:
|
||
image: saltybot/ros2-humble:jetson-orin
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
container_name: saltybot-nav2
|
||
restart: unless-stopped
|
||
runtime: nvidia
|
||
network_mode: host
|
||
depends_on:
|
||
- saltybot-ros2 # RTAB-Map + sensors must be running first
|
||
environment:
|
||
- NVIDIA_VISIBLE_DEVICES=all
|
||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||
- ROS_DOMAIN_ID=42
|
||
volumes:
|
||
- ./ros2_ws/src:/ros2_ws/src:rw
|
||
- ./config:/config:ro
|
||
command: >
|
||
bash -c "
|
||
source /opt/ros/humble/setup.bash &&
|
||
ros2 launch saltybot_bringup nav2.launch.py
|
||
"
|
||
|
||
volumes:
|
||
saltybot-maps:
|
||
driver: local
|