Starting with ROS 2 on Modern Gazebo¶
Use modern Gazebo to simulate MP-series and ROX robots.
Note
As of May 2025, key updates to the simulation, such as support for different ROX variants other than ROX Argo, as well as support for MP-Series robots, have been provided. This updates are only for ROS 2 versions Jazzy and above.
Please contact us directly if you require a simulation with all the new updates in Humble.
ROX¶
Setup Environment Hooks¶
Attention
This step is for the Humble and Iron versions
In order for Gazebo to open the models for the robots and the objects in the environment. It is essential to define the gz model path for loading these objects. For example, if there is workspace called rox_ws, then the path should be defined as follows:
export GZ_SIM_RESOURCE_PATH=~/rox_ws/src/rox:~/rox_ws/src/neo_gz_worlds/models/
Attention
- Here we define the path for both the robot models and as well as the object models.
- Please update the path according to your workspace.
Launch¶
Launching the simulation of ROX is fairly easy
ros2 launch rox_bringup bringup_sim_launch.py
Launch Arguments
Attention
Certain arguments such as arm_type and gripper_type are available only for certain robots. It is recommended to check for the arguments by adding the –show-launch-arguments tag at the end of the above command.
Attention
Available on Jazzy and above distributions
Arguments (pass arguments as '<name>:=<value>'):
'imu_enable':
Enable IMU - Options: True/False
(default: 'False')
'd435_enable':
Enable Realsense - Options: True/False
(default: 'False')
'scanner_type':
Scanner Type. Valid choices are: ['', 'nanoscan', 'psenscan']
(default: 'nanoscan')
'arm_type':
Arm Types
. Valid choices are: ['', 'ur5', 'ur10', 'ur5e', 'ur10e', 'ec66']
(default: '')
'rox_type':
ROX Drive Type
. Valid choices are: ['', 'argo', 'argo-trio', 'diff', 'trike']
(default: 'argo')
'use_ur_dc':
Set this argument to True if you have an UR arm with DC variant
(default: 'False')
'gripper_type':
Gripper Types - Supported Robots [mpo-700, mpo-500]
. Valid choices are: ['', '2f_140', '2f_85']
(default: '')
'headless_simulation':
Run Gazebo in headless mode (no GUI) - Options: True/False
(default: 'False')
Robot can be moved using the keyboard as shown in the Image below:
Video Tutorial¶
MP Series¶
The MP-series simulation is included in each robot repository, allowing users to switch between the real robot and simulation in the same workspace.
For launching the simulation of MPO-700:
ros2 launch neo_mpo_700-2 bringup_sim.launch.py
For launching the simulation of MP-400:
ros2 launch neo_mp_400-2 bringup_sim.launch.py
For launching the simulation of MPO-500:
ros2 launch neo_mpo_500-2 bringup_sim.launch.py
For launching the simulation of MP-500:
ros2 launch neo_mp_500-2 bringup_sim.launch.py
Launch Arguments
Attention
Certain arguments such as arm_type and gripper_type are available only for certain robots. It is recommended to check for the arguments by adding the –show-launch-arguments tag at the end of the above command.
Arguments (pass arguments as '<name>:=<value>'):
'world':
Simulation world to load. Valid choices are: ['', 'neo_workshop']
(default: 'neo_workshop')
'arm_type':
Arm Types
. Valid choices are: ['', 'ur5', 'ur10', 'ur5e', 'ur10e', 'ec66']
(default: '')
'imu_enable':
Enable IMU - Options: True/False
(default: 'False')
'd435_enable':
Enable Intel RealSense D435 camera if true
(default: 'False')
'scanner_type':
Type of laser scanner to use
. Valid choices are: ['', 'sick_s300', 'sick_microscan3']
(default: 'sick_s300')
'gripper_type':
Gripper Types
. Valid choices are: ['', '2f_140', '2f_85']
(default: '')
'use_docking_adapter':
Enable docking adapter if true
(default: 'False')
Video Tutorial¶
Worlds¶
neo_workshop¶
Experience the testing area situated in our campus through this world.
Note
This specific work is available in the neo_gz_world package.
More worlds coming soon…
Manipulation¶
Please see the manpulation section here in the Starting with ROS 2 on the Robot for getting started with manipulation.
Followed by the neo_ur_moveit_config for controlling the mobile manipulator with the MoveIt package.
Gripping in Simulation¶
The ROX Gazebo simulation supports the Robotiq 2F-85 and 2F-140 grippers mounted on a UR arm. The instructions below apply only to simulation.
Note
Clone the ros2_robotiq_gripper repository on GitHub into your ROS 2
workspace’s src directory. If you used robot-setup-tools to set up
the workspace, this step is already taken care of.
Launch ROX with the desired arm and gripper. For example, to use a UR5e with a 2F-85:
ros2 launch rox_bringup bringup_sim_launch.py arm_type:=ur5e gripper_type:=2f_85
Use gripper_type:=2f_140 for the 2F-140. The launch starts the selected
gripper’s position_controllers/GripperActionController automatically.
Gazebo provides the simulated hardware; leave mock hardware disabled.
In another terminal, source the workspace and send a gripper command:
source /opt/ros/jazzy/setup.bash
ros2 action send_goal /robotiq_2f_85_gripper_controller/gripper_cmd control_msgs/action/GripperCommand "{command: {position: 0.3, max_effort: 50.0}}"
The position value is the driving joint angle in radians, not the
distance between the fingers. Use 0.0 to open the gripper and increase
the angle to close it. The joint range is 0.0 to 0.8 for the 2F-85
and 0.0 to 0.7 for the 2F-140. For the 2F-140, change the action
name to /robotiq_2f_140_gripper_controller/gripper_cmd.
Note
These commands control joint position. The max_effort field does
not enforce a gripping-force limit in this position-controlled Gazebo
setup. Successful completion of a command does not confirm that an
object is held.