Integrates Nav2 autonomous navigation stack with RTAB-Map SLAM on Orin
Nano Super. No AMCL/map_server needed — RTAB-Map provides /map + TF.
New files:
- jetson/config/nav2_params.yaml DWB controller,
NavFn planner, RPLIDAR obstacle layer, RealSense voxel layer;
10Hz local / 5Hz global costmap; robot_radius 0.15m, max_vel 1.0 m/s
- jetson/ros2_ws/src/saltybot_bringup/launch/nav2.launch.py
wraps nav2_bringup navigation_launch with saltybot params + BT XML
- jetson/ros2_ws/src/saltybot_bringup/behavior_trees/
navigate_to_pose_with_recovery.xml BT: replan@1Hz, DWB follow,
recovery: clear maps → spin 90° → wait 5s → back up 0.30m
Updated:
- jetson/docker-compose.yml add saltybot-nav2 service
(depends_on: saltybot-ros2)
- jetson/ros2_ws/src/saltybot_bringup/setup.py install behavior_trees/*.xml
- jetson/ros2_ws/src/saltybot_bringup/package.xml add rtabmap_ros + nav2_bringup
- projects/saltybot/SLAM-SETUP-PLAN.md Phase 2b ✅ Done
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
167 lines
5.2 KiB
YAML
167 lines
5.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-nano
|
|
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/ttyUSB0:/dev/ttyUSB0
|
|
command: >
|
|
bash -c "
|
|
source /opt/ros/humble/setup.bash &&
|
|
ros2 launch rplidar_ros rplidar_a1_launch.py
|
|
serial_port:=/dev/ttyUSB0
|
|
frame_id:=laser
|
|
"
|
|
|
|
# ── RealSense D435i driver node ────────────────────────────────────────────
|
|
realsense:
|
|
image: saltybot/ros2-humble:jetson-nano
|
|
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 (custom serial↔ROS2 bridge) ─────────────────────────
|
|
stm32-bridge:
|
|
image: saltybot/ros2-humble:jetson-nano
|
|
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/ttyUSB1:/dev/ttyUSB1
|
|
command: >
|
|
bash -c "
|
|
source /opt/ros/humble/setup.bash &&
|
|
ros2 run saltybot_stm32_bridge bridge_node
|
|
--ros-args
|
|
-p serial_port:=/dev/ttyUSB1
|
|
-p baud_rate:=921600
|
|
"
|
|
|
|
# ── 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
|