This repo contains a ROS driver and ROS configuration files (URDF description, Gazebo launch files, move_base config, bringup launch files, message and action descriptions) for the MiR robots. This is a community project created by us (DFKI, the German Research Center for Artificial Intelligence) to use the MiR Robots with ROS. We are not affiliated with Mobile Industrial Robots. If you find a bug or missing feature in this software, please report it on the issue tracker.
This repo has been confirmed to work with the following robots:
- MiR 100
- MiR 200
- MiR 500
It probably also works with the MiR250 and MiR1000. If you can test it on one of those, please let us know if it works.
The only supported software version is MiR software 2.8.3.1. You can try if it works with other versions, but this is the one that is known to work.
mir_actions
: Action definitions for the MiR robotmir_description
: URDF description of the MiR robotmir_dwb_critics
: Plugins for the dwb_local_planner used in Gazebomir_driver
: A reverse ROS bridge for the MiR robotmir_gazebo
: Simulation specific launch and configuration files for the MiR robotmir_msgs
: Message definitions for the MiR robotmir_navigation
: move_base launch and configuration files
You can chose between binary and source install below. If you don't want to
modify the source, the binary install is preferred (if mir_robot
binary
packages are available for your ROS distro). The instructions below use the ROS
distro noetic
as an example; if you use a different distro (e.g. melodic
),
replace all occurrences of the string noetic
by your distro name in the
instructions.
If you haven't already installed ROS on your PC, you need to add the ROS apt repository. This step is necessary for either binary or source install.
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
sudo apt-get update -qq
For a binary install, it suffices to run this command:
sudo apt install ros-noetic-mir-robot
See the tables at the end of this README for a list of ROS distros for which binary packages are available.
For a source install, run the commands below instead of the command from the "binary install" section.
# create a catkin workspace
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src/
# clone mir_robot into the catkin workspace
git clone -b noetic https://github.com/dfki-ric/mir_robot.git
# use rosdep to install all dependencies (including ROS itself)
sudo apt-get update -qq
sudo apt-get install -qq -y python-rosdep
sudo rosdep init
rosdep update
rosdep install --from-paths ./ -i -y --rosdistro noetic
# build all packages in the catkin workspace
source /opt/ros/noetic/setup.bash
catkin_init_workspace
cd ~/catkin_ws
catkin_make -DCMAKE_BUILD_TYPE=RelWithDebugInfo
In case you encounter problems, please compare the commands above to the build
step in .travis.yml
; that should always have the most
recent list of commands.
You should add the following line to the end of your ~/.bashrc
, and then
close and reopen all terminals:
source ~/catkin_ws/devel/setup.bash
### gazebo:
roslaunch mir_gazebo mir_maze_world.launch
rosservice call /gazebo/unpause_physics # or click the "start" button in the Gazebo GUI
### localization:
roslaunch mir_navigation amcl.launch initial_pose_x:=10.0 initial_pose_y:=10.0
# or alternatively: roslaunch mir_gazebo fake_localization.launch delta_x:=-10.0 delta_y:=-10.0
# navigation:
roslaunch mir_navigation start_planner.launch \
map_file:=$(rospack find mir_gazebo)/maps/maze.yaml \
virtual_walls_map_file:=$(rospack find mir_gazebo)/maps/maze_virtual_walls.yaml
rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz
Now, you can use the "2D Nav Goal" tool in RViz to set a navigation goal for move_base.
(Click image to see video)
### gazebo:
roslaunch mir_gazebo mir_maze_world.launch
rosservice call /gazebo/unpause_physics # or click the "start" button in the Gazebo GUI
### mapping:
roslaunch mir_navigation hector_mapping.launch
# navigation:
roslaunch mir_navigation move_base.xml with_virtual_walls:=false
rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz
If you want to spawn multiple robots into Gazebo, you unfortunately have to
hard-code the name of the second robot into the mir_empty_world.launch
file,
like this:
diff --git i/mir_gazebo/launch/mir_empty_world.launch w/mir_gazebo/launch/mir_empty_world.launch
index 27b9159..7773fae 100644
--- i/mir_gazebo/launch/mir_empty_world.launch
+++ w/mir_gazebo/launch/mir_empty_world.launch
@@ -17,6 +17,10 @@
<remap from="$(arg namespace)/mobile_base_controller/cmd_vel" to="$(arg namespace)/cmd_vel" />
<remap from="$(arg namespace)/mobile_base_controller/odom" to="$(arg namespace)/odom" />
+ <remap from="mir2/joint_states" to="mir2/mir/joint_states" />
+ <remap from="mir2/mobile_base_controller/cmd_vel" to="mir2/cmd_vel" />
+ <remap from="mir2/mobile_base_controller/odom" to="mir2/odom" />
+
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(arg world_name)"/>
<arg name="paused" value="true" />
Then you can run the simulation like this:
# start Gazebo + first MiR
roslaunch mir_gazebo mir_maze_world.launch tf_prefix:=mir
# first MiR: start localization, navigation + rviz
roslaunch mir_navigation amcl.launch initial_pose_x:=10.0 initial_pose_y:=10.0 tf_prefix:=mir#
roslaunch mir_navigation start_planner.launch \
map_file:=$(rospack find mir_gazebo)/maps/maze.yaml \
virtual_walls_map_file:=$(rospack find mir_gazebo)/maps/maze_virtual_walls.yaml prefix:=mir/
ROS_NAMESPACE=mir rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz
# spawn second MiR into Gazebo
roslaunch mir_gazebo mir_gazebo_common.launch robot_x:=-2 robot_y:=-2 tf_prefix:=mir2 model_name:=mir2 __ns:=mir2
# second MiR: start localization, navigation + rviz
roslaunch mir_navigation amcl.launch initial_pose_x:=8.0 initial_pose_y:=8.0 tf_prefix:=mir2
roslaunch mir_navigation start_planner.launch \
map_file:=$(rospack find mir_gazebo)/maps/maze.yaml \
virtual_walls_map_file:=$(rospack find mir_gazebo)/maps/maze_virtual_walls.yaml prefix:=mir2/
ROS_NAMESPACE=mir2 rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz
- switch on MiR base
- connect to MiR_R??? wifi (password "mirex4you"), for example from your Android phone/tablet
- disable other network connections (mobile data / LAN / etc.)
- open mir.com (192.168.12.20) in Chrome (!)
- log in (admin/mir4you)
The internal robot PC's is not synchronized (for example via NTP), so it tends
to get out of sync quickly (about 1 second per day!). This causes TF transforms
timing out etc. and can be seen using tf_monitor
(the "Max Delay" is about
3.3 seconds, but should be less than 0.1 seconds):
$ rosrun tf tf_monitor
Frames:
Frame: /back_laser_link published by unknown_publisher Average Delay: 3.22686 Max Delay: 3.34766
Frame: /base_footprint published by unknown_publisher Average Delay: 3.34273 Max Delay: 3.38062
Frame: /base_link published by unknown_publisher Average Delay: 3.22751 Max Delay: 3.34844
Frame: /front_laser_link published by unknown_publisher Average Delay: 3.22661 Max Delay: 3.34159
Frame: /imu_link published by unknown_publisher Average Delay: 3.22739 Max Delay: 3.34738
Frame: /odom published by unknown_publisher Average Delay: 3.16493 Max Delay: 3.28667
[...]
All Broadcasters:
Node: unknown_publisher 418.344 Hz, Average Delay: 0.827575 Max Delay: 3.35237
Node: unknown_publisher(static) 465.362 Hz, Average Delay: 0 Max Delay: 0
To fix this:
- go to "Service" -> "Configuration" -> "System settings" -> "Time settings" -> "Set device time on robot"
Afterwards, the ROS software on the robot will restart, so you'll have to start move_base
again (see below).
- go to "Service" -> "Configuration" -> "Launch menu", start "Planner"; this starts
move_base
andamcl
on the robot
- go to "Manual", press yellow button (LEDs change from yellow to blue); now the robot can be teleoperated
If the robot's localization is lost:
- go to "Service" -> "Command view" -> "Set start position" and click + drag to current position of robot in the map
- click "Adjust"
roslaunch mir_driver mir.launch
Sometimes the move_base action will print the warning "Got a result when we
were already in the DONE state". This is caused by a race condition between the
/move_base/result
and /move_base/status
topics. When a status message with
status SUCCEEDED
arrives before the corresponding result message, this
warning will be printed. It can be safely ignored.
Melodic | Noetic |
---|---|
Melodic source deb | Melodic binary deb | Noetic source deb | Noetic binary deb | |
---|---|---|---|---|
mir_actions | ||||
mir_description | ||||
mir_driver | ||||
mir_dwb_critics | ||||
mir_gazebo | ||||
mir_msgs | ||||
mir_navigation | ||||
mir_robot | ||||
sdc21x0 |
Melodic devel | Melodic doc | Noetic devel | Noetic doc | |
---|---|---|---|---|
mir_robot |