A ROS 2 monorepo for multi-robot fleet management, combining autonomous mobile robots (AMRs), mobile manipulators (UR3), and fleet coordination via Open-RMF.
multi-robot-fleet-ros2/
├── mobile_robots/ # AMR navigation and mobile pick-place robots
│ ├── diff_drive_robot-main/ # AMR (Differential Drive) with Nav2 and SLAM
│ └── pickplace_rl_mobile/ # Mobile Manipulator with RL-based pick & place
│
├── manipulation/ # Arm descriptions, MoveIt config, and demos
│ ├── ur_description/ # UR3 URDF/xacro robot description
│ ├── onrobot_description/ # OnRobot gripper description
│ ├── robotiq_description/ # Robotiq gripper description
│ ├── robotiq_2f_85_gripper_visualization/
│ ├── moveit_config/ # MoveIt 2 configuration for UR3
│ └── ur_moveit_demos/ # MoveIt planning and execution demos
│
├── fleet_management/ # Multi-robot fleet coordination
│ └── rmf_demos/ # Open-RMF demos and fleet adapter
│
├── simulation/ # Gazebo simulation environments
│ └── ur_gazebo/ # Warehouse and pick & place worlds (Gazebo Harmonic/GZ)
│
├── ai_skills/ # AI-powered robot capabilities
│ └── ur_data_collector/ # Data collection for robot learning
│
├── interfaces/ # Shared ROS 2 message/service interfaces
│ └── ur_interfaces/
│
├── tests/ # Integration and system tests
│ └── testing/
│
└── docs/ # Architecture docs, guides, and notes
| Package | Description |
|---|---|
diff_drive_robot-main |
Autonomous Mobile Robot (AMR) platform with Nav2, SLAM Toolbox, and multi-robot coordination support. |
pickplace_rl_mobile |
Mobile Manipulator platform using Reinforcement Learning policies for intelligent warehouse pick & place. |
| Package | Description |
|---|---|
ur_description |
UR3 robot URDF and xacro description |
moveit_config |
MoveIt 2 config — planning pipelines, kinematics, controllers |
ur_moveit_demos |
Demo nodes for planning, execution, and custom motions |
robotiq_description |
Robotiq 2F-85 gripper URDF |
onrobot_description |
OnRobot gripper description |
| Package | Description |
|---|---|
rmf_demos |
Open-RMF fleet adapter, task dispatcher, and map demos for heterogeneous fleet coordination. |
| Package | Description |
|---|---|
ur_gazebo |
Gazebo worlds and simulation setup. Optimized for Gazebo Harmonic (GZ). Includes warehouse and pick & place environments. |
| Package | Description |
|---|---|
ur_data_collector |
ROS 2 node for collecting training data from robot demos |
ur_llm_planner |
Natural-language motion planner — converts free-text commands to UR arm action sequences via a local Ollama model (default) or Anthropic Claude. Wired into the handoff coordinator FSM via /vla_instruction / /vla/task_feedback. |
- ROS 2 Humble
- MoveIt 2
- Nav2
- Gazebo Harmonic (GZ)
- Open-RMF Core
If you are using Gazebo Harmonic/GZ, avoid installing the full ros-humble-rmf-dev package as it may conflict with Gazebo Classic. Instead, install the core components:
sudo apt install -y \
ros-humble-rmf-traffic \
ros-humble-rmf-traffic-ros2 \
ros-humble-rmf-fleet-adapter \
ros-humble-rmf-fleet-adapter-python \
ros-humble-rmf-fleet-msgs \
ros-humble-rmf-task \
ros-humble-rmf-task-ros2 \
ros-humble-rmf-task-msgs \
ros-humble-rmf-task-sequence \
ros-humble-rmf-building-map-msgs \
ros-humble-rmf-utils \
ros-humble-rmf-api-msgs \
ros-humble-rmf-websocketcd multi-robot-fleet-ros2
colcon build --symlink-install
source install/setup.bashros2 launch diff_drive_robot-main bringup.launch.pyros2 launch moveit_config ur3_moveit.launch.pyros2 launch rmf_demos office.launch.xmlInstall and start Ollama, then pull a model:
ollama pull llama2 # or mistral, llama3.2, etc.Launch the planner node (defaults to llama2 on http://localhost:11434):
ros2 launch ur_llm_planner llm_planner.launch.py
# Different model
ros2 launch ur_llm_planner llm_planner.launch.py model:=mistral
# Anthropic Claude fallback
ros2 launch ur_llm_planner llm_planner.launch.py backend:=anthropic model:=claude-haiku-4-5-20251001Send a natural language command directly:
ros2 service call /ur/execute_command ur_interfaces/srv/ExecuteCommand \
'{command: "pick the red box from the AMR and place it on the shelf"}'Or trigger via the handoff coordinator (the planner subscribes to /vla_instruction automatically):
ros2 topic pub --once /vla_instruction std_msgs/msg/String \
'{data: "pick the box_A from the AMR and place it on the shelf"}'Run the offline accuracy evaluator against a live Ollama instance (no ROS 2 needed):
python3 tests/eval_planner_accuracy.py
# Different model or URL
python3 tests/eval_planner_accuracy.py --model mistral
python3 tests/eval_planner_accuracy.py --url http://192.168.1.10:11434 --model llama3.2
# Show full plan output for every test case
python3 tests/eval_planner_accuracy.py --verboseChecks each plan for: valid JSON, known actions only, correct gripper ordering (open before close), starts with a named pose, ends at home, and valid Cartesian field types. Exit code 0 if ≥ 60% of checks pass, 1 otherwise — suitable for CI.
- Multi-robot Nav2 navigation with SLAM
- UR3 MoveIt 2 integration
- Open-RMF fleet coordination demos
- LLM motion planner (Ollama + Anthropic backends)
- RMF fleet adapter for diff_drive_robot AMRs
- RMF fleet adapter for UR3 mobile manipulator
- Centralized heterogeneous fleet dispatcher (AMRs + arms)
- RMF traffic editor map for the Gazebo warehouse world
- Inter-robot handoff — AMR delivers object to UR3 pick zone
- Sim-to-real transfer for RL pick & place policies
- Object detection node wired to DetectedObject msgs
- Multi-robot map merging (SLAM Toolbox multirobot mode)
- Docker / devcontainer for reproducible builds
| Feature | Description |
|---|---|
| Custom fleet adapter | Write a rmf_fleet_adapter-compliant node for the diff_drive_robot so RMF can dispatch and monitor Nav2 tasks directly. |
| Traffic editor map | Create a .building.yaml map in the RMF Traffic Editor matching the Gazebo warehouse, enabling lift/door/charger integration. |
| Patrol & delivery tasks | Configure RMF patrol and delivery task types dispatched through the RMF web dashboard or API. |
| RMF web dashboard | Launch the Open-RMF web UI (rmf-web) to visualize robot states, task queues, and traffic lanes in real time. |
| Mobile manipulator adapter | Extend RMF to treat the pickplace_rl_mobile robot as a robot_type that can accept pick-and-place task payloads. |
| Heterogeneous task dispatch | Use RMF's task bidding system to route delivery tasks to AMRs and manipulation tasks to UR3 robots based on capability. |
| Feature | Description |
|---|---|
| Map merging | Use SLAM Toolbox's multirobot mode (already has config) to merge maps from multiple AMRs into a single global costmap. |
| Inter-robot handoff | AMR navigates to a handoff zone → UR3 arm picks the payload → AMR continues delivery. Coordinate via shared ROS 2 topics or RMF tasks. |
| Centralized mission server | Extend the existing mission_server.py to accept high-level goals (e.g. "deliver box from A to B") and decompose them into Nav2 + MoveIt subtasks. |
| Fleet health dashboard | Extend fleet_health.py and fleet_gui.py with battery, pose, and task-status telemetry for all robots in a single Tkinter or web view. |
| Dynamic task reallocation | If a robot fails mid-task, the task allocator re-bids and assigns to another available robot. |
| Priority-based traffic management | Assign lane priority so high-priority robots (e.g. emergency delivery) preempt lower-priority AMRs at intersections. |
| Feature | Description |
|---|---|
| Swap Ollama model | Try mistral or llama3.2 by launching with model:=mistral — no code changes needed. |
| Object detection node | Add a YOLO or DepthAI node publishing DetectedObjectArray; feed detected poses directly into the LLM planner prompt. |
| Rosbag training loop | Automate: record demo → replay → extract episodes → run train_bc.py behavior cloning in one launch file. |
| Restore SmolVLA inference | Rebuild the deleted ur_smolvla package with an updated model checkpoint wired as a second LLM planner backend. |
darshmenon — github.com/darshmenon