之前一直想用gazebo来做多机器人的ROS仿真。然后看了gazebo教程,gazebo+ROS的教程。但是感觉教程异常的多,重点不突出。最终就是看完了,好像也看懂了但是却还是不懂怎么在gazebo里面仿真ROS多机器人。只知道添加一个ROS插件到多个机器人里面,可能要修改机器人的URDF文件。
但是其实之前博文《 ROS学习笔记之——移动机器人的导航》本人已经实现了单ROS机器人的gazebo仿真。
通过运行(roslaunch turtlebot3_gazebo turtlebot3_world.launch)就可以开启具备ROS通信功能的gazebo环境。那么实际上,不就是只需要在对应的launch文件修改成多个机器人(由一个变成多个)就可以实现gazebo多机器人ROS仿真了嘛hhhh
打开turtlebot3_gazebo/launch里面的turtlebot3_world. launch文件如下
好了,问题来了。。。。里面本身就已经有multi robot 的launch文件了hhh(但是这里先不管,后面会写博客介绍)先直接修改turtlebot3_world.launch文件(为了避免丢失原来的文件,先复制然后重命名为m_turtlebot3_world.launch)
<launch>
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="x_pos" default="-2.0"/>
<arg name="y_pos" default="-0.5"/>
<arg name="z_pos" default="0.0"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/turtlebot3_world.world"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"/>
<arg name="debug" value="false"/>
</include>
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
<node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model turtlebot3_$(arg model) -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos) -param robot_description" />
</launch>
修改如下
<launch>
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="first_tb3" default="tb3_0"/>
<arg name="second_tb3" default="tb3_1"/>
<arg name="third_tb3" default="tb3_2"/>
<arg name="first_tb3_x_pos" default="2.0"/>
<arg name="first_tb3_y_pos" default="-0.5"/>
<arg name="first_tb3_z_pos" default="0.0"/>
<arg name="second_tb3_x_pos" default="2.0"/>
<arg name="second_tb3_y_pos" default="0.5"/>
<arg name="second_tb3_z_pos" default="0.0"/>
<arg name="third_tb3_x_pos" default="2.0"/>
<arg name="third_tb3_y_pos" default="-0.8"/>
<arg name="third_tb3_z_pos" default="0.0"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/turtlebot3_world.world"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"/>
<arg name="debug" value="false"/>
</include>
<group ns = "$(arg first_tb3)">
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
<node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model $(arg first_tb3) -x $(arg first_tb3_x_pos) -y $(arg first_tb3_y_pos) -z $(arg first_tb3_z_pos) -param robot_description" />
</group>
<group ns = "$(arg second_tb3)">
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
<node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model $(arg second_tb3) -x $(arg second_tb3_x_pos) -y $(arg second_tb3_y_pos) -z $(arg second_tb3_z_pos) -param robot_description" />
</group>
<group ns = "$(arg third_tb3)">
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
<node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model $(arg third_tb3) -x $(arg third_tb3_x_pos) -y $(arg third_tb3_y_pos) -z $(arg third_tb3_z_pos) -param robot_description" />
</group>
</launch>
如果继续添加多个机器人,可参考上面进行更改(代码结构较简单),主要更改的地方是前面的<arg name=>这里定义一个turtlebot3的名字还有他的初始位置,最后面那里仿制我的写法就可以了;然后中间载入世界地图那里,可以根据需要自己在gazebo里面建好一个地图然后把它放入 ../turtlebot3_simulations/turtlebot3_gazebo/world 文件夹里面,再更改上面的<arg name="world_name"......>的路径就可以了
编译一下
cd ~/catkin_ws && catkin_make
运行下面命令
export TURTLEBOT3_MODEL=waffle
roslaunch turtlebot3_gazebo m_turtlebot3_world.launch
关于多个机器人的键盘控制。打开新终端,分别键入下面命令,就可以分别控制几个机器人
ROS_NAMESPACE=tb3_0 rosrun turtlebot3_teleop turtlebot3_teleop_key
ROS_NAMESPACE=tb3_1 rosrun turtlebot3_teleop turtlebot3_teleop_key
ROS_NAMESPACE=tb3_2 rosrun turtlebot3_teleop turtlebot3_teleop_key
而如果一个键盘控制多个机器人。由于这三个机器人分别定义在不同的ROS namespace中。为此最简单的方法是让发布器同时发布三个话题这三个话题是需要对应这三个namespace的topic的
则应该是在文件(/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_teleop/nodes/turtlebot3_teleop_key)中,
修改如下
pub = rospy.Publisher('cmd_vel', Twist, queue_size=10)
pub0 = rospy.Publisher('/tb3_0/cmd_vel', Twist, queue_size=10)
pub1 = rospy.Publisher('/tb3_1/cmd_vel', Twist, queue_size=10)
pub2 = rospy.Publisher('/tb3_2/cmd_vel', Twist, queue_size=10)
pub.publish(twist)
pub0.publish(twist)
pub1.publish(twist)
pub2.publish(twist)
即可以实现一个键盘同时控制多个ROS机器人运动。