feat(fleet): multi-robot SLAM — map sharing + cooperative exploration (Issue #134) #146
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "sl-perception/issue-134-multi-robot-slam"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Issue #134 — Multi-robot SLAM: Map Sharing + Cooperative Exploration
Summary
saltybot_fleet_msgs— 4 ROS2 msgs + 2 srvs for fleet coordinationsaltybot_fleet— 4 nodes: map broadcaster, fleet manager, frontier detector, cooperative explorer/fleet/mapsArchitecture
Fleet Topics
/fleet/maps/fleet/robots/fleet/merged_map/fleet/exploration_frontiers/fleet/statusNamespace Isolation
Each robot uses
/<robot_id>/namespace for all internal topics. Fleet topics are at/fleet/with no namespace prefix — all robots on same DDS domain subscribe.Transform Alignment
landmark_aligner.py— Horn 2D least-squares on ArUco marker correspondences seen by ≥2 robots. Aligns each robot's map frame to the reference robot'sfleet_mapframe.Launch
Test plan
colcon build --packages-select saltybot_fleet_msgs saltybot_fleet— zero errorsros2 topic hz /fleet/mapsshows 1 Hz chunksros2 topic echo /fleet/merged_mapshows combined gridros2 service call /fleet/request_frontier ...returns a frontierros2 run saltybot_fleet fleet_statusrenders live fleet tableexploration:=true→ fleet_explorer requests frontier → Nav2 goal sent🤖 Generated with Claude Code
New packages: saltybot_fleet_msgs — 4 msgs (RobotInfo, MapChunk, Frontier, FrontierArray) + 2 srvs (RegisterRobot, RequestFrontier) saltybot_fleet — 4 nodes + 2 launch files + config + CLI tool Nodes: map_broadcaster_node — zlib-compress local OccupancyGrid → /fleet/maps @ 1Hz + /fleet/robots heartbeat with battery/status fleet_manager_node — robot registry, MapMerger (multi-grid SE2-aligned merge), frontier aggregation, /fleet/request_frontier service, heartbeat timeout + stale frontier re-assignment frontier_detector_node — scipy label-based frontier detection on merged map → /fleet/exploration_frontiers_raw fleet_explorer_node — Nav2 NavigateToPose cooperative exploration state machine: IDLE→request→NAVIGATING→ARRIVED→IDLE + STALLED backoff Supporting modules: map_compressor.py — binary serialise + zlib OccupancyGrid encode/decode map_merger.py — SE(2)-transform-aware multi-grid merge with conservative obstacle inflation (occupied beats free on conflict) frontier_detector.py — numpy frontier mask + scipy connected-components + scoring landmark_aligner.py — ArUco-landmark SE(2) estimation (Horn 2D least-squares) to align robot map frames into common fleet_map frame Topic layout: /fleet/maps MapChunk per-robot compressed grids /fleet/robots RobotInfo heartbeats + status /fleet/merged_map OccupancyGrid coordinator merged output /fleet/exploration_frontiers FrontierArray consolidated frontiers /fleet/status String (JSON) coordinator health /<robot_ns>/rtabmap/map input per robot /<robot_ns>/rtabmap/odom input per robot /<robot_ns>/navigate_to_pose Nav2 action per robot Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>