This repo contains ROS configuration files (URDF description, Gazebo launch files, MoveIt config, bringup launch files) for the Mobipick robot (MiR 100 base, UR5 arm, Robotiq 2 Finger Gripper + Force-Torque Sensor, Orbbec Astra Mini S 3D camera).
mobipick_bringup
: Launch and configuration files for the real Mobipick robotmobipick_description
: URDF description of the robotmobipick_gazebo
: Simulation specific launch and configuration filesmobipick_moveit_config
: MoveIt! launch and configuration filesmobipick_pick_n_place
: Some demo nodes that show off the MoveIt capabilities of the robot
First, install ROS. Then:
# create a catkin workspace and clone all required ROS packages
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src/
git clone -b noetic <URL of this repo>
mobipick/install-deps.sh
mobipick/build.sh
If you have a physical pico flexx camera attached to this PC, also follow the installation instructions of the pico_flexx_driver. These cannot be integrated into the instructions above because they require a manual download step.
You can also optionally install the dependencies in
dependencies-optional.rosinstall; simply uncomment the relevant line in
install-deps.sh
before running it.
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
Note: Since we are using the devel
space, some nodes
still have the #!/usr/bin/env python
shebang
line. If this leads to an error, simply install the package
python-is-python3
.
The following examples describe how to use the robot in simulation. For more
information on how to use the real mobipick robot have a look at the
README.md in mobipick_bringup
.
roslaunch mobipick_gazebo mobipick_moelk.launch
rosservice call /gazebo/unpause_physics
roslaunch mir_gazebo fake_localization.launch __ns:="mobipick" odom_frame_id:="mobipick/odom" base_frame_id:="mobipick/base_footprint"
roslaunch mir_navigation start_planner.launch map_file:=$(rospack find pbr_maps)/maps/moelk/pbr_robot_lab.yaml virtual_walls_map_file:=$(rospack find pbr_maps)/maps/moelk/pbr_robot_lab_virtual_walls.yaml prefix:="mobipick/"
roslaunch mobipick_moveit_config moveit_planning_execution.launch
rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz __ns:="mobipick"
roslaunch mobipick_pick_n_place mobipick_pick_n_place.launch simulation:=true
rosservice call /mobipick/continue_statemachine
There exists also an analogous demo using BehaviorTree.CPP
instead of a state machine. The implementation doesn't support pausing as easily, however,
so this functionality is removed.
The graphical editor Groot is integrated in this demo.
To see its visualization, run rosrun groot Groot
and connect the monitor with default settings
after the behavior tree started.
roslaunch mobipick_gazebo mobipick_moelk.launch
rosservice call /gazebo/unpause_physics
roslaunch mir_gazebo fake_localization.launch __ns:="mobipick" odom_frame_id:="mobipick/odom" base_frame_id:="mobipick/base_footprint"
roslaunch mir_navigation start_planner.launch map_file:=$(rospack find pbr_maps)/maps/moelk/pbr_robot_lab.yaml virtual_walls_map_file:=$(rospack find pbr_maps)/maps/moelk/pbr_robot_lab_virtual_walls.yaml prefix:="mobipick/"
roslaunch mobipick_moveit_config moveit_planning_execution.launch
rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz __ns:="mobipick"
roslaunch mobipick_pick_n_place moveit_macros.launch
roslaunch mobipick_pick_n_place mobipick_pick_n_place_bt.launch simulation:=true
rosrun groot Groot # and connect the monitor with default settings
For both state machine and behavior tree version, optionally execute
rosservice call /mobipick/simulate_user_interaction
during the user interaction step to fake taking the power drill.
roslaunch mobipick_moveit_config demo.launch
roslaunch mobipick_pick_n_place mobipick_pick_n_place.launch simulation:=true object_source:=static
rosservice call /mobipick/continue_statemachine
- Make sure that the parameter
use_sim_time
is set tofalse
. - You can play around with different planning pipelines, which you can select
in the the "MotionPlanning" pane in RViz under "Context".
ompl
is a collection of sampling-based motion planning algorithms and is used in thepick_n_place
demos.ompl
is the default in MoveIt.chomp
is a gradient-based trajectory optimization procedure that can be used instead of a motion planner.ompl_chomp
uses the OMPL planning pipeline, but adds the CHOMP planning adapter.pilz_industrial_motion_planner
is a simplistic motion planning pipeline that works for simple motions. It is somewhat hard to control from RViz, but thePTP
planner works.
roslaunch mobipick_gazebo mobipick_maze_world.launch
rosservice call /gazebo/unpause_physics # or click the "start" button in the Gazebo GUI
roslaunch mir_gazebo fake_localization.launch __ns:="mobipick" odom_frame_id:="mobipick/odom" base_frame_id:="mobipick/base_footprint" delta_x:=-10.0 delta_y:=-10.0
ROS_NAMESPACE=mobipick rosrun mobipick_gazebo move_arm_to_home
roslaunch mir_navigation start_planner.launch \
map_file:=$(rospack find mir_gazebo)/maps/maze.yaml prefix:="mobipick/" \
virtual_walls_map_file:=$(rospack find mir_gazebo)/maps/maze_virtual_walls.yaml
rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz __ns:="mobipick"
Now, you can use the "2D Nav Goal" tool in RViz to set a navigation goal for move_base.
roslaunch mobipick_gazebo mobipick_mrk_lab_world.launch
rosservice call /gazebo/unpause_physics # or click the "start" button in the Gazebo GUI
roslaunch mir_gazebo fake_localization.launch __ns:="mobipick" odom_frame_id:="mobipick/odom" base_frame_id:="mobipick/base_footprint"
ROS_NAMESPACE=mobipick rosrun mobipick_gazebo move_arm_to_home
roslaunch mir_navigation start_planner.launch \
map_file:=$(rospack find mobipick_gazebo)/maps/rh5_mrk_lab.yaml prefix:="mobipick/"
rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz __ns:="mobipick"
Now, you can use the "2D Nav Goal" tool in RViz to set a navigation goal for move_base.
roslaunch mobipick_gazebo mobipick_smart_factory.launch
rosservice call /gazebo/unpause_physics
roslaunch mir_gazebo fake_localization.launch __ns:="mobipick" odom_frame_id:="mobipick/odom" base_frame_id:="mobipick/base_footprint" delta_yaw:=1.57 delta_x:=-11.77 delta_y:=-19.74
roslaunch mir_navigation start_planner.launch map_file:=$(rospack find mobipick_gazebo)/maps/smart_factory.yaml prefix:="mobipick/" with_virtual_walls:=true virtual_walls_map_file:=$(rospack find mobipick_gazebo)/maps/smart_factory_objects.yaml
roslaunch mobipick_moveit_config moveit_planning_execution.launch
rviz -d $(rospack find mir_navigation)/rviz/navigation.rviz __ns:="mobipick" world:="smart_factory"
roslaunch mobipick_pick_n_place mobipick_pick_n_place.launch simulation:=true world:="smart_factory"
rosservice call /mobipick/continue_statemachine
roslaunch rosbridge_server rosbridge_websocket.launch port:=9090
If you want to use the velocity/position controller for the arm, add
arm_controller:=velocity/position
to any of the launch files, like so:
roslaunch mobipick_gazebo mobipick_table_world.launch arm_controller:=velocity # or arm_controller:=position
rosservice call /gazebo/unpause_physics # or click the "start" button in the Gazebo GUI
Now you can send velocity commands to the arm directly, like this:
rostopic pub /arm_velocity_controller/command std_msgs/Float64MultiArray "data: [0.4, 0.1, -0.1, 0, 0, 0]"
In this configuration, MoveIt won't work however, since MoveIt requires the joint trajectory controller instead of the velocity controller (because MoveIt is a joint trajectory client).
You can switch to the arm trajectory controller like this:
rosrun controller_manager controller_manager stop arm_velocity_controller
rosrun controller_manager controller_manager start arm_controller
This also works the other way around, e.g. if you didn't add the
arm_controller:=velocity
argument to the launch file:
rosrun controller_manager controller_manager stop arm_controller
rosrun controller_manager controller_manager start arm_velocity_controller
If you prefer a graphical interface, try this:
rosrun rqt_controller_manager rqt_controller_manager
Whenever the URDF of the robot changes, the SRDF has to be updated as well. Since we changed the URDF to xacro, the following process is necessary (assuming you are using the Mobipick robot from PBR-Osnabrück, for RIC-Bremen change "os" to "hb"):
roscd mobipick_moveit_config/config/
xacro mobipick_os.srdf.xacro tf_prefix:=mobipick > mobipick.srdf
roslaunch mobipick_moveit_config setup_assistant.launch
sed -i 's/mobipick\//${tf_prefix}/g' mobipick.srdf
meld mobipick.srdf mobipick_os.srdf.xacro # compare and apply all relevant changes
rm mobipick.srdf
This repo has a pre-commit check that runs in CI. You can use this locally and set it up to run automatically before you commit something. To install, use pip:
pip3 install --user pre-commit
To run over all the files in the repo manually:
pre-commit run -a
To run pre-commit automatically before committing in the local repo, install the git hooks:
pre-commit install
In Gazebo, trying to use MoveIt to plan a gripper movement to the "open" state closes the gripper and vice versa. This is caused by the following sequence of events:
- MoveIt plans a joint trajectory for the gripper (e.g., it plans to the group
state "closed" with a
gripper_finger_joint
angle of 0.755 radians). - It then sends this trajectory to the controller.
- However, in the
simple_moveit_controllers.yaml
file, we only specify a controller of typeGripperCommand
. In that action, theposition
fields encodes the gripper gap size (in meters). MoveIt incorrectly fills in 0.755 regardless. - The controller interprets this as 0.755 meters instead of radians (which is the correct interpretation of the action definition) and opens the gripper to the maximum gap size, even though we planned to the closed state. The inverse case happens when planning to the open state.
One solution to this problem would be to replace the gripper controller with a
FollowJointTrajectory
controller in the simple_moveit_controllers.yaml
file, like this:
- name: "gripper_controller"
action_ns: "follow_joint_trajectory"
type: FollowJointTrajectory
default: false
joints:
- $(arg prefix)gripper_finger_joint
However, this would mean that the Gazebo simulation no longer mirrors the real
robot (which does not have a FollowJointTrajectory
controller), and also the
pick and place demo would stop working in Gazebo. Therefore, we leave the controller
configuration unchanged. Users should not use MoveIt to plan and execute
gripper trajectories, but instead call the /mobipick/gripper_hw
action (type:
GripperCommand
) directly.
These errors are expected and can be ignored.
Unfortunately, we cannot set the PID gains (to silence the error) due to the following behavior of Gazebo:
- When using the
PositionJointInterface
, you must set the PID values for the joints using that interface, otherwise you will run into this bug. - When using the
VelocityJointInterface
, if you omit the PID values, Gazebo just perfectly follows the commanded velocities. If you specify PID values, Gazebo will use a PID controller to approximate following the commanded velocities, so you have to tune the PID controllers.
Since we just want Gazebo to follow our commanded velocities, we cannot set the PID values for joints using the VelocityJointInterface, so the errors get printed (but can be ignored).
Sometimes the arm doesn't move, and the following errors appear in the log:
[ WARN] [1625228178.110222489]: Controller arm_controller failed with error INVALID_GOAL: (/mobipick/move_group)
[ WARN] [1625228178.110321441]: Controller handle arm_controller reports status FAILED (/mobipick/move_group)
[ INFO] [1625228178.110378244]: Completed trajectory execution with status FAILED ... (/mobipick/move_group)
This happens every time that roslaunch mobipick_bringup mobipick_bringup_control.launch
is restarted, because the program on the UR5
robot must be started after that launch file is run.
Solution: First make sure that mobipick_bringup_control.launch
is
running, then stop and restart the UR program on the robot. You can do this by
pressing "stop" and then "start on the teaching pendant. Alternatively, call
the following services:
rosservice call /mobipick/ur_hardware_interface/dashboard/stop
rosservice call /mobipick/ur_hardware_interface/dashboard/play