sl-webui f71dad5344 feat(arch): migrate all STM32/Mamba/BlackPill refs to ESP32 BALANCE/IO + fix roslib@1.4.0
Architecture change (2026-04-03): Mamba F722S (STM32F722) and BlackPill
replaced by ESP32 BALANCE (PID loop) and ESP32 IO (motors/sensors/comms).

- Update CLAUDE.md, docs, chassis BOM/ASSEMBLY, pinout, power-budget,
  wiring-diagram, TEAM.md, AUTONOMOUS_ARMING.md, docker-compose
- Update all ROS2 package comments, config labels, launch args
  (stm32_port→esp32_port, /dev/stm32-bridge→/dev/esp32-bridge)
- Update WebUI: stm32Mode→esp32Mode, stm32Version→esp32Version,
  "STM32 State/Mode" labels → "ESP32 State/Mode" (ControlMode, SettingsPanel)
- Add TODO(esp32-migration) markers on stm32_protocol.py and mamba_protocol.py
  binary frame layouts — pending ESP32 protocol spec from max
- Fix roslib CDN 1.3.0→1.4.0 in all 11 HTML panels (fixes ROS2 Humble
  rosbridge "Received a message without an op" incompatibility)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 08:25:24 -04:00

84 lines
3.4 KiB
YAML

# route_params.yaml — Route recording and replay configuration for SaltyBot
#
# "Ride once, replay forever."
#
# Flow:
# 1. Tee rides EUC, SaltyBot follows via UWB follow-me (PR #66)
# 2. route_recorder_node samples GPS + odom → /data/routes/<name>.jsonl
# 3. Next ride: route_replayer_node loads file → Nav2 navigate_through_poses
#
# GPS source: SIM7600X → /gps/fix (NavSatFix, ±2.5m CEP) — PR #65
# Heading: D435i IMU → /imu/data, converted yaw → route waypoint heading_deg
# Odometry: ESP32 BALANCE wheel encoders → /odom
# UWB: /uwb/target (follow-me reference, logged for context)
route_recorder:
ros__parameters:
save_dir: "/data/routes"
route_name: "route" # override via param or launch arg
waypoint_spacing_m: 2.0 # skip GPS samples closer than this
sample_rate_hz: 1.0 # max recording frequency (GPS ~1Hz)
min_fix_status: 0 # 0=STATUS_FIX; reject STATUS_NO_FIX (-1)
route_replayer:
ros__parameters:
save_dir: "/data/routes"
route_name: "route"
replay_spacing_m: 3.0 # subsample waypoints for Nav2 (3m spacing)
goal_tolerance_xy: 2.0 # metres — matches SIM7600X ±2.5m CEP
replay_speed_factor: 1.0 # 1.0 = same speed as recorded
map_frame: "map"
nav_timeout_s: 600.0 # 10 min max per nav batch
route_manager:
ros__parameters:
save_dir: "/data/routes"
route_name: "route"
# ── Operational notes ─────────────────────────────────────────────────────────
#
# Recording a route (EUC follow-me session):
# ros2 param set /route_recorder route_name "friday_loop"
# ros2 service call /route/start_recording std_srvs/srv/Trigger '{}'
# # ... follow Tee for the full route ...
# ros2 service call /route/stop_recording std_srvs/srv/Trigger '{}'
# ros2 service call /route/save std_srvs/srv/Trigger '{}'
#
# Replaying a route (autonomous):
# ros2 param set /route_replayer route_name "friday_loop"
# ros2 service call /route/load std_srvs/srv/Trigger '{}'
# ros2 service call /route/start_replay std_srvs/srv/Trigger '{}'
# ros2 topic echo /route/replay_status
#
# Listing routes:
# ros2 service call /route/list std_srvs/srv/Trigger '{}'
#
# Route info:
# ros2 param set /route_manager route_name "friday_loop"
# ros2 service call /route/info std_srvs/srv/Trigger '{}'
#
# Delete route:
# ros2 param set /route_manager route_name "friday_loop"
# ros2 service call /route/delete std_srvs/srv/Trigger '{}'
#
# Emergency stop during replay:
# ros2 service call /route/stop std_srvs/srv/Trigger '{}'
# # or: ros2 topic pub /route/pause_cmd std_msgs/msg/Bool '{data: true}'
#
# ── File format (JSON Lines, .jsonl) ─────────────────────────────────────────
#
# {
# "version": 1,
# "name": "friday_loop",
# "recorded_at": "2026-03-01T14:22:00+00:00",
# "waypoint_count": 142,
# "total_distance_m": 1240.5,
# "duration_s": 820.3,
# "waypoints": [
# {"t": 1740839000.1, "lat": 37.7749, "lon": -122.4194,
# "heading_deg": 45.0, "speed_mps": 1.2, "odom_x": 0.0, "odom_y": 0.0,
# "gps_status": 0},
# ...
# ]
# }