free_fleet
is an open source fleet management system. free_fleet
can integrate multiple mobile robots which even though doesn't come with its own fleet management system.
You can read the free_fleet
's document here.
At now, open-rmf provides the free_fleet
client based on ROS1 noetic and the free_fleet
server based on ROS2 foxy.
Start a new ROS1 workspace, and pull in the necessary repositories,
mkdir -p ~/client_ws/src
cd ~/client_ws/src
git clone https://github.com/open-rmf/free_fleet
git clone https://github.com/eclipse-cyclonedds/cyclonedds
git clone https://github.com/CLOBOT-Co-Ltd/clober_free_fleet.git
git clone -b noetic-devel https://github.com/CLOBOT-Co-Ltd/clober.git
sudo apt-get install ros-noetic-rosgraph-msgs
sudo apt-get install ros-noetic-rosgraph
Install all the dependencies through rosdep,
cd ~/client_ws
rosdep install --from-paths src --ignore-src --rosdistro noetic -yr
Source ROS1 and build,
cd ~/client_ws
source /opt/ros/noetic/setup.bash
colcon build --cmake-args -DCMAKE_BUILD_TYPE=RELEASE
Start a new ROS2 workspace, and pull in the necessary repositories,
mkdir -p ~/server_ws/src
cd ~/server_ws/src
git clone https://github.com/open-rmf/free_fleet
git clone https://github.com/open-rmf/rmf_internal_msgs
git clone https://github.com/CLOBOT-Co-Ltd/clober_free_fleet.git
Install all the dependencies through rosdep,
cd ~/server_ws
rosdep install --from-paths src --ignore-src --rosdistro foxy -yr
Source ROS2 and build,
cd ~/server_ws
source /opt/ros/foxy/setup.bash
colcon build --cmake-args -DCMAKE_BUILD_TYPE=RELEASE
This example emulates a running robot and also a running free fleet server,
source ~/client_ws/install/setup.bash
roslaunch ff_examples_ros1 fake_client.launch
The client will then start subscribing to all the necessary topics, and start publishing robot states over DDS to the server. Start the server using
source ~/server_ws/install/setup.bash
ros2 launch ff_examples_ros2 fake_server.launch.xml
To verify that the fake client has been registered, there will be print-outs on the server terminal, otherwise, the ROS2 messages over the /fleet_states
topic can also be used to verify,
source ~/server_ws/install/setup.bash
ros2 topic echo /fleet_states
Launch the clober free fleet client ROS 1(noetic) :
source ~/client_ws/install/setup.bash
roslaunch clober_ff_client_ros1 clober_world_ff.launch
Launch the clober free fleet server int ROS 2(foxy) :
source ~/server_ws/install/setup.bash
ros2 launch clober_ff_server_ros2 clober_world_ff.xml
Verify the topic /fleet_states
:
source ~/server_ws/install/setup.bash
ros2 topic echo /fleet_states
Launch the clober free fleet client ROS 1(noetic) :
source ~/client_ws/install/setup.bash
roslaunch clober_ff_client_ros1 multi_clober_world_ff.launch
Launch the clober free fleet server int ROS 2(foxy) :
source ~/server_ws/install/setup.bash
ros2 launch clober_ff_server_ros2 clober_world_ff.xml
There are 3 types of commands/requests that can be sent to the simulated robots through free_fleet
.
Destination requests : command the robot to go to the single destination
ros2 run clober_ff_server_ros2 send_destination_request.py -f FLEET_NAME -r ROBOT_NAME -x 1.725 -y -0.39 --yaw 0.0 -i UNIQUE_TASK_ID
example : command the clober which name is clober_0 to go to the destination(x, y, yaw : 0.0, 0.0, 0.0), and the task_id is destination_requests_task.
ros2 run clober_ff_server_ros2 send_destination_request.py -f clober -r clober_0 -x 0.0 -y 0.0 --yaw 0.0 -i destination_requests_task
Path Requests : command the robot to perform the string of destination
ros2 run clober_ff_server_ros2 send_path_request.py -f FLEET_NAME -r ROBOT_NAME -i UNIQUE_TASK_ID -p '[{"x": 1.725, "y": -0.39, "yaw": 0.0, "level_name": "B1"}, {"x": 1.737, "y": 0.951, "yaw": 1.57, "level_name": "B1"}, {"x": -0.616, "y": 1.852, "yaw": 3.14, "level_name": "B1"}, {"x": -0.626, "y": -1.972, "yaw": 4.71, "level_name": "B1"}]'
example : command the clober which name is clober_0 to perform to the string of destination, and the task_id is path_requests_task.
ros2 run clober_ff_server_ros2 send_path_request.py -f clober -r clober_0 -i path_requests_task -p '[{"x": 0.0, "y": 0.0, "yaw": 0.0, "level_name": "B1"}, {"x": 1.0, "y": 1.0, "yaw": 1.57, "level_name": "B1"}, {"x": -1.0, "y": 0.0, "yaw": 3.14, "level_name": "B1"}, {"x": 0.0, "y": 1.0, "yaw": 4.71, "level_name": "B1"}]'
Mode Requests : command the robot to pause
or resume
- pause
ros2 run clober_ff_server_ros2 send_mode_request.py -f FLEET_NAME -r ROBOT_NAME -m pause -i UNIQUE_TASK_ID
example : command the clober which name is clober_0 to pause, and the task_id is mode_requests_pause_task.
ros2 run clober_ff_server_ros2 send_mode_request.py -f clober -r clober_0 -m pause -i mode_requests_pause_task
- resume
ros2 run ff_examples_ros2 send_mode_request.py -f FLEET_NAME -r ROBOT_NAME -m resume -i UNIQUE_TASK_ID
example : command the clober which name is clober_0 to resume, and the task_id is mode_requests_resume_task.
ros2 run clober_ff_server_ros2 send_mode_request.py -f clober -r clober_0 -m resume -i mode_requests_resume_task