diff --git a/Roadmap.md b/Roadmap.md index dd1dce8..400f2c0 100644 --- a/Roadmap.md +++ b/Roadmap.md @@ -1,6 +1,6 @@ # SaltyBot Roadmap -**Last updated:** 2026-02-28 by max (PM) +**Last updated:** 2026-03-01 by max (PM) **Project:** Self-balancing two-wheeled robot → autonomous navigation platform **Repo:** https://gitea.vayrette.com/seb/saltylab-firmware @@ -33,64 +33,85 @@ Goal: Robot stands upright on two wheels using PID control. | Gyro boot calibration (eliminates yaw drift) | ✅ MERGED | #25 | sl-controls | | Status LEDs (solid=OK, blink=error) | ✅ MERGED | #26 | sl-firmware | | Magnetometer + barometer auto-detect | ✅ MERGED | #27 | sl-firmware | +| BME280 full readout (temp/humidity/pressure) | ✅ MERGED | #31 | sl-firmware | | CW270 IMU axis mapping for MAMBA F722S | ✅ MERGED | #20 | sl-firmware | -**Next step:** Flash firmware to real hardware and test balance on the robot. - --- -## Phase 1.5: Mechanical + Platform — IN PROGRESS 🔧 +## Phase 1.5: Mechanical + Platform — COMPLETE ✅ Goal: Physical chassis and compute platform ready for testing. | Feature | Status | PR | Agent | |---------|--------|----|-------| | Parametric chassis frame (OpenSCAD) | ✅ MERGED | #7 | sl-mechanical | -| Prototype base plate (real hub motor measurements) | ✅ MERGED | #11 | sl-mechanical | -| Vertical stem + battery carousel (2-4 packs) | ✅ MERGED | #11 | sl-mechanical | -| Base plate dimensions fix (270x240mm) | ⏳ Salty reviewing | #11 | sl-mechanical | +| Prototype base plate (270×240mm) + vertical stem + battery carousel | ✅ MERGED | #11 | sl-mechanical | +| Multi-variant branch strategy | ✅ MERGED | #29 | sl-firmware | | Jetson Nano Docker env (JetPack 4.6 + ROS2 Humble) | ✅ MERGED | #8 | sl-jetson | | STM32-to-Jetson ROS2 serial bridge | ✅ MERGED | #16 | sl-jetson | | SLAM setup technical plan | ✅ MERGED | #1 | sl-perception | | RealSense + RPLIDAR ROS2 driver integration | ✅ MERGED | #17 | sl-perception | -| Multi-variant branch strategy | ⏳ Salty reviewing | #29 | sl-firmware | - -### Physical Build Checklist -- [ ] Laser-cut / 3D-print base plate (270x240mm) -- [ ] Machine dropout clamps for D-cut axles (16.11mm base, 13mm flat) -- [ ] Mount hub motors to base plate -- [ ] Weld/assemble vertical stem (80-120cm) -- [ ] Print battery carousel clamp -- [ ] Mount FC (MAMBA F722S) with M3 standoffs -- [ ] Wire ESC → motors, battery → ESC -- [ ] Flash firmware and test USB CDC connection -- [ ] First balance test (tethered) --- -## Phase 2: Autonomous Navigation — PLANNED 🗺️ +## Phase 2: Autonomous Navigation — NEARLY COMPLETE 🗺️ -Goal: Indoor SLAM, mapping, obstacle avoidance, person following. +Goal: Indoor SLAM, mapping, obstacle avoidance, person following, outdoor prep. -**Prerequisites:** Phase 1 hardware-tested on real robot, Jetson mounted, sensors calibrated. +### Phase 2a: RC + Core Integration — COMPLETE ✅ -| Feature | Priority | Agent | Notes | -|---------|----------|-------|-------| -| CRSF RC integration (ELRS) | P1 | sl-firmware | BetaFPV 2.4GHz TX/RX for manual control | -| Autonomous/RC mode switch | P1 | sl-controls | RC override with smooth handoff to autonomous | -| Jetson → STM32 command protocol | P1 | sl-jetson | Speed/steer from Nav2 → serial → STM32 | -| RTAB-Map SLAM integration | P2 | sl-perception | Primary: RTAB-Map. Fallback: ORB-SLAM3 | -| Nav2 path planning | P2 | sl-perception | Occupancy grid → Nav2 planner | -| Obstacle avoidance | P2 | sl-perception | RPLIDAR + depth camera costmaps | -| Person detection + following | P3 | sl-jetson | RealSense + CUDA inference on Nano | -| Outdoor waypoint navigation | P3 | sl-perception | GPS if needed | +| Feature | Status | PR | Agent | +|---------|--------|----|-------| +| CRSF/ELRS RC integration (420kbaud UART4 DMA) | ✅ MERGED | #35 | sl-firmware | +| Autonomous/RC mode switch (CH6, 500ms blend ramp) | ✅ MERGED | #33 | sl-controls | +| Jetson → STM32 command protocol | ✅ MERGED | #34 | sl-jetson | +| Gyro recalibration button + IWDG fix | ✅ MERGED | #39 | sl-firmware | +| Yaw inversion fix | ✅ MERGED | #40 | sl-firmware | +| SaltyBot 3D model in web UI | ✅ MERGED | #41 | sl-firmware | +| Web UI overhaul — HUD dashboard | ✅ MERGED | #45 | sl-firmware | +| Modern web UI dashboard | ✅ MERGED | #47 | sl-webui | -### SLAM Architecture (from sl-perception's plan) +### Phase 2b: SLAM + Navigation — COMPLETE ✅ + +| Feature | Status | PR | Agent | +|---------|--------|----|-------| +| RTAB-Map SLAM (Orin Nano Super, JetPack 6) | ✅ MERGED | #36 | sl-perception | +| URDF robot description + static TF | ✅ MERGED | #50 | sl-firmware | +| Nav2 path planning + obstacle avoidance (DWB+NavFn) | ✅ MERGED | #49 | sl-perception | +| Nav2 cmd_vel → STM32 velocity bridge (37 tests) | ✅ MERGED | #46 | sl-controls | +| Rosbridge WebSocket (ROS2 ↔ browser, port 9090) | ✅ MERGED | #53 | sl-firmware | + +### Phase 2c: Sensors + Person Following — COMPLETE ✅ + +| Feature | Status | PR | Agent | +|---------|--------|----|-------| +| Orin Nano Super platform + 4× IMX219 CSI cameras | ✅ MERGED | #51 | sl-jetson | +| 4× IMX219 surround vision + Nav2 costmap layer | ✅ MERGED | #52 | sl-perception | +| Person detection + tracking (YOLOv8n TensorRT, 26 tests) | ✅ MERGED | #54 | sl-jetson | +| Person-following control loop (53 tests) | ✅ MERGED | #55 | sl-controls | +| Sensor head mounts (RPLIDAR, RealSense, 4× IMX219) | ✅ MERGED | #48 | sl-mechanical | +| Bumper + frame protection (roll cage, base bumper, stem guards) | ✅ MERGED | #56 | sl-mechanical | + +### Phase 2d/2e: Outdoor + UWB + Cellular — IN PROGRESS 🔧 + +| Feature | Status | Issue | Agent | +|---------|--------|-------|-------| +| UWB follow-me system (3× MaUWB ESP32-S3 DW3000) | 🔧 In progress | #57 | sl-jetson | +| SIM7600X 4G cellular + GPS | 🔧 In progress | #58 | sl-controls | +| Outdoor nav — OSM routing + geofence + RTK GPS plan | 🔧 In progress | #59 | sl-perception | +| UWB tag enclosure + anchor mounts | 🔧 In progress | #57 | sl-mechanical | +| Remote e-stop over 4G MQTT | 🔧 In progress | #60 | sl-firmware | +| UWB + outdoor + e-stop dashboard panels | 🔧 In progress | — | sl-webui | + +### Architecture ``` RPLIDAR A1M8 ──→ rplidar_ros ──→┐ ├──→ rtabmap_ros ──→ Nav2 RealSense D435i ──→ realsense2 ─┘ ↑ - slam_toolbox (fallback) +4× IMX219 ──→ surround_costmap ──→ Nav2 costmap +UWB anchors ──→ saltybot_uwb ──→ person_follower +SIM7600X ──→ gpsd ──→ /gps/fix ──→ outdoor_nav + └──→ MQTT bridge ──→ remote telemetry + e-stop ``` --- @@ -112,16 +133,19 @@ RealSense D435i ──→ realsense2 ─┘ ↑ | Component | Specs | |-----------|-------| | **FC** | MAMBA F722S (STM32F722RET6, MPU6000, CW270 mount) | -| **Motors** | 2x 8" pneumatic hoverboard hub motors (10x2.125, 35 PSI) | +| **Motors** | 2× 8" pneumatic hoverboard hub motors (10×2.125, 35 PSI) | | **Axle** | Stepped D-cut: 16.11mm base, 15.95mm shaft, 13mm flat, 65.5mm total protrusion | | **ESC** | Hoverboard ESC (EFeru FOC firmware) | -| **Batteries** | 420x88x56mm packs, 2-4 mounted vertically on central stem | +| **Batteries** | 420×88×56mm packs, 2-4 mounted vertically on central stem | | **Base Plate** | 270mm wide × 240mm deep, wheels extend beyond edges | | **Total Height** | 80-120cm (ground to top of stem) | | **RC** | BetaFPV ELRS 2.4GHz TX + RX | -| **AI Brain** | Jetson Nano 4GB + Noctua fan | -| **Depth Camera** | Intel RealSense D435i (stereo depth 0.1-10m, 848×480@90fps, BMI055 IMU) | +| **AI Brain** | NVIDIA Jetson Orin Nano Super (67 TOPS, 8GB, JetPack 6, NVMe) | +| **Depth Camera** | Intel RealSense D435i (stereo depth 0.1-10m, 848×480@30fps, BMI055 IMU) | +| **Surround Vision** | 4× IMX219 160° CSI cameras (90° intervals, 640×480@30fps each) | | **LIDAR** | RPLIDAR A1M8 (360°, 12m range, 8000 samples/s, ~5.5Hz) | +| **UWB** | 3× MaUWB ESP32-S3 DW3000 (500m range, ±10cm, 100Hz) — 2 anchors + 1 tag | +| **Cellular** | Waveshare SIM7600X 4G HAT (LTE Cat-4, GPS/GLONASS/BeiDou/Galileo) | | **Spare IMUs** | BNO055, MPU6050 | --- @@ -130,11 +154,12 @@ RealSense D435i ──→ realsense2 ─┘ ↑ | Agent | Role | Specialty | |-------|------|-----------| -| **sl-firmware** | Embedded lead | STM32 HAL, USB, peripheral drivers, I2C sensors | -| **sl-controls** | Control systems | PID, sensor fusion, motor control, safety | -| **sl-perception** | SLAM/perception | ROS2, RTAB-Map, sensor integration, Nav2 | -| **sl-mechanical** | 3D design | OpenSCAD, chassis, mechanical design | -| **sl-jetson** | Jetson platform | Docker, ROS2, serial bridge, CUDA inference | +| **sl-firmware** | Embedded lead | STM32 HAL, USB, peripheral drivers, I2C sensors, rosbridge | +| **sl-controls** | Control systems | PID, sensor fusion, motor control, safety, cmd_vel bridge | +| **sl-perception** | SLAM/perception | ROS2, RTAB-Map, Nav2, surround vision, outdoor nav | +| **sl-mechanical** | 3D design | OpenSCAD, chassis, sensor mounts, bumpers, enclosures | +| **sl-jetson** | Jetson/AI platform | Docker, ROS2, serial bridge, CUDA/TensorRT inference, UWB | +| **sl-webui** | Web UI | Dashboard, telemetry display, Three.js, Tailwind, roslibjs | | **max** | PM (Opus) | Orchestrates via iTerm + MQTT, doesn't write code | --- @@ -148,7 +173,60 @@ RealSense D435i ──→ realsense2 ─┘ ↑ | #12 | Roll displays as pitch in web UI | sl-firmware | #14 | | #13 | No yaw in telemetry | sl-firmware | #14 | | #15 | 3D model axes wrong (CW270) | sl-firmware | #20 | +| #18 | Base plate dimensions wrong | sl-mechanical | #11 | | #21 | Yaw drifts when stationary | sl-controls | #25 | | #22 | Status LEDs blink too much | sl-firmware | #26 | | #23 | Gyro bias calibration needed | sl-controls | #25 | | #24 | Magnetometer + barometer support | sl-firmware | #27 | +| #28 | Multi-variant branch strategy | sl-firmware | #29 | +| #32 | Gyro recalibration button | sl-firmware | #39 | +| #37 | 3D robot model | sl-firmware | #41 | +| #38 | Yaw inversion in web UI | sl-firmware | #40 | +| #42 | Gyro cal USB disconnect (IWDG) | sl-firmware | #39 | +| #43 | Web UI overhaul | sl-webui | #47 | +| #44 | sl-webui agent credentials | max | Created agent | + +--- + +## All Merged PRs + +| PR | Title | Agent | +|----|-------|-------| +| #1 | SLAM setup technical plan | sl-perception | +| #2 | MPU6000 sensor fusion | sl-controls | +| #3 | Runtime PID tuning via USB | sl-controls | +| #4 | Safety systems (watchdog, interlock, tilt) | sl-controls | +| #6 | USB CDC TX fix (first pass) | sl-firmware | +| #7 | Parametric chassis frame | sl-mechanical | +| #8 | Jetson Nano platform setup | sl-jetson | +| #10 | USB CDC DCache fix (MPU non-cacheable) | sl-firmware | +| #11 | Base plate + stem + battery carousel | sl-mechanical | +| #14 | Roll axis + yaw telemetry | sl-firmware | +| #16 | STM32 serial bridge | sl-jetson | +| #17 | RealSense + RPLIDAR drivers | sl-perception | +| #19 | Motor driver (differential drive) | sl-controls | +| #20 | CW270 axis mapping | sl-firmware | +| #25 | Gyro boot calibration | sl-controls | +| #26 | Status LEDs | sl-firmware | +| #27 | Magnetometer + barometer auto-detect | sl-firmware | +| #29 | Multi-variant branch strategy | sl-firmware | +| #31 | BME280 full readout | sl-firmware | +| #33 | Autonomous/RC mode switch | sl-controls | +| #34 | Jetson → STM32 command protocol | sl-jetson | +| #35 | CRSF/ELRS RC integration | sl-firmware | +| #36 | SLAM Orin Nano Super update | sl-perception | +| #39 | Gyro recal button + IWDG fix | sl-firmware | +| #40 | Yaw inversion fix | sl-firmware | +| #41 | SaltyBot 3D model | sl-firmware | +| #45 | Web UI HUD dashboard | sl-firmware | +| #46 | Nav2 cmd_vel → STM32 bridge | sl-controls | +| #47 | Modern web UI dashboard | sl-webui | +| #48 | Sensor head mounts | sl-mechanical | +| #49 | Nav2 path planning + obstacle avoidance | sl-perception | +| #50 | URDF robot description + static TF | sl-firmware | +| #51 | Orin Nano platform + 4× IMX219 cameras | sl-jetson | +| #52 | 4× IMX219 surround vision + Nav2 costmap | sl-perception | +| #53 | Rosbridge WebSocket | sl-firmware | +| #54 | Person detection (YOLOv8n TensorRT) | sl-jetson | +| #55 | Person-following control loop | sl-controls | +| #56 | Bumper + frame protection | sl-mechanical |