|
|
067a871103
|
feat(perception): wheel encoder differential drive odometry (Issue #184)
social-bot integration tests / Lint (flake8 + pep257) (pull_request) Failing after 7s
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
Adds saltybot_bridge_msgs package with WheelTicks.msg (int32 left/right
encoder counts) and a WheelOdomNode that subscribes to
/saltybot/wheel_ticks, integrates midpoint-Euler differential drive
kinematics (handling int32 counter rollover), and publishes
nav_msgs/Odometry on /odom_wheel at 50 Hz with optional TF broadcast.
New files:
jetson/ros2_ws/src/saltybot_bridge_msgs/
msg/WheelTicks.msg
CMakeLists.txt, package.xml
jetson/ros2_ws/src/saltybot_bringup/
saltybot_bringup/_wheel_odom.py — pure kinematics (no ROS2 deps)
saltybot_bringup/wheel_odom_node.py — 50 Hz timer node + TF broadcast
test/test_wheel_odom.py — 42 tests, all passing
Modified:
saltybot_bringup/package.xml — add saltybot_bridge_msgs, nav_msgs deps
saltybot_bringup/setup.py — add wheel_odom console_script entry
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-03 00:41:39 -05:00 |
|
|
|
f5093ecd34
|
feat(perception): HSV color object segmenter — Issue #274
- Add ColorDetection.msg + ColorDetectionArray.msg to saltybot_scene_msgs
- Add _color_segmenter.py: HsvRange/ColorBlob types, COLOR_RANGES defaults,
mask_for_color() (dual-band red wrap), find_color_blobs() with morph open,
contour extraction, area filter and max-blob-per-color limit
- Add color_segment_node.py: subscribes /camera/color/image_raw (BEST_EFFORT),
publishes /saltybot/color_objects (ColorDetectionArray) per frame;
active_colors, min_area_px, max_blobs_per_color params
- Add saltybot_scene_msgs exec_depend to saltybot_bringup/package.xml
- Register color_segmenter console_script in setup.py
- 34/34 unit tests pass (no ROS2 required)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-02 17:32:41 -05:00 |
|
|
|
039355d5bb
|
feat: full_stack.launch.py — one-command autonomous stack bringup
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>
|
2026-03-01 00:56:39 -05:00 |
|
|
|
6420e07487
|
feat: rosbridge WebSocket server for web UI (port 9090)
Adds rosbridge_suite to the Jetson stack so the browser dashboard can
subscribe to ROS2 topics via roslibjs over ws://jetson:9090.
docker-compose.yml
New service: saltybot-rosbridge
- Runs saltybot_bringup/launch/rosbridge.launch.py
- network_mode: host → port 9090 directly reachable on Jetson LAN
- Depends on saltybot-ros2, stm32-bridge, csi-cameras
saltybot_bringup/launch/rosbridge.launch.py
- rosbridge_websocket node (port 9090, params from rosbridge_params.yaml)
- 4× image_transport/republish nodes: compress CSI camera streams
/camera/<name>/image_raw → /camera/<name>/image_raw/compressed (JPEG 75%)
saltybot_bringup/config/rosbridge_params.yaml
Whitelisted topics:
/map /scan /tf /tf_static
/saltybot/imu /saltybot/balance_state
/cmd_vel
/person/*
/camera/*/image_raw/compressed
max_message_size: 10 MB (OccupancyGrid headroom)
saltybot_bringup/SENSORS.md
Added rosbridge connection section with roslibjs snippet,
topic reference table, bandwidth estimates, and throttle_rate tips.
saltybot_bringup/package.xml
Added exec_depend: rosbridge_server, image_transport,
image_transport_plugins (all already installed in Docker image).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-01 00:22:02 -05:00 |
|
|
|
772a70b545
|
feat: Nav2 path planning + obstacle avoidance (Phase 2b)
Integrates Nav2 autonomous navigation stack with RTAB-Map SLAM on Orin
Nano Super. No AMCL/map_server needed — RTAB-Map provides /map + TF.
New files:
- jetson/config/nav2_params.yaml DWB controller,
NavFn planner, RPLIDAR obstacle layer, RealSense voxel layer;
10Hz local / 5Hz global costmap; robot_radius 0.15m, max_vel 1.0 m/s
- jetson/ros2_ws/src/saltybot_bringup/launch/nav2.launch.py
wraps nav2_bringup navigation_launch with saltybot params + BT XML
- jetson/ros2_ws/src/saltybot_bringup/behavior_trees/
navigate_to_pose_with_recovery.xml BT: replan@1Hz, DWB follow,
recovery: clear maps → spin 90° → wait 5s → back up 0.30m
Updated:
- jetson/docker-compose.yml add saltybot-nav2 service
(depends_on: saltybot-ros2)
- jetson/ros2_ws/src/saltybot_bringup/setup.py install behavior_trees/*.xml
- jetson/ros2_ws/src/saltybot_bringup/package.xml add rtabmap_ros + nav2_bringup
- projects/saltybot/SLAM-SETUP-PLAN.md Phase 2b ✅ Done
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-02-28 22:54:24 -05:00 |
|
|
|
76067d6d89
|
feat(bd-a2j): RealSense D435i + RPLIDAR A1M8 ROS2 driver integration
Adds saltybot_bringup ROS2 package with four launch files:
- realsense.launch.py — D435i at 640x480x15fps, IMU unified topic
- rplidar.launch.py — RPLIDAR A1M8 via /dev/rplidar udev symlink
- sensors.launch.py — both sensors + static TF (base_link→laser/camera)
- slam.launch.py — sensors + slam_toolbox online_async (compose entry point)
Sensor config YAMLs (mounted at /config/ in container):
- realsense_d435i.yaml — Nano power-budget settings (15fps, no pointcloud)
- rplidar_a1m8.yaml — Standard scan mode, 115200 baud, laser frame
- slam_toolbox_params.yaml — Nano-tuned (2Hz processing, 5cm resolution)
Fixes docker-compose volume mount: ./ros2_ws/src:/ros2_ws/src
(was ./ros2_ws:/ros2_ws/src — would have double-nested the src directory)
Topic reference and verification commands in SENSORS.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-02-28 17:14:21 -05:00 |
|