前言
目前课题上在做一些关于异构多机器人协同控制方面的工作(UAV + UGV),实验室里用的移动机器人为ROBOTIS公司的Turtlebot3,无人机为Parrot公司的Bebop2,这两种机器人都对ROS有很好的支持(可以直接通过cmd_vel发送运动指令),免去了对机器人底层运动控制的设计工作,很适合做控制的同学拿来做实物验证使用。 因为疫情原因帝都又推迟开学了,可是为了毕业和文章,实验还得抓紧做啊TAT,巧的是Turtlebot3和Bebop2刚好都有基于Gazebo的仿真模型和demo,于是就打算开一篇文章把我自己对这块的理解跟大家分享一下(关于RGBD相机的使用和视觉相关的文章先鸽一鸽,暂时没有精力去写了(っ*´Д`)っ) Ps:本来选用的是目前很火也很炫的Webots,但是Webots里Turtlebot3的例程并没有基于ROS的,相对Gazebo来说上手难度会高一些(QAQ主要是我不想花时间重新开始写运动控制的算法了) 大致的安排如下: 首先先用尽可能简单的算法实现Gazebo下的多Turtlebot3编队(先把流程打通),之后实现Bebop2无人机的仿真与编队,然后再跟大家分享一些关于多机器人理论相关的东西,最后再尝试一下将理论应用于实际仿真环境中。 本篇先大致讲一讲在Gazebo下多Turtlebot3的环境搭建。
1.仿真环境搭建
1.1 Turtlebot3包安装
首先需要下载安装Turtlebot3的依赖包
- 此时需要注意一下Ubuntu和ROS的版本
在 Ubuntu16.04
和 ROS Kinetic
环境下
sudo apt-get install ros-kinetic-joy ros-kinetic-teleop-twist-joy ros-kinetic-teleop-twist-keyboard ros-kinetic-laser-proc ros-kinetic-rgbd-launch ros-kinetic-depthimage-to-laserscan ros-kinetic-rosserial-arduino ros-kinetic-rosserial-python ros-kinetic-rosserial-server ros-kinetic-rosserial-client ros-kinetic-rosserial-msgs ros-kinetic-amcl ros-kinetic-map-server ros-kinetic-move-base ros-kinetic-urdf ros-kinetic-xacro ros-kinetic-compressed-image-transport ros-kinetic-rqt-image-view ros-kinetic-gmapping ros-kinetic-navigation ros-kinetic-interactive-markers
在 Ubuntu18.04
和 ROS Melodic
的环境下
sudo apt-get install ros-melodic-joy ros-melodic-teleop-twist-joy ros-melodic-teleop-twist-keyboard ros-melodic-laser-proc ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan ros-melodic-rosserial-arduino ros-melodic-rosserial-python ros-melodic-rosserial-server ros-melodic-rosserial-client ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro ros-melodic-compressed-image-transport ros-melodic-rqt-image-view ros-melodic-gmapping ros-melodic-navigation ros-melodic-interactive-markers
新建一个工作空间,然后安装Tutlebot3的源码
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src/
git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
cd .. && catkin_make
- 注意如果手中有Turtlebot3的实物的话,ROS在不同设备之间(Turtlebots和PC)需要IP才能通信,此时还需要对IP进行配置,由于本文主要讲述仿真环境中的应用,所以这部分内容暂时略过,有需求的小伙伴可以在评论区回复。
至此,Turtlebot3的包已经安装完毕,接下来针对仿真环境进行安装和配置。
1.2 仿真环境
首先安装仿真系统依赖包 在 Ubuntu16.04
和 ROS Kinetic
环境下
sudo apt-get install -y ros-kinetic-navigation ros-kinetic-teb-local-planner* ros-kinetic-ros-control ros-kinetic-ros-controllers ros-kinetic-gazebo-ros-control ros-kinetic-ackermann-msgs ros-kinetic-serial qt4-default ros-kinetic-effort-controllers ros-kinetic-joint-state-controller ros-kinetic-tf2-ros ros-kinetic-tf
在 Ubuntu18.04
和 ROS Melodic
的环境下
sudo apt-get install -y ros-melodic-navigation ros-melodic-teb-local-planner* ros-melodic-ros-control ros-melodic-ros-controllers ros-melodic-gazebo-ros-control ros-melodic-ackermann-msgs ros-melodic-serial qt4-default ros-melodic-effort-controllers ros-melodic-joint-state-controller ros-melodic-tf2-ros ros-melodic-tf
来到工作空间,安装 Turtlebot3_Simulation
包
cd ~/catkin_ws/src/
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
cd .. && catkin_make
由于turtlebot3的模型有burger, waffle或waffle_pi三种,首先需要制定 TURTLEBOT3_MODEL
的型号,由于实验室的小车是burger,所以仿真中也按burger来进行。
export TURTLEBOT3_MODEL=burger
或者为了方便,将其直接添加到环境变量中:
echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
之后启动仿真环境(在工作空间下)
source devel/setup.bash
roslaunch turtlebot3_gazebo turtlebot3_world.launch
之后便会启动Gazebo,如图所示:
1.3 验证环境
1.3.1 查看Topic
打开新终端,输入
rostopic list
可以看到存在如下topic
/clock /cmd_vel /gazebo/link_states /gazebo/model_states /gazebo/parameter_descriptions /gazebo/parameter_updates /gazebo/set_link_state /gazebo/set_model_state /imu /joint_states /odom /rosout /rosout_agg /scan /tf
其中,我们接下来马上就要用到的有: cmd_vel
来控制机器人的运动,订阅 odom
获取机器人的里程计信息等,之后会有具体的介绍。
1.3.2 建图
环境搭建完成之后再来验证一下turtlebot3的包是否安装完成,启动一个新终端,启动SLAM程序(在已经启动上文仿真环境的前提下)
roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
再打开一个新终端,启动键盘控制程序,之后根据提示,可以通过按键控制小车行走并逐步建立地图数据
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
打开新终端,输入指令就可以保存地图了
rosrun map_server map_saver -f ~/catkin_ws/map
1.3.3 导航
保存完地图之后关掉所有程序,打开终端重新启动仿真环境
roslaunch turtlebot3_gazebo turtlebot3_world.launch
启动导航程序,之后可以通过设定目标点的形式使Turtlebot3自主导航运动
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/catkin_ws/map.yaml
至此环境的搭建和配置就大功告成
- 由于目前的重点不在SLAM建图和导航,所以粗略贴一下机器人的建图与导航的demo,有兴趣的同学们可以自己查阅相关资料深入了解一下。
2.多机仿真
关掉所有的任务 首先打开 turtlebot3_empty_world.launch
文件
cd ~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch/
sudo gedit turtlebot3_empty_world.launch
看一下turtlebot3的启动文件:
可以看到,这里的launch文件可以对机器人话题名称、坐标进行简单设置。如此我们可以照葫芦画瓢新建一个launch文件
cd ~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch/
sudo touch multi_turtlebot3_empty_world.launch
sudo gedit multi_turtlebot3_empty_world.launch
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="fourth_tb3" default="tb3_3"/>
<arg name="first_tb3_x_pos" default="0.0"/>
<arg name="first_tb3_y_pos" default="0.0"/>
<arg name="first_tb3_z_pos" default="0.0"/>
<arg name="first_tb3_yaw" default="1.57"/>
<arg name="second_tb3_x_pos" default="0.0"/>
<arg name="second_tb3_y_pos" default="0.5"/>
<arg name="second_tb3_z_pos" default="0.0"/>
<arg name="second_tb3_yaw" default="1.57"/>
<arg name="third_tb3_x_pos" default="0.0"/>
<arg name="third_tb3_y_pos" default="1.0"/>
<arg name="third_tb3_z_pos" default="0.0"/>
<arg name="third_tb3_yaw" default="1.57"/>
<arg name="fourth_tb3_x_pos" default="0.0"/>
<arg name="fourth_tb3_y_pos" default="1.5"/>
<arg name="fourth_tb3_z_pos" default="0.0"/>
<arg name="fourth_tb3_yaw" default="1.57"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/empty.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) -Y $(arg first_tb3_yaw) -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) -Y $(arg second_tb3_yaw) -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) -Y $(arg third_tb3_yaw) -param robot_description" />
</group>
<group ns = "$(arg fourth_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 fourth_tb3) -x $(arg fourth_tb3_x_pos) -y $(arg fourth_tb3_y_pos) -z $(arg fourth_tb3_z_pos) -Y $(arg fourth_tb3_yaw) -param robot_description" />
</group>
</launch>
可以通过修改 tb3_x_pos
,tb3_y_pos
,tb3_z_pos
,tb3_yaw
分别设置每个机器人的初始位置和姿态角度。 打开新的终端,输入:
cd ~/catkin_ws
source devel/setup.bash
roslaunch turtlebot3_gazebo multi_turtlebot3_empty_world.launch
可以看到4台Turtlebot3出现在了仿真环境中
好啦,目前为止,多机器人的环境就搭建完成了,下一篇就要开始针对多个Turtlebot进行简单的编队控制了。