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
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
2ba8df17fd
feat: Add Issue #453 - Obstacle memory map with persistent hazard zones
...
- 2D occupancy grid (100x100 cells @ 10cm resolution, configurable)
- LIDAR integration: subscribes to /scan and /odom for real-time obstacle detection
- Ray-casting: marks hit points as obstacles, intermediate points as free space
- Cell states: unknown/free/obstacle/hazard with confidence tracking (0.0–1.0)
- Hazard classification: 3+ detections = permanent hazard (stays in memory)
- Temporal decay: 95%/day for hazards (30-day half-life), 85%/day for obstacles (~21-day)
- Decay interval: applied hourly, cells revert to free when confidence < 20%
- Persistence: auto-saves to /home/seb/saltybot-data/obstacle_map.yaml every 5 minutes
- YAML format: grid metadata + cell array with state/confidence/detection_count/timestamp
- OccupancyGrid publisher: /saltybot/obstacle_map for Nav2 integration at 5 Hz
- Thread-safe: all grid operations protected with locks for concurrent callbacks
- Statistics: hazard/obstacle/free cell counts and coverage percentage
- Dashboard overlay ready: color-coded cells (red=hazard, orange=obstacle, gray=free)
- Configurable via obstacle_memory.yaml: grid size/resolution, range limits, decay rates
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:21:34 -05:00
fb93acee0a
feat: Add Issue #453 - Obstacle memory map with persistent hazard zones
...
- 2D occupancy grid (100x100 cells @ 10cm resolution, configurable)
- LIDAR integration: subscribes to /scan and /odom for real-time obstacle detection
- Ray-casting: marks hit points as obstacles, intermediate points as free space
- Cell states: unknown/free/obstacle/hazard with confidence tracking (0.0–1.0)
- Hazard classification: 3+ detections = permanent hazard (stays in memory)
- Temporal decay: 95%/day for hazards (30-day half-life), 85%/day for obstacles (~21-day)
- Decay interval: applied hourly, cells revert to free when confidence < 20%
- Persistence: auto-saves to /home/seb/saltybot-data/obstacle_map.yaml every 5 minutes
- YAML format: grid metadata + cell array with state/confidence/detection_count/timestamp
- OccupancyGrid publisher: /saltybot/obstacle_map for Nav2 integration at 5 Hz
- Thread-safe: all grid operations protected with locks for concurrent callbacks
- Statistics: hazard/obstacle/free cell counts and coverage percentage
- Dashboard overlay ready: color-coded cells (red=hazard, orange=obstacle, gray=free)
- Configurable via obstacle_memory.yaml: grid size/resolution, range limits, decay rates
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:21:30 -05:00
9027fa9e12
feat: add photo capture package files (Issue #456 )
2026-03-05 09:21:26 -05:00
5e62e81a97
feat: photo capture service (Issue #456 )
2026-03-05 09:20:57 -05:00
sl-android
f4e4f184ef
feat: WiFi mesh handoff - seamless AP roaming (Issue #458 )
...
Add WiFi mesh handoff infrastructure:
WiFiState.msg interface:
- SSID, signal strength (dBm), connection status
- AP address, frequency, link quality
- TX/RX rates, roaming flag
- Available APs for handoff decision
WiFi Monitor Node:
- Signal monitoring via iwconfig/nmcli
- Auto-roam at -70dBm threshold
- Seamless wpa_supplicant roaming
- Gateway ping (8.8.8.8) every 5s
- USB tethering fallback if offline >30s
- TTS warnings for connectivity issues
- Coverage logging with AP transitions
Features:
- Configurable roaming threshold (-70dBm default)
- Gateway connectivity verification
- Offline detection with configurable timeout
- USB tethering auto-activation/deactivation
- Signal strength change logging (>5dBm)
- AP transition logging
- Manual rescan/tether control commands
Topics:
- /saltybot/wifi_state (String)
- /saltybot/speech_text (String warnings)
- /saltybot/wifi_cmd (String commands)
Configuration:
- interface: wlan0
- roam_threshold_dbm: -70
- offline_warning_timeout: 30.0
- target_ssid: SaltyLab
- fallback_tether: true
- coverage_log_file: /tmp/wifi_coverage.log
Roaming Behavior:
- Monitors signal continuously
- When signal < -70dBm, scans for stronger AP
- wpa_supplicant performs seamless handoff
- Logs all AP transitions to coverage file
Fallback Behavior:
- Pings gateway every 5 seconds
- If unreachable for >30s, activates USB tether
- TTS alert: 'Warning: Lost WiFi connectivity...'
- Auto-deactivates when WiFi restored
Coverage Mapping:
- Logs timestamp, SSID, signal, connected status
- Tracks roaming events
- Useful for mesh network optimization
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:20:42 -05:00
dc525d652c
feat: Add gesture recognition system (Issue #454 )
...
Implements hand and body gesture recognition via MediaPipe on Jetson Orin GPU.
- MediaPipe Hands (21-point hand landmarks) + Pose (33-point body landmarks)
- Recognizes: wave, point, stop_palm, thumbs_up, come_here, arms_up, arms_spread
- GestureArray publishing at 10–15 fps on Jetson Orin
- Confidence threshold: 0.7 (configurable)
- Range: 2–5 meters optimal
- GPU acceleration via Jetson Tensor RT
- Integrates with voice command router for multimodal interaction
- Temporal smoothing: history-based motion detection (wave, beckon)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:19:43 -05:00
569ac3fb35
feat: Add gesture recognition system (Issue #454 )
...
Implements hand and body gesture recognition via MediaPipe on Jetson Orin GPU.
- MediaPipe Hands (21-point hand landmarks) + Pose (33-point body landmarks)
- Recognizes: wave, point, stop_palm, thumbs_up, come_here, arms_up, arms_spread
- GestureArray publishing at 10–15 fps on Jetson Orin
- Confidence threshold: 0.7 (configurable)
- Range: 2–5 meters optimal
- GPU acceleration via Jetson Tensor RT
- Integrates with voice command router for multimodal interaction
- Temporal smoothing: history-based motion detection (wave, beckon)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:19:40 -05:00
8538fa2f9d
feat: Add Issue #455 - Smooth velocity controller with S-curve jerk reduction
...
Implement acceleration-limited velocity controller:
- Subscribe to /cmd_vel_raw, publish smoothed /cmd_vel
- Max linear acceleration: 0.5 m/s², angular: 1.0 rad/s²
- Deceleration: 0.8 m/s² (linear), 1.0 rad/s² (angular)
- S-curve jerk limiting with 0.2s ramp time
- E-stop immediate stop capability
- Command priority system (e-stop > teleop > geofence > follow-me > nav2 > patrol)
- Publish /saltybot/velocity_profile for monitoring
- 50Hz update rate (configurable)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:19:33 -05:00
381549b33f
feat: Emergency stop cascade system (Issue #459 )
...
Critical safety system with <50ms latency emergency response.
ROS2 action server /saltybot/estop with unified trigger sources:
- Voice commands: 'stop', 'emergency', 'e-stop'
- Gamepad emergency button
- IMU tilt detection (>45 degrees)
- LiDAR obstacle detection (<0.3m)
- Geofence boundary violation
- Watchdog timeout trigger
- MQTT remote kill signal
Cascade response (within 500ms):
1. Zero cmd_vel in <50ms (priority critical)
2. Disable autonomous mode
3. Face alert animation (emergency_stop)
4. LED red indicator
5. TTS alert announcement
6. Event logging + sensor snapshot
Safety properties:
- Cannot be overridden once triggered
- Manual resume only (gamepad Start or voice 'resume')
- Non-blockable execution (separate thread)
- Redundant trigger sources for reliability
Published topics:
- /saltybot/estop_active (Bool) - System state
- /saltybot/estop_event (String) - Event log (JSON)
Subscribed triggers:
- /camera/imu - Tilt detection
- /scan - Obstacle detection <0.3m
- /voice/command - Voice e-stop/resume
- /gamepad/emergency, /gamepad/start - Gamepad controls
- /saltybot/geofence_violation - Geofence boundary
- /saltybot/watchdog_timeout - Watchdog signal
- /saltybot/mqtt_kill - Remote kill signal
Package structure:
- estop_server: Main emergency stop node
- estop_config.yaml: Timing, triggers, cascade config
- estop.launch.py: Launch with safety parameters
- Unit tests for trigger detection and cascade timing
Logging: /home/seb/saltybot-data/estop/ (JSON format)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:19:31 -05:00
5c05874ed3
feat: sound effects library (Issue #457 )
...
Event-driven audio feedback system with 9 sound events:
- boot_complete: Startup chime (ascending notes)
- person_detected: Subtle detection sound (800Hz sine)
- wake_word: Activation beep (1000Hz)
- low_battery: Warning tone (880Hz double beep)
- obstacle_close: Proximity beeps (rapid 1200Hz pulses)
- trick_complete: Success jingle (ascending arpeggio)
- error: Descending warning tone (800→400Hz)
- charging_start: Power-up tone (rising 400→1200Hz)
- geofence_warning: Boundary alert (950Hz)
Features:
- Priority queue for event handling
- Dynamic sound synthesis if WAV/OGG files missing
- Volume control with quiet/night mode support
- Fade in/out for smooth playback
- Configurable per-event duration and priority
- Caching of loaded audio files
- Background playback thread
- Real-time state publishing
Configuration:
- WAV/OGG file loading from /home/seb/saltybot-data/sounds/
- Programmatic sound generation (sine, chime, descending, power-up, beep, jingle, proximity, alert)
- Numpy/scipy-based synthesis
- YAML configuration for all events
- Volume and fade timing controls
- Sample rate: 16kHz, 16-bit audio
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:19:21 -05:00
35e35a2997
feat: sound effects library (Issue #457 )
...
Event-driven audio feedback system with 9 sound events:
- boot_complete: Startup chime (ascending notes)
- person_detected: Subtle detection sound (800Hz sine)
- wake_word: Activation beep (1000Hz)
- low_battery: Warning tone (880Hz double beep)
- obstacle_close: Proximity beeps (rapid 1200Hz pulses)
- trick_complete: Success jingle (ascending arpeggio)
- error: Descending warning tone (800→400Hz)
- charging_start: Power-up tone (rising 400→1200Hz)
- geofence_warning: Boundary alert (950Hz)
Features:
- Priority queue for event handling
- Dynamic sound synthesis if WAV/OGG files missing
- Volume control with quiet/night mode support
- Fade in/out for smooth playback
- Configurable per-event duration and priority
- Caching of loaded audio files
- Background playback thread
- Real-time state publishing
Configuration:
- WAV/OGG file loading from /home/seb/saltybot-data/sounds/
- Programmatic sound generation (sine, chime, descending, power-up, beep, jingle, proximity, alert)
- Numpy/scipy-based synthesis
- YAML configuration for all events
- Volume and fade timing controls
- Sample rate: 16kHz, 16-bit audio
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:19:19 -05:00
9d36e1007d
feat: Add Issue #455 - Smooth velocity controller with jerk reduction
...
Implement acceleration-limited velocity controller with S-curve jerk limiting:
- Subscribe to /cmd_vel_raw, publish smoothed /cmd_vel
- Max linear acceleration: 0.5 m/s²
- Max angular acceleration: 1.0 rad/s²
- Deceleration: 0.8 m/s² (linear), 1.0 rad/s² (angular)
- S-curve jerk limiting for smooth acceleration profiles (0.2s ramp)
- E-stop immediate stop capability
- Command priority system (e-stop > teleop > geofence > follow-me > nav2 > patrol)
- Publish /saltybot/velocity_profile for monitoring
- Configurable via smooth_velocity_config.yaml
- 50Hz update rate (configurable)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:18:58 -05:00
3ea19fbb99
Merge remote-tracking branch 'origin/sl-jetson/issue-447-full-launch'
...
# Conflicts:
# jetson/ros2_ws/src/saltybot_geofence/saltybot_geofence/geofence_node.py
2026-03-05 09:10:33 -05:00
b9a6eaa3fa
Merge remote-tracking branch 'origin/sl-firmware/issue-445-diagnostics'
...
# Conflicts:
# jetson/ros2_ws/src/saltybot_diagnostics/README.md
# jetson/ros2_ws/src/saltybot_diagnostics/config/diagnostic_checks.yaml
# jetson/ros2_ws/src/saltybot_diagnostics/launch/diagnostics.launch.py
# jetson/ros2_ws/src/saltybot_diagnostics/package.xml
# jetson/ros2_ws/src/saltybot_diagnostics/saltybot_diagnostics/diagnostics_node.py
# jetson/ros2_ws/src/saltybot_diagnostics/setup.py
# jetson/ros2_ws/src/saltybot_diagnostics/test/test_diagnostics.py
2026-03-05 09:10:24 -05:00
3d008ddbb7
Merge remote-tracking branch 'origin/sl-controls/issue-441-geofence'
...
# Conflicts:
# jetson/ros2_ws/src/saltybot_geofence/saltybot_geofence/geofence_node.py
2026-03-05 09:10:17 -05:00
fac873c261
Merge pull request 'feat: night mode (Issue #444 )' ( #451 ) from sl-mechanical/issue-444-night-mode into main
2026-03-05 09:09:14 -05:00
27a95dce0a
Merge pull request 'feat: social memory DB (Issue #443 )' ( #450 ) from sl-webui/issue-443-social-memory into main
2026-03-05 09:09:09 -05:00
1530104e22
Merge pull request 'feat: weather awareness (Issue #442 )' ( #448 ) from sl-android/issue-446-patrol into main
2026-03-05 09:09:00 -05:00
ab5dd97fcb
feat: add consolidated params and stack state monitor (Issue #447 )
2026-03-05 09:07:17 -05:00
41dc80ea7d
feat: Add diagnostic self-test system (Issue #445 )
...
Comprehensive hardware diagnostics and health monitoring for SaltyBot.
Startup hardware checks:
- RPLIDAR, RealSense, VESC, Jabra microphone, STM32 bridge
- Servo controller, WiFi, GPS module
- Disk space, system RAM, CPU temperature
- Boot result via TTS + face animation
Runtime monitoring:
- Temperature thresholds (Orin GPU >80C, VESC >60C)
- Network latency to 8.8.8.8
- System resource tracking (CPU, RAM, disk)
Features:
- Publishes /saltybot/diagnostics (DiagnosticArray)
- JSON logging to /home/seb/saltybot-data/diagnostics/
- Configuration-driven via YAML
- Boot animations and TTS announcements
- Configurable startup and runtime checks
Package structure:
- saltybot_diagnostics: Main diagnostics node
- diagnostic_checks.yaml: Hardware config + thresholds
- diagnostics.launch.py: Launch file with parameters
- Unit tests for check aggregation and logging
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:06:18 -05:00
292c73fb60
feat: Add Issue #441 - Geofence safety with configurable boundary
...
Implement GPS-based geofence safety system:
- Subscribe to /phone/gps and /odom for position tracking
- Support circle (default 50m radius) or polygon geofence
- Three zones: SAFE, WARNING (2m buffer), VIOLATION
- WARNING zone: slow + concern emotion + TTS warning + amber LED
- VIOLATION zone: stop + auto-return + red LED + TTS alert
- Publish /saltybot/geofence_state (UInt8: 0=SAFE, 1=WARNING, 2=VIOLATION)
- LED feedback colors: off (safe), amber (warning), red (violation)
- Auto-return to safe zone when breaching boundary
- Configurable via geofence_config.yaml (type, radius, warning distance, etc)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:05:55 -05:00
c1076b8230
feat: full stack master launch with profiles (Issue #447 )
...
Master saltybot_bringup.launch.py with:
- Profile support (full/minimal/headless) for flexible deployments
- Boot order: hardware → perception → control → social → monitoring
- Dependency-ordered launch with 30-second boot timeout
- Consolidated saltybot_params.yaml with all stack parameters
- Stack state publisher (/saltybot/stack_state)
- Post-launch diagnostics self-test
- Graceful shutdown support (motors first)
Boot sequence (Issue #447 ):
- t=0s: hardware (robot description, STM32 bridge)
- t=2-6s: perception (sensors, cameras, detection, SLAM)
- t=2-14s: control (cmd_vel bridge, follower, Nav2)
- t=17-19s: social & monitoring (rosbridge, stack state)
Features:
- full profile: complete stack (SLAM, Nav2, detection, follower)
- minimal profile: hardware + control only
- headless profile: sensors + control (no CSI cameras)
- Configurable modes: indoor (SLAM+Nav2), outdoor (GPS nav), follow
Parameters consolidated in config/saltybot_params.yaml:
- Hardware (bridge, motors)
- Perception (sensors, detection, SLAM)
- Control (follower, Nav2)
- Social (TTS, gestures, face tracking)
- Monitoring (rosbridge, health checks)
New: stack_state_monitor_node.py (publishes stack boot state)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:05:25 -05:00
2d144f5bcc
feat: full stack master launch with profiles (Issue #447 )
...
Master saltybot_bringup.launch.py with:
- Profile support (full/minimal/headless) for flexible deployments
- Boot order: hardware → perception → control → social → monitoring
- Dependency-ordered launch with 30-second boot timeout
- Consolidated saltybot_params.yaml with all stack parameters
- Stack state publisher (/saltybot/stack_state)
- Post-launch diagnostics self-test
- Graceful shutdown support (motors first)
Boot sequence (Issue #447 ):
- t=0s: hardware (robot description, STM32 bridge)
- t=2-6s: perception (sensors, cameras, detection, SLAM)
- t=2-14s: control (cmd_vel bridge, follower, Nav2)
- t=17-19s: social & monitoring (rosbridge, stack state)
Features:
- full profile: complete stack (SLAM, Nav2, detection, follower)
- minimal profile: hardware + control only
- headless profile: sensors + control (no CSI cameras)
- Configurable modes: indoor (SLAM+Nav2), outdoor (GPS nav), follow
Parameters consolidated in config/saltybot_params.yaml:
- Hardware (bridge, motors)
- Perception (sensors, detection, SLAM)
- Control (follower, Nav2)
- Social (TTS, gestures, face tracking)
- Monitoring (rosbridge, health checks)
New: stack_state_monitor_node.py (publishes stack boot state)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:05:18 -05:00
3830db8225
feat: night mode controller (Issue #444 )
...
Automatic night mode detection and stealth operation:
- Ambient light detection: auto-switch at 50 lux threshold
- Motor speed reduction: 50% speed in stealth mode
- LED control: dim to 5% minimum brightness with slow blue fade
- Face-only mode: disable TTS speaker, show text on face
- IR-based tracking: use IR cameras only (RGB disabled)
- Face brightness: reduce to 30% for low-light visibility
- Manual override: voice commands and gamepad toggle (Y button)
- Smooth transitions: 1-second fade between modes with ramps
Features:
- Hysteresis: 5 lux band prevents mode flickering
- Light sensor smoothing: 5-sample averaging for stability
- Transition manager: smooth motor ramp (2s), LED fade (0.5s)
- Multiple sensor support: RealSense IR, phone ambient sensor
- Stealth LED pattern: slow breathing dim blue (0.3 Hz)
Configuration:
- YAML-based threshold and behavior settings
- Per-subsystem transition timing
- Tracking parameter tuning for IR mode
- Face control with contrast boost
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:05:16 -05:00
7cad97d0db
feat: Add Issue #443 - Social memory database with persistent person knowledge
...
social-bot integration tests / Lint (flake8 + pep257) (pull_request) Failing after 29s
social-bot integration tests / Core integration tests (mock sensors, no GPU) (pull_request) Has been skipped
social-bot integration tests / Latency profiling (GPU, Orin) (pull_request) Has been cancelled
- SQLite database at /home/seb/saltybot-data/social_memory.db
- Tables: persons (name, embeddings, relationship_tier, notes), encounters (person_id, timestamp, transcript, mood)
- ROS2 services: /saltybot/social_memory/lookup, /update, /encounter, /stats
- Automatic tier promotion by encounter count (5→regular, 20→favorite)
- Quality-based promotion: 80%+ positive interactions required
- Custom greetings per relationship tier (stranger/regular/favorite)
- Encounter tracking: transcript, mood, engagement_score, positive_interaction flag
- Face embedding storage support for face recognition integration
- Relationship score computation from interaction history
- Thread-safe concurrent service calls
- Periodic stats publishing on /saltybot/social_memory/stats_update
- Backup/restore functionality with gzip compression
- Full database statistics: person counts by tier, total encounters, database size
- Configurable via social_memory.yaml: thresholds, backup dir, publish interval
Two packages:
- saltybot_social_memory: Service definitions (CMake, ROS2 services)
- saltybot_social_memory_node: Python service server with SQLite backend
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:04:49 -05:00
sl-android
bd46aa5bc3
feat: Patrol mode - autonomous waypoint circuit (Issue #446 )
...
Add autonomous patrol mode with idle behaviors and social integration:
Patrol Node:
- Nav2 /navigate_to_pose integration for autonomous navigation
- Idle behaviors at each waypoint (10-30s pan-tilt sweep + greetings)
- Person detection → pause patrol → social mode → resume
- Battery monitoring: automatic return to dock at <25%
- Teleop override: can be interrupted by joystick control
- Voice commands: 'patrol start/stop' via speech
- Randomized waypoint order for variety
- State publishing to /saltybot/patrol_state
Features:
- Waypoint loading from patrol_params.yaml (x, y, yaw coordinates)
- Random idle durations (configurable 10-30s)
- Pan-tilt sweep and greeting at each waypoint
- Person detection pause with timeout
- Automatic dock return when battery low
- Polling loop for state management
- Voice control integration
State Machine:
IDLE ↔ NAVIGATE → IDLE_BEHAVIOR → (next waypoint)
↓
[Person Detected] → PAUSE_PERSON
↓
[Battery Low] → RETURN_TO_DOCK
↓
[Teleop/Voice] → IDLE
Configuration:
- Waypoints with name, x, y, yaw
- Idle time range (min/max)
- Battery dock threshold (default 25%)
- Person detection pause timeout
Topics:
- /saltybot/patrol_state (String)
- /saltybot/speech_text (String)
- /saltybot/pan_tilt_cmd (String)
- /saltybot/person_detections (Detection2DArray)
- /saltybot/teleop_cmd (String)
- /saltybot/voice_cmd (String)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-05 09:04:10 -05:00
b950528079
Merge pull request 'feat: trick routines (Issue #431 )' ( #440 ) from sl-jetson/issue-431-tricks into main
2026-03-05 09:00:40 -05:00
d657696840
Merge pull request 'feat: system health monitor (Issue #408 )' ( #439 ) from sl-firmware/issue-408-health-monitor into main
2026-03-05 09:00:34 -05:00
27bf0efd94
Merge pull request 'feat: gamepad teleop (Issue #433 )' ( #438 ) from sl-controls/issue-433-gamepad-teleop into main
2026-03-05 08:59:29 -05:00
3b10d77208
Merge pull request 'feat: Android/Termux OpenClaw node (Issue #420 )' ( #437 ) from sl-android/issue-420-termux-openclaw into main
2026-03-05 08:59:24 -05:00
7c287e6f37
Merge pull request 'feat: LED strip controller (Issue #432 )' ( #436 ) from sl-mechanical/issue-432-led-controller into main
2026-03-05 08:59:19 -05:00
2203773377
Merge pull request 'feat: emotion engine (Issue #429 )' ( #435 ) from sl-webui/issue-429-emotion-engine into main
2026-03-05 08:59:14 -05:00