d97fa5fab0
Merge remote-tracking branch 'origin/sl-webui/issue-482-behavior-tree'
...
# Conflicts:
# jetson/ros2_ws/src/saltybot_bringup/behavior_trees/autonomous_coordinator.xml
# jetson/ros2_ws/src/saltybot_bringup/launch/autonomous_mode.launch.py
2026-03-06 11:43:26 -05:00
a3d3ea1471
Merge remote-tracking branch 'origin/sl-perception/issue-478-costmaps'
...
# Conflicts:
# jetson/ros2_ws/src/saltybot_bringup/config/nav2_params.yaml
2026-03-06 11:43:11 -05:00
e1248f92b9
Merge pull request 'feat: Face display animations on STM32 LCD (Issue #507 )' ( #508 ) from sl-android/issue-507-face-animations into main
2026-03-06 10:57:28 -05:00
6f3dd46285
feat: Add Issue #503 - Audio pipeline with Jabra SPEAK 810
...
Implement full audio pipeline with:
- Jabra SPEAK 810 USB audio I/O (mic + speaker)
- openwakeword 'Hey Salty' wake word detection
- whisper.cpp GPU-accelerated STT (small/base/medium/large models)
- piper TTS synthesis and playback
- Audio state machine: listening → processing → speaking
- MQTT status and state reporting
- Real-time latency metrics tracking
ROS2 Topics Published:
- /saltybot/speech/transcribed_text: STT output for voice router
- /saltybot/audio/state: Current audio state
- /saltybot/audio/status: JSON metrics with latencies
MQTT Topics:
- saltybot/audio/state: Current state (listening/processing/speaking)
- saltybot/audio/status: Complete status JSON
Configuration parameters in yaml:
- device_name: Jabra device pattern
- wake_word_threshold: 0.5 (tunable)
- whisper_model: small/base/medium/large
- mqtt_enabled: true/false with broker config
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-06 10:30:58 -05:00
5cea0812d5
feat: Add Issue #505 - 24V Charging Dock Hardware Design
...
- Design specification: 24V DC power delivery (upgraded from 5V Issue #159 )
- ArUco marker ID 42 (15cm frame) for precision alignment
- Spring-loaded contact pads with V-channel guide rails
- Comprehensive BOM for 24V PSU, wiring, LED status circuit
- Compatible with docking node #489 (ROS2 integration)
- 3D-printable PETG frame (base, back wall, guide rails, brackets)
- Electrical: 240W Mean Well IRM-240-24 PSU, 20A current capacity
- Safety: Fused output, varistor protection, soft-start capable
- Integration: MQTT status reporting, GPIO LED control (Jetson Orin NX)
Files:
- ISSUE_505_CHARGING_DOCK_24V_DESIGN.md: Complete design spec (mechanical, electrical, assembly)
- charging_dock_505_BOM.csv: Procurement list with sourcing info
Next: CAD implementation (charging_dock_505.scad, receiver variant)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-06 10:30:44 -05:00
sl-android
49628bcc61
feat: Add Issue #507 - Face display animations on STM32 LCD
...
Implements expressive face animations with 5 core emotions (happy/sad/curious/angry/sleeping) and smooth transitions on small LCD displays.
Features:
- State machine with smooth 0.5s emotion transitions (ease-in-out cubic easing)
- Automatic idle blinking (4-6s intervals, 100-150ms duration per blink)
- UART command interface via USART3 @ 115200 (text-based protocol)
- 30Hz target refresh rate via systick integration
- Low-level LCD abstraction supporting monochrome and RGB565
- Rendering primitives: pixel, line (Bresenham), circle (midpoint), filled rect
Architecture:
- face_lcd.h/c: Hardware-agnostic framebuffer & display driver
- face_animation.h/c: Emotion state machine & parameterized face rendering
- face_uart.h/c: UART command parser (HAPPY/SAD/CURIOUS/ANGRY/SLEEP/NEUTRAL/BLINK/STATUS)
- Unit tests (14 test cases): emotion transitions, blinking, rendering, all emotions
Integration:
- main.c: Added includes, initialization (servo_init), systick tick, main loop processing
- Pending: LCD hardware initialization (SPI/I2C config, display controller setup)
Files: 9 new (headers, source, tests, docs), 1 modified (main.c)
Lines: ~1450 total (345 headers, 650 source, 350 tests, 900 docs)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-06 10:27:36 -05:00
062c05cac0
feat: Add Issue #502 - Headscale VPN auto-connect on Orin
...
Configure Jetson Orin with Tailscale client connecting to Headscale
coordination server at tailscale.vayrette.com:8180. Device registers
as 'saltylab-orin' with persistent auth key for unattended login.
Features:
- systemd auto-start and restart on WiFi drops
- Persistent auth key storage at /opt/saltybot/tailscale-auth.key
- SSH + HTTP access over Tailscale tailnet (encrypted WireGuard)
- IP forwarding enabled for relay/exit node capability
- WiFi resilience with aggressive restart policy
- MQTT reporting of VPN status, IP, and connection type
Components added:
- jetson/scripts/setup-tailscale.sh: Tailscale package installation
- jetson/scripts/headscale-auth-helper.sh: Auth key management utility
- jetson/systemd/tailscale-vpn.service: systemd service unit
- jetson/docs/headscale-vpn-setup.md: Comprehensive setup documentation
- saltybot_cellular/vpn_status_node.py: ROS2 node for MQTT reporting
Updated:
- jetson/systemd/install_systemd.sh: Include tailscale-vpn.service
- jetson/scripts/setup-jetson.sh: Add Tailscale setup steps
Access patterns:
- SSH: ssh user@saltylab-orin.tail12345.ts.net
- HTTP: http://saltylab-orin.tail12345.ts.net:port
- Direct IP: 100.x.x.x (Tailscale allocated address)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-06 10:25:04 -05:00
767f377120
feat: Add Issue #504 - Integration test suite with launch_testing
...
Create saltybot_tests package with comprehensive automated testing:
Test Coverage:
- Node startup verification (all critical nodes within 30s)
- Topic publishing verification
- TF tree completeness (all transforms present)
- Sensor health checks (RPLIDAR, RealSense, IMU)
- Perception pipeline (person detection availability)
- Navigation stack (odometry, transforms)
- System stability (30-second no-crash test)
- Graceful shutdown verification
Features:
- launch_testing framework for automated startup tests
- NodeChecker: wait for nodes in ROS graph
- TFChecker: verify TF tree completeness
- TopicMonitor: track message rates and counts
- Follow mode tests (minimal hardware deps)
- Subsystem-specific tests for sensor health
- Comprehensive README with troubleshooting
Usage:
pytest src/saltybot_tests/test/test_launch.py -v -s
or
colcon test --packages-select saltybot_tests
Performance Targets:
- Node startup: <30s (follow mode)
- RPLIDAR: 10 Hz scan rate
- RealSense: 30 Hz RGB + depth
- Person detection: 5 Hz
- System stability: 30s no-crash validation
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-06 10:22:38 -05:00
80ee9ece87
Merge pull request 'feat: Voice command router (Issue #491 )' ( #499 ) from sl-webui/issue-491-voice-router into main
2026-03-05 19:25:32 -05:00
Sebastien Vayrette
868b453777
fix: resolve merge conflicts for voice router PR #499 (keep both docking + mission logging)
2026-03-05 19:25:23 -05:00
83e3033abe
Merge pull request 'feat: OTA firmware update (Issue #492 )' ( #500 ) from sl-jetson/issue-492-ota-update into main
2026-03-05 17:24:58 -05:00
5f6a13ccca
Merge pull request 'feat: Multi-sensor fusion (Issue #490 )' ( #498 ) from sl-perception/issue-490-sensor-fusion into main
2026-03-05 17:24:03 -05:00
4dc18201aa
Merge pull request 'feat: Docking station behavior (Issue #489 )' ( #497 ) from sl-controls/issue-489-docking into main
2026-03-05 17:16:37 -05:00
2dd03a245d
Merge pull request 'feat: ROS2 bag recording for mission logging (Issue #488 )' ( #496 ) from sl-firmware/issue-488-bag-recording into main
2026-03-05 17:16:22 -05:00
340248a0d2
feat: Add docking state publisher and update configuration (Issue #489 )
...
- Add /saltybot/docking_state publisher (std_msgs/String) for monitoring
- Update docking_params.yaml battery_low_pct: 15% → 20%
- Add Issue #475 references for conservative servo speeds
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 17:08:48 -05:00
7a4930e8d2
feat: ROS2 bag recording for mission logging (Issue #488 )
...
Implement automatic mission logging with bag recorder:
- Auto-records to ~/.saltybot-data/bags/ with 30min rotation
- Records mission-critical topics: /scan, /cmd_vel, /odom, /tf, /camera/color/image_raw/compressed, /saltybot/diagnostics
- MCAP format (preferred) with fallback to sqlite3 with zstd compression
- Services: /saltybot/save_bag, /saltybot/start_recording, /saltybot/stop_recording
- FIFO 20GB disk limit with automatic cleanup of oldest bags
- Auto-starts on launch, auto-saves on graceful shutdown
Changes:
- Updated bag_recorder_node.py with new parameters and services
- Changed default bag_dir to ~/.saltybot-data/bags/
- Set max_storage_gb to 20 (FIFO limit)
- Changed storage_format to MCAP by default
- Added start/stop recording service callbacks
- Updated package.xml description for mission logging
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 17:08:21 -05:00
b986702aed
feat: Docking station behavior for auto-charging (Issue #489 )
...
- Integrate saltybot_docking package into full_stack.launch.py
- Auto-trigger docking when battery drops to 20% (configurable via battery_low_pct)
- Launch docking at t=7s (after sensors, before Nav2)
- Add /saltybot/docking_state publisher (std_msgs/String) for state monitoring
- Update docking_params.yaml:
- battery_low_pct: 15% → 20% per Issue #489
- Add references to Issue #475 for conservative FC+hoverboard speeds
- Docking behavior includes:
- ArUco marker or IR beacon detection for dock location
- Nav2-based approach to pre-dock pose (~1m away)
- Visual servoing final alignment with contact detection
- Auto-undocking on full charge (80%) or command
- Integration with power management for mission interruption/resumption
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 17:08:21 -05:00
a4285b5ecd
feat: Docking station behavior for auto-charging (Issue #489 )
...
- Integrate saltybot_docking package into full_stack.launch.py
- Auto-trigger docking when battery drops to 20% (configurable via battery_low_pct)
- Launch docking at t=7s (after sensors, before Nav2)
- Add /saltybot/docking_state publisher (std_msgs/String) for state monitoring
- Update docking_params.yaml:
- battery_low_pct: 15% → 20% per Issue #489
- Add references to Issue #475 for conservative FC+hoverboard speeds
- Docking behavior includes:
- ArUco marker or IR beacon detection for dock location
- Nav2-based approach to pre-dock pose (~1m away)
- Visual servoing final alignment with contact detection
- Auto-undocking on full charge (80%) or command
- Integration with power management for mission interruption/resumption
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 17:08:15 -05:00
d770cb99a3
feat: Multi-sensor fusion for obstacle avoidance (Issue #490 )
...
- saltybot_sensor_fusion: ROS2 node for LIDAR + depth sensor fusion
- Fuses RPLIDAR A1M8 (360° 2D) + RealSense D435i (front 87° 3D)
- Message filters for time-synchronized sensor inputs
- Smart blind spot handling: rear/sides LIDAR-only, front uses both
- Publishes /scan_fused (unified LaserScan) + PointCloud2 for voxel layer
- Configurable front sector angle (±45°), range multiplier, max range limit
- Parameters: depth_range_multiplier=0.9 (safety margin), max_range=5m
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 17:05:25 -05:00
fabfd5e974
feat: TTS personality engine (Issue #494 )
...
Implement context-aware text-to-speech with emotion-driven expression for SaltyBot.
Features:
✓ Context-aware greetings (time of day, person names, emotion)
✓ Priority queue management (safety > social > idle)
✓ Emotion-based rate/pitch modulation (happy: faster+higher, sad: slower+lower)
✓ Integration with emotion engine (Issue #429 ) and TTS service (Issue #421 )
✓ Configurable personality parameters
✓ Person recognition for personalized responses
✓ Queue management with 16-item buffer
Architecture:
Node: tts_personality_node
- Subscribes: /saltybot/tts_request, /saltybot/emotion_state, /saltybot/person_detected
- Publishes: /saltybot/tts_command (formatted for TTS service), /saltybot/personality_state
- Runs worker thread for asynchronous queue processing
Personality Parameters:
- Name: "Luna" (default, configurable)
- Speed modulation: happy=1.1x, sad=0.9x, neutral=1.0x
- Pitch modulation: happy=1.15x, sad=0.85x, neutral=1.0x
- Time-based greetings for 4 periods (morning, afternoon, evening, night)
- Known people mapping for personalization
Queue Priority Levels:
- SAFETY (3): Emergency/safety messages
- SOCIAL (2): Greetings and interactions
- IDLE (1): Commentary and chatter
- NORMAL (0): Default messages
Files Created:
- saltybot_tts_personality package with main personality node
- config/tts_personality_params.yaml with configurable parameters
- launch/tts_personality.launch.py for easy startup
- Unit tests for personality context and emotion handling
- Comprehensive README with usage examples
Integration Points:
- Emotion engine (Issue #429 ): Listens to emotion updates
- TTS service (Issue #421 ): Publishes formatted commands
- Jabra SPEAK 810: Output audio device
- Person tracking: Uses detected person names
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 17:05:11 -05:00
6d6909d9d9
feat: Voice command router (Issue #491 )
...
Natural language voice command routing with fuzzy matching for speech variations.
Supported Commands:
- Follow me / Come with me
- Stop / Halt / Freeze
- Go home / Return to dock / Charge
- Patrol / Autonomous mode
- Come here / Approach
- Sit / Sit down
- Spin / Rotate / Turn around
- Dance / Groove
- Take photo / Picture / Smile
- What's that / Identify / Recognize
- Battery status / Battery level
Features:
- Fuzzy matching (rapidfuzz token_set_ratio) with 75% threshold
- Multiple pattern support per command for natural variations
- Three routing types: velocity (/cmd_vel), actions (/saltybot/action_command), services
- Command monitoring via /saltybot/voice_command
- Graceful handling of unrecognized speech
Architecture:
- Input: /saltybot/speech/transcribed_text (lowercase text)
- Fuzzy match against 11 command groups with 40+ patterns
- Route to: /cmd_vel (velocity), /saltybot/action_command (actions), or services
Files:
- saltybot_voice_router_node.py: Main router with fuzzy matching
- launch/voice_router.launch.py: Launch configuration
- VOICE_ROUTER_README.md: Usage documentation
Dependencies:
- rapidfuzz: Fuzzy string matching for natural speech handling
- rclpy, std_msgs, geometry_msgs: ROS2 core
Performance: <100ms per command (fuzzy matching + routing)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 17:05:02 -05:00
d79e38eb5b
feat: OTA firmware update (Issue #492 )
...
Complete over-the-air (OTA) firmware update system with:
Features:
- Downloads releases from Gitea (seb/saltylab-firmware)
- Automatic colcon build in staging directory
- Symlink-based atomic deployment
- ROS2 service restart via systemd
- Automatic rollback on build failure
- Version tracking in ~/.saltybot-data/versions.json
- Update history with timestamps
Safety:
- Blocks updates if robot velocity > 0.05 m/s
- Velocity monitoring via odometry subscription
- Backup before update for recovery
Triggers:
- MQTT /saltybot/ota_command: 'check', 'update:<version>', 'rollback'
- /saltybot/ota_status: JSON status updates
- Dashboard integration ready
Configuration:
- Gitea API base, repo info, directories
- Build timeout: 3600s (1 hour)
- Service restart automation
- Backup retention policy
ROS2 package structure complete with launch files and config.
2026-03-05 17:04:35 -05:00
7b22141142
feat: OTA firmware update (Issue #492 )
...
Complete over-the-air (OTA) firmware update system with:
Features:
- Downloads releases from Gitea (seb/saltylab-firmware)
- Automatic colcon build in staging directory
- Symlink-based atomic deployment
- ROS2 service restart via systemd
- Automatic rollback on build failure
- Version tracking in ~/.saltybot-data/versions.json
- Update history with timestamps
Safety:
- Blocks updates if robot velocity > 0.05 m/s
- Velocity monitoring via odometry subscription
- Backup before update for recovery
Triggers:
- MQTT /saltybot/ota_command: 'check', 'update:<version>', 'rollback'
- /saltybot/ota_status: JSON status updates
- Dashboard integration ready
Configuration:
- Gitea API base, repo info, directories
- Build timeout: 3600s (1 hour)
- Service restart automation
- Backup retention policy
ROS2 package structure complete with launch files and config.
2026-03-05 17:04:27 -05:00
285178b2f9
feat: Configure Nav2 navigation stack conservative speeds (Issue #475 )
...
- Update max_vel_x to 0.3 m/s (conservative for FC + hoverboard ESC)
- Update max_vel_theta to 0.5 rad/s (conservative for FC + hoverboard ESC)
- Set robot_radius to 0.22 m for 0.4m x 0.4m footprint
- Configure velocity smoother with conservative limits
- Both DWB local planner and velocity smoother updated for consistency
- RPLIDAR (/scan) + depth_to_laserscan (/depth_scan) costmap layers enabled
- NavFn global planner, DWB local planner configured
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:50:41 -05:00
56a48b4e25
Merge PR #486 : Issue #480 - Map save/load
2026-03-05 14:48:59 -05:00
8f0215d461
Merge PR #485 : Issue #483 - Monitoring dashboard
2026-03-05 14:48:46 -05:00
f5877756d5
feat: Map save/load service for SLAM Toolbox persistence (Issue #480 )
...
Implement automatic map serialization and persistence for slam_toolbox:
- New SlamToolboxPersistenceNode with auto-save every 5 minutes
- Auto-load most recent map on startup
- Services: /saltybot/save_map, /saltybot/load_map, /saltybot/list_maps
- Export to Nav2-compatible YAML + PGM format
- Stores maps in ~/.saltybot-data/maps/ with .posegraph format
- Integrates with slam_toolbox serialize/deserialize services
Changes:
- Created saltybot_mapping/slam_toolbox_persistence.py
- Added slam_toolbox_persistence.launch.py
- Updated slam.launch.py to include persistence service
- Updated CMakeLists.txt to install new executable
- Added slam_toolbox dependency to package.xml
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:46:33 -05:00
33036e2967
feat: Add URDF robot description (Issue #477 )
2026-03-05 14:43:01 -05:00
50d1ebbdcc
feat: Behavior tree coordinator for autonomous mode (Issue #482 )
...
State machine: idle → patrol → investigate → interact → return
- IDLE: Waiting for activation or battery recovery
- PATROL: Autonomous patrolling with curiosity-driven exploration (#470 )
- INVESTIGATE: Approach and track detected persons
- INTERACT: Social interaction with face recognition and gestures
- RETURN: Navigate back to home/dock with recovery behaviors
Integrations:
- Patrol mode (#446 ): Waypoint routes with geofence (#441 )
- Curiosity behavior (#470 ): Autonomous exploration
- Person following: Approach detected persons
- Emergency stop cascade (#459 ): Highest priority safety
- Geofence constraint (#441 ): Keep patrol within boundaries
Blackboard variables:
- battery_level: Current battery percentage
- person_detected: Person detection state
- current_mode: Current behavior tree state
- home_pose: Home/dock location
Files:
- behavior_trees/autonomous_coordinator.xml: BehaviorTree definition
- launch/autonomous_mode.launch.py: Full launch setup
- saltybot_bringup/bt_nodes.py: Custom BT node plugins
- BEHAVIOR_TREE_README.md: Documentation
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:42:57 -05:00
60e16dc6ca
feat: Add URDF robot description (Issue #477 )
2026-03-05 14:42:49 -05:00
e66bcc2ab0
feat: Configure Nav2 costmaps (Issue #478 )
...
- Create nav2_params.yaml in saltybot_bringup/config/
- Global costmap: static layer + obstacle layer with /scan + /depth_scan
- Local costmap: rolling window 3m×3m, voxel layer + obstacle layer
- Inflation radius: 0.3m (robot_radius 0.15m + 0.15m padding)
- Robot footprint: 0.4m × 0.4m square [-0.2, +0.2] in x, y
- RPLIDAR A1M8 at /scan (360° LaserScan)
- RealSense D435i via depth_to_laserscan at /depth_scan
- Surround vision support for dynamic obstacles
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:41:41 -05:00
7379aa459c
feat: Configure Nav2 recovery behaviors (Issue #479 )
...
Implement conservative recovery behaviors for autonomous navigation on FC + Hoverboard ESC drivetrain.
Recovery Sequence (round-robin, 6 retries):
1. Clear costmaps (local + global)
2. Spin 90° @ 0.5 rad/s max (conservative for self-balancer)
3. Wait 5 seconds (allow dynamic obstacles to move)
4. Backup 0.3m @ 0.1 m/s (deadlock escape, very conservative)
Configuration Details:
- backup: 0.3m reverse, 0.1 m/s speed, 0.15 m/s max, 5s timeout
- spin: 90° rotation, 0.5 rad/s max angular velocity, 1.6 rad/s² accel
- wait: 5-second pause for obstacle clearing
- progress_checker: 20cm minimum movement threshold in 10s window
Safety:
- E-stop (Issue #459 ) takes priority over recovery behaviors
- Emergency stop system runs independently on STM32 firmware
- Conservative speeds for FC + Hoverboard ESC stability
Files Modified:
- jetson/config/nav2_params.yaml: behavior_server parameters
- jetson/ros2_ws/src/saltybot_bringup/behavior_trees/navigate_to_pose_with_recovery.xml: BT updates
- jetson/config/RECOVERY_BEHAVIORS.md: Configuration documentation
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:41:19 -05:00
dd459c0df7
feat: Configure Nav2 recovery behaviors (Issue #479 )
...
Implement conservative recovery behaviors for autonomous navigation on FC + Hoverboard ESC drivetrain.
Recovery Sequence (round-robin, 6 retries):
1. Clear costmaps (local + global)
2. Spin 90° @ 0.5 rad/s max (conservative for self-balancer)
3. Wait 5 seconds (allow dynamic obstacles to move)
4. Backup 0.3m @ 0.1 m/s (deadlock escape, very conservative)
Configuration Details:
- backup: 0.3m reverse, 0.1 m/s speed, 0.15 m/s max, 5s timeout
- spin: 90° rotation, 0.5 rad/s max angular velocity, 1.6 rad/s² accel
- wait: 5-second pause for obstacle clearing
- progress_checker: 20cm minimum movement threshold in 10s window
Safety:
- E-stop (Issue #459 ) takes priority over recovery behaviors
- Emergency stop system runs independently on STM32 firmware
- Conservative speeds for FC + Hoverboard ESC stability
Files Modified:
- jetson/config/nav2_params.yaml: behavior_server parameters
- jetson/ros2_ws/src/saltybot_bringup/behavior_trees/navigate_to_pose_with_recovery.xml: BT updates
- jetson/config/RECOVERY_BEHAVIORS.md: Configuration documentation
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:41:11 -05:00
fd742f6890
feat: Configure Nav2 recovery behaviors (Issue #479 )
...
Implement conservative recovery behaviors for autonomous navigation on FC + Hoverboard ESC drivetrain.
Recovery Sequence (round-robin, 6 retries):
1. Clear costmaps (local + global)
2. Spin 90° @ 0.5 rad/s max (conservative for self-balancer)
3. Wait 5 seconds (allow dynamic obstacles to move)
4. Backup 0.3m @ 0.1 m/s (deadlock escape, very conservative)
Configuration:
- backup: 0.3m reverse, 0.1 m/s speed, 5s timeout
- spin: 90° rotation, 0.5 rad/s max angular velocity
- wait: 5-second pause for obstacle clearing
- progress_checker: 20cm minimum movement threshold in 10s window
Safety:
- E-stop (Issue #459 ) takes priority over recovery behaviors
- Emergency stop system runs independently on STM32 firmware
- Conservative speeds for FC + Hoverboard ESC stability
Files Modified:
- jetson/config/nav2_params.yaml: behavior_server parameters
- jetson/ros2_ws/src/saltybot_bringup/behavior_trees/navigate_to_pose_with_recovery.xml: BT updates
- jetson/config/RECOVERY_BEHAVIORS.md: Configuration documentation
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:40:45 -05:00
d7051fe854
feat: Add Issue #467 - Power management supervisor with battery protection
...
social-bot integration tests / Lint (flake8 + pep257) (push) Failing after 11s
social-bot integration tests / Core integration tests (mock sensors, no GPU) (push) Has been skipped
social-bot integration tests / Latency profiling (GPU, Orin) (push) Has been cancelled
- New ROS2 node: power_supervisor_node for battery state monitoring
- Battery thresholds: 30% warning, 20% dock search, 10% graceful shutdown, 5% force kill
- Charge cycle tracking and battery health estimation
- CSV logging to battery_log.csv for external analysis
- Publishes /saltybot/power_state for MQTT relay
- Graceful shutdown cascade: save state, stop motors, disarm on critical low battery
- Replaces/extends Issue #125 battery_node with supervisor-level power management
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 14:34:37 -05:00
6293d2ec60
Merge Issue #473 : event logger - structured JSON activity logging
2026-03-05 14:22:45 -05:00
b178614e6e
Merge Issue #468 : object detection - perception system enhancements
2026-03-05 14:22:32 -05:00
e26301c7ca
Merge Issue #472 : dance choreography - behavioral sequences
2026-03-05 14:22:06 -05:00
c96c68a7c4
feat: YOLOv8n object detection with RealSense depth integration (Issue #468 )
...
- saltybot_object_detection_msgs: DetectedObject, DetectedObjectArray, QueryObjects.srv
- saltybot_object_detection: YOLOv8n TensorRT FP16 node with depth projection
- Message filters for RGB-depth sync, TF2 transform to base_link
- Configurable confidence and class filtering (COCO 80 classes)
- Query service for voice integration ("whats in front of you")
- TensorRT build script with ONNX fallback
- Launch file with parameter configuration
- Full stack integration at t=6s (30 FPS target alongside person tracker)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 12:14:50 -05:00
sl-android
2e9fd6fa4c
feat: curiosity behavior — autonomous exploration when idle (Issue #470 )
...
- Frontier exploration toward unexplored areas
- Activates when idle >60s + no people detected
- Turns toward detected sounds via audio_direction node
- Approaches colorful/moving objects
- Self-narrates findings via TTS
- Respects geofence and obstacle boundaries
- 10-minute max duration with auto-return
- Configurable curiosity level (0-1.0)
- Publishes /saltybot/curiosity_state
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 12:10:33 -05:00
0c03060016
feat: centralized parameter server + dynamic reconfiguration (Issue #471 )
...
ROS2 node and WebUI component for centralized dynamic parameter configuration.
- Parameter server node with validation, range checks, and persistence
- Organized into groups: hardware/perception/controls/social/safety/debug
- Service-based API for dynamic reconfiguration (/saltybot/set_param)
- Named presets: indoor/outdoor/demo/debug
- WebUI component with parameter browsing, editing, and preset loading
- Safety parameter confirmation dialogs
- Real-time parameter metadata display (type, range, description)
Files:
- jetson/ros2_ws/src/saltybot_param_server/ - ROS2 parameter server node
- ui/social-bot/src/components/ParameterServer.jsx - WebUI component
- App.jsx - Integrated into CONFIG tab group as 'Parameters'
Build status: ✅ PASSING (127 modules)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 12:10:04 -05:00
00e632ecbf
feat: centralized parameter server + dynamic reconfiguration (Issue #471 )
...
ROS2 node and WebUI component for centralized dynamic parameter configuration.
- Parameter server node with validation, range checks, and persistence
- Organized into groups: hardware/perception/controls/social/safety/debug
- Service-based API for dynamic reconfiguration (/saltybot/set_param)
- Named presets: indoor/outdoor/demo/debug
- WebUI component with parameter browsing, editing, and preset loading
- Safety parameter confirmation dialogs
- Real-time parameter metadata display (type, range, description)
Files:
- jetson/ros2_ws/src/saltybot_param_server/ - ROS2 parameter server node
- ui/social-bot/src/components/ParameterServer.jsx - WebUI component
- App.jsx - Integrated into CONFIG tab group as 'Parameters'
Build status: ✅ PASSING (127 modules)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 12:09:45 -05:00
d421d63c6f
feat: Add Issue #473 - Event Logger with structured JSON logging
...
Comprehensive event logging system for SaltyBot with:
Features:
- MQTT subscription to /saltybot/* state topics (9 event types)
- Structured JSON event logging to ~/.saltybot-data/events/YYYY-MM-DD.jsonl
- Event types: encounter, voice_command, trick, e-stop, geofence, dock, error, boot, shutdown
- Query service (time range + type filter)
- Stats publisher (/saltybot/event_stats) with daily summaries
- Dashboard live feed (/saltybot/event_feed)
- Automatic log rotation: compress >7 days, delete >90 days
- CSV export functionality
- Thread-safe event processing
Components:
- EventLogger ROS2 node with background timers
- Event dataclass with timestamp/type/source/data
- File-based storage (JSONL + compressed archives)
- Query API for time/type filtering
- CSV export utility
- Comprehensive unit tests (15 test cases)
Configuration:
- Data directory: ~/.saltybot-data/events
- Rotation: 7 days compress, 90 days delete
- Stats interval: 60 seconds
- Rotation check: hourly
Launch:
- event_logger.launch.py - Standalone launch
- Config: event_logger.yaml with topic mappings
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 12:09:07 -05:00
02e9b15e6f
Merge remote-tracking branch 'origin/sl-webui/issue-453-obstacle-map'
2026-03-05 11:09:46 -05:00
c25d63772a
Merge remote-tracking branch 'origin/sl-jetson/issue-456-photo-capture'
...
# Conflicts:
# jetson/ros2_ws/src/saltybot_obstacle_memory/package.xml
# jetson/ros2_ws/src/saltybot_photo_capture/package.xml
# jetson/ros2_ws/src/saltybot_photo_capture/setup.py
2026-03-05 11:09:41 -05:00
b38f948844
Merge remote-tracking branch 'origin/sl-controls/issue-455-smooth-velocity'
...
# Conflicts:
# jetson/ros2_ws/src/saltybot_smooth_velocity/config/smooth_velocity_config.yaml
# jetson/ros2_ws/src/saltybot_smooth_velocity/launch/smooth_velocity.launch.py
# jetson/ros2_ws/src/saltybot_smooth_velocity/package.xml
# jetson/ros2_ws/src/saltybot_smooth_velocity/saltybot_smooth_velocity/smooth_velocity_node.py
# jetson/ros2_ws/src/saltybot_smooth_velocity/setup.cfg
# jetson/ros2_ws/src/saltybot_smooth_velocity/setup.py
2026-03-05 11:09:32 -05:00
3ecf334642
Merge pull request 'feat: emergency stop cascade (Issue #459 )' ( #466 ) from sl-firmware/issue-459-estop into main
2026-03-05 11:08:01 -05:00
5a4150a2d0
Merge pull request 'feat: WiFi mesh handoff (Issue #458 )' ( #462 ) from sl-android/issue-458-wifi-handoff into main
2026-03-05 11:07:26 -05:00
270507ad49
Merge pull request 'feat: Add gesture recognition system (Issue #454 )' ( #461 ) from sl-webui/sl-perception/issue-454-gestures into main
2026-03-05 11:07:13 -05:00
f47b01eff6
Merge pull request 'feat: sound effects (Issue #457 )' ( #460 ) from sl-mechanical/issue-457-sound-effects into main
2026-03-05 11:07:11 -05:00