A realistic demonstration of the SDKβs capabilities using Gazebo (or Ignition) and ROS2. The simulation will showcase multiple robots that coordinate via the offlineβfirst SDK without a central server, performing a collaborative task (e.g., distributed mapping, formation control, or searchβandβrescue).
- Validate the SDK in a nearβrealβworld scenario.
- Provide a reference implementation for users to adapt.
- Measure performance (latency, bandwidth, convergence time) under simulated network conditions.
- Demonstrate robustness to network partitions and agent failures.
- Environment: Indoor warehouse with obstacles.
- Agents: 3β5 differentialβdrive robots.
- Task: Each robot explores a portion of the environment, builds a local occupancy grid, and merges grids via the CRDT map. The combined map is used to plan coverage paths.
- Constraints:
- Robots communicate only when within wireless range (simulated).
- No central coordinator; each robot decides its own moves based on the shared map.
- Robots may temporarily lose connectivity (partitions).
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Gazebo / Ignition β
β (Physics) β
βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββΌββββββββββββββββββββββββ
β ROS2 (Navigation2) β
β /cmd_vel /scan /map β
βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββΌββββββββββββββββββββββββ
β SDK Agent (Rust/Python Binding) β
β ββ Mesh Transport (simulated wireless) β
β ββ CRDT Map (shared occupancy grid) β
β ββ Local Planner (coverage path) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
- Warehouse model with walls, shelves, and open spaces.
- Robot models: TurtleBot3 or similar.
- Plugin to simulate wireless signal strength based on distance.
- Navigation Stack:
nav2for local and global planning. - Perception: Simulated LiDAR (
/scan) and odometry. - Map Server: Publishes occupancy grid from CRDT map.
- Each robot runs an instance of the SDK (via Python bindings).
- The SDKβs Mesh Transport uses a custom simulator backend that respects distanceβbased connectivity.
- The CRDT map stores:
occupancy_grid: 2D array of probabilities (shared).robot_pose: each robotβs current position (updated periodically).task_assignment: which region each robot is responsible for.
- Simple behavior: if a cell is unexplored and assigned to this robot, move toward it.
- Assignment is dynamic: robots claim cells via CRDT operations.
- Create a Dockerfile or installation script that sets up:
- ROS2 Humble
- Gazebo Classic (or Ignition)
- TurtleBot3 packages
- Build a custom world file (
warehouse.world). - Write a launch file that spawns multiple robots.
- Create a ROS2 node in Python that:
- Subscribes to
/scanand updates the local occupancy grid. - Publishes the robotβs pose to the CRDT map.
- Reads the shared map and publishes it as
/map(for visualization).
- Subscribes to
- Implement a simulatorβaware Mesh Transport backend that uses Gazeboβs plugin to determine which robots are within communication range.
- Implement a distributed coverage algorithm:
- Each robot randomly selects an unexplored cell and marks it as βclaimedβ in the CRDT map.
- If two robots claim the same cell, the conflict is resolved via CRDT (last writer wins or explicit negotiation).
- The robot navigates to the cell using
nav2.
- Add a visualization RVIZ configuration to watch the shared map and robot positions.
- Introduce network partitions (disable communication between certain robots for a period).
- Measure:
- Time to converge to a complete map.
- Communication overhead (messages per second).
- CPU/memory usage per agent.
- Record a demo video.
simulation/
βββ docker/
β βββ Dockerfile
β βββ dockerβcompose.yml
βββ worlds/
β βββ warehouse.world
βββ launch/
β βββ multi_robot.launch.py
βββ scripts/
β βββ start_simulation.sh
β βββ metrics_collector.py
βββ src/
β βββ coverage_agent/
β βββ package.xml
β βββ setup.py
β βββ coverage_agent/
β β βββ __init__.py
β β βββ agent_node.py
β β βββ sdk_wrapper.py
β βββ test/
βββ README.md
- ROS2 Humble (or Galactic)
gazebo_ros_pkgsnav2,turtlebot3_gazebo- Python 3.8+
offline-first-autonomyPython package (our SDK)rclpy,geometry_msgs,nav_msgs,sensor_msgs
- Unit tests: Test the coverage algorithm in isolation (without Gazebo).
- Integration tests: Run the simulation in headless mode and verify that the map converges.
- Regression tests: Use recorded bag files to ensure changes donβt break existing behavior.
- Should we use Ignition instead of Gazebo Classic? (Ignition is more modern but less ROS2βmature.)
- How to simulate wireless range realistically? (Use Gazeboβs
libgazebo_ros_rangeplugin?) - Should we support hardwareβinβtheβloop (HITL) for future realβrobot testing?