This package is meant to be an example on how robots needs to be configured in order to support simulating multi robots in the same environment.
ROS 2 Version: Humble
- One
/tf
topic is expected to be published for any number of robots - Each frame should have a prefix to know which robot they belong to
- Topics should be namespaced.
<robot_prefix>/robot_description
<robot_prefix>/joint_states
<robot_prefix>/cmd_vel
<robot_prefix>/odom
<robot_prefix>/scan
- Nodes should be namespaced.
robot_state_publisher
: Reads robot description and:- Publishes
<robot_prefix>/robot_description
topic. - Publishes transforms to
/tf
. Transforms should be prefixed for the robot. - Subscribes to joint_states. Topic should be prefixed for the robot.
- Publishes
- Gazebo related nodes
gazebo_ros_diff_drive
plugin: Should be namespaced.gazebo_ros_joint_state_publisher
plugin: Should be namespaced.
- Create a workspace, clone this repository and build the package
mkdir -p ros2_ws/src
cd ros2_ws/src
git clone https://github.com/RobInLabUJI/multi_turtlebot_sim
cd ..
source /opt/ros/humble/setup.bash
colcon build
- Launch the standalone simulation, no robot is spawned
source /opt/ros/humble/setup.bash
source ros2_ws/install/setup.bash
ros2 launch multi_turtlebot_sim standalone_world.launch.py
Note: By default the empty world is used, you can also use world_name:=turtlebot3_world.world
.
- Spawn a robot using a
robot_prefix
in a particularx_pose
andy_pose
.
source /opt/ros/humble/setup.bash
source ros2_ws/install/setup.bash
ros2 launch multi_turtlebot_sim spawn_turtlebot3.launch.py robot_prefix:=robot1 x_pose:=0.5 y_pose:=0.5
The robot_prefix
will affect both the ros namespace and the tf prefix for that robot
- Spawn another robot in a different position
source /opt/ros/humble/setup.bash
source ros2_ws/install/setup.bash
ros2 launch multi_turtlebot_sim spawn_turtlebot3.launch.py robot_prefix:=robot2 x_pose:=-0.5 y_pose:=-0.5
Check how the tf tree is conformed:
source /opt/ros/humble/setup.bash
ros2 run tf2_tools view_frames
- The tf tree of each robot aren't connected therefore both robots in rviz can't be seen. As the simulation is starting the odom frame for each robot in the {0,0} world position we can add a static transform between both odometry frames to achieve the full tf_tree all connected.
source /opt/ros/humble/setup.bash
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 robot1/odom robot2/odom