feat: full_stack.launch.py — one-command autonomous stack bringup #68

Merged
seb merged 1 commits from sl-jetson/full-stack-launch into main 2026-03-01 01:00:30 -05:00
Collaborator

Summary

Adds saltybot_bringup/launch/full_stack.launch.py: the single command to launch the entire SaltyBot autonomous stack in the correct dependency order, with mode-based configuration.

# Full indoor stack (default):
ros2 launch saltybot_bringup full_stack.launch.py

# Person-follow only demo:
ros2 launch saltybot_bringup full_stack.launch.py mode:=follow

# Outdoor GPS navigation:
ros2 launch saltybot_bringup full_stack.launch.py mode:=outdoor

Launch sequence

Time Component Condition
t=0s Robot description (URDF + TF tree) always
t=0s STM32 bidirectional serial bridge enable_bridge:=true
t=2s RPLIDAR + RealSense D435i sensors always
t=2s cmd_vel safety bridge (deadman + AUTONOMOUS gate) enable_bridge:=true
t=4s UWB driver (MaUWB DW3000, 2 anchors) enable_uwb:=true
t=4s 4× IMX219 CSI surround cameras enable_csi_cameras:=true
t=6s RTAB-Map SLAM (RGB-D + LIDAR) mode:=indoor
t=6s Outdoor GPS navigation mode:=outdoor
t=6s YOLOv8n person detection (TensorRT) enable_perception:=true
t=9s Person follower (UWB+camera fusion) enable_follower:=true
t=14s Nav2 navigation stack mode:=indoor
t=17s rosbridge WebSocket (port 9090) enable_rosbridge:=true

Modes

  • indoor (default) — Full SLAM + Nav2 + person follow + UWB + all sensors
  • outdoor — GPS-based navigation + sensors + UWB + follow (no SLAM)
  • follow — Sensors + UWB + perception + follower only (living room demo)

Key launch arguments

Argument Default Description
mode indoor indoor / outdoor / follow
follow_distance 1.5 Person-follow target distance (m)
max_linear_vel 0.5 Velocity cap forwarded to follower + bridge
enable_csi_cameras true 4× IMX219 surround cameras
enable_uwb true MaUWB DW3000 driver
enable_bridge true STM32 + cmd_vel bridges (false for sim)
use_sim_time false Set true for rosbag replay
uwb_port_a/b /dev/uwb-anchor0/1 UWB serial ports
stm32_port /dev/stm32-bridge STM32 USB CDC port

Also updates saltybot_bringup/package.xml

  • Adds exec_depend for all saltybot_* packages included by full_stack.launch.py
  • Updates maintainer to sl-jetson

Test plan

  • python3 -c "import ast; ast.parse(open('full_stack.launch.py').read()); print('OK')" — syntax clean
  • ros2 launch saltybot_bringup full_stack.launch.py mode:=follow enable_bridge:=false enable_uwb:=false — minimal stack, no hardware
  • Verify startup banner log: [full_stack] SaltyBot bringup starting — mode=follow
  • Verify nodes appear: ros2 node list shows /person_follower, /person_detector, /uwb_driver
  • Indoor mode: ros2 topic list includes /rtabmap/map, /local_costmap/costmap, /cmd_vel
  • Follow mode: confirm no rtabmap or nav2 nodes in ros2 node list
  • Hardware test on Orin: ros2 launch saltybot_bringup full_stack.launch.py

🤖 Generated with Claude Code

## Summary Adds `saltybot_bringup/launch/full_stack.launch.py`: the single command to launch the entire SaltyBot autonomous stack in the correct dependency order, with mode-based configuration. ```bash # Full indoor stack (default): ros2 launch saltybot_bringup full_stack.launch.py # Person-follow only demo: ros2 launch saltybot_bringup full_stack.launch.py mode:=follow # Outdoor GPS navigation: ros2 launch saltybot_bringup full_stack.launch.py mode:=outdoor ``` ## Launch sequence | Time | Component | Condition | |------|-----------|-----------| | t=0s | Robot description (URDF + TF tree) | always | | t=0s | STM32 bidirectional serial bridge | `enable_bridge:=true` | | t=2s | RPLIDAR + RealSense D435i sensors | always | | t=2s | cmd_vel safety bridge (deadman + AUTONOMOUS gate) | `enable_bridge:=true` | | t=4s | UWB driver (MaUWB DW3000, 2 anchors) | `enable_uwb:=true` | | t=4s | 4× IMX219 CSI surround cameras | `enable_csi_cameras:=true` | | t=6s | RTAB-Map SLAM (RGB-D + LIDAR) | `mode:=indoor` | | t=6s | Outdoor GPS navigation | `mode:=outdoor` | | t=6s | YOLOv8n person detection (TensorRT) | `enable_perception:=true` | | t=9s | Person follower (UWB+camera fusion) | `enable_follower:=true` | | t=14s | Nav2 navigation stack | `mode:=indoor` | | t=17s | rosbridge WebSocket (port 9090) | `enable_rosbridge:=true` | ## Modes - **`indoor`** (default) — Full SLAM + Nav2 + person follow + UWB + all sensors - **`outdoor`** — GPS-based navigation + sensors + UWB + follow (no SLAM) - **`follow`** — Sensors + UWB + perception + follower only (living room demo) ## Key launch arguments | Argument | Default | Description | |----------|---------|-------------| | `mode` | `indoor` | `indoor` / `outdoor` / `follow` | | `follow_distance` | `1.5` | Person-follow target distance (m) | | `max_linear_vel` | `0.5` | Velocity cap forwarded to follower + bridge | | `enable_csi_cameras` | `true` | 4× IMX219 surround cameras | | `enable_uwb` | `true` | MaUWB DW3000 driver | | `enable_bridge` | `true` | STM32 + cmd_vel bridges (false for sim) | | `use_sim_time` | `false` | Set true for rosbag replay | | `uwb_port_a/b` | `/dev/uwb-anchor0/1` | UWB serial ports | | `stm32_port` | `/dev/stm32-bridge` | STM32 USB CDC port | ## Also updates `saltybot_bringup/package.xml` - Adds `exec_depend` for all `saltybot_*` packages included by `full_stack.launch.py` - Updates maintainer to `sl-jetson` ## Test plan - [ ] `python3 -c "import ast; ast.parse(open('full_stack.launch.py').read()); print('OK')"` — syntax clean - [ ] `ros2 launch saltybot_bringup full_stack.launch.py mode:=follow enable_bridge:=false enable_uwb:=false` — minimal stack, no hardware - [ ] Verify startup banner log: `[full_stack] SaltyBot bringup starting — mode=follow` - [ ] Verify nodes appear: `ros2 node list` shows `/person_follower`, `/person_detector`, `/uwb_driver` - [ ] Indoor mode: `ros2 topic list` includes `/rtabmap/map`, `/local_costmap/costmap`, `/cmd_vel` - [ ] Follow mode: confirm no `rtabmap` or `nav2` nodes in `ros2 node list` - [ ] Hardware test on Orin: `ros2 launch saltybot_bringup full_stack.launch.py` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
sl-jetson added 1 commit 2026-03-01 00:57:08 -05:00
Adds saltybot_bringup/launch/full_stack.launch.py: a single launch file
that brings up the entire SaltyBot software stack in dependency order,
with mode selection (indoor / outdoor / follow).

Launch sequence (wall-clock delays):
  t= 0s  robot_description (URDF + TF)
  t= 0s  STM32 bidirectional serial bridge
  t= 2s  sensors (RPLIDAR A1M8 + RealSense D435i)
  t= 2s  cmd_vel safety bridge (deadman + ramp + AUTONOMOUS gate)
  t= 4s  UWB driver (MaUWB DW3000 anchors on USB)
  t= 4s  CSI cameras — 4x IMX219 (optional, enable_csi_cameras:=true)
  t= 6s  SLAM — RTAB-Map RGB-D+LIDAR (indoor only)
  t= 6s  Outdoor GPS nav (outdoor only)
  t= 6s  YOLOv8n person detection (TensorRT)
  t= 9s  Person follower (UWB primary + camera fusion)
  t=14s  Nav2 navigation stack (indoor only)
  t=17s  rosbridge WebSocket server (port 9090)

Modes:
  indoor  — SLAM + Nav2 + full sensor suite + follow + UWB (default)
  outdoor — GPS nav + sensors + follow + UWB (no SLAM)
  follow  — sensors + UWB + perception + follower only

Launch arguments:
  mode, use_sim_time, enable_csi_cameras, enable_uwb, enable_perception,
  enable_follower, enable_bridge, enable_rosbridge, follow_distance,
  max_linear_vel, uwb_port_a, uwb_port_b, stm32_port

Also updates saltybot_bringup/package.xml:
  - Adds exec_depend for all saltybot_* packages included by full_stack
  - Updates maintainer to sl-jetson

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
seb merged commit b97ce09d80 into main 2026-03-01 01:00:30 -05:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#68
No description provided.