1. 仿真工程链接地址
https://github.com/robinhyg/tb3_gazebo_learning.git
2. 创建仿真工程
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ git clone https://github.com/robinhyg/tb3_gazebo_learning.git
$ cd ~/catkin_ws
$ rosdep install --from-paths src -i -y
$ catkin_make
安装完毕后,检查一下catkin_ws工程的ROS环境配置是否已添加至~/.bashrc文件(应该在安装TurtleBot3时已完成添加),如果没有则还需要通过以下方式添加。
$ echo "source ~/catkin_ws/devel/setup.bash " >> ~/.bashrc
$ source ~/.bashrc
3. 仿真启动
工程添加完成后,可以测试启动tb3仿真。tb3的启动launch文件放置在tb3_sim_bringup包的launch文件夹下,可以通过多种方式查看。
方式 1:
$ roscd tb3_sim_bringup
$ cd launch
$ gedit tb3_empty_world.launch
方式 2:
$ rosed tb3_sim_bringup tb3_empty_world.launch
此方式需要在~/.bashrc文件中指定rosed编辑器,可选择的编辑器有vim、emacs、nano、gedit等(详见ROS官方tutorial中rosed部分)。
$ echo "export EDITOR='gedit'" >> ~/.bashrc
$ source ~/.bashrc
方式 3:
$ gedit `rospack find tb3_sim_bringup`/launch/tb3_empty_world.launch
以上三种方式,以第二种最为简洁,实际使用过程中比较推荐。
代码分析
<launch>
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle]"/>
<arg name="x_pos" default="0.0"/>
<arg name="y_pos" default="0.0"/>
<arg name="z_pos" default="0.0"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find turtlebot3_gazebo)/models/empty.world"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="false"/>
<arg name="headless" value="false"/>
<arg name="debug" value="false"/>
</include>
<param name="robot_description" command="$(find xacro)/xacro.py $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model turtlebot3_$(arg model) -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos) -param robot_description" />
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen">
<param name="publish_frequency" type="double" value="50.0" />
</node>
<!--
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find tb3_sim_bringup)/rviz/demo.rviz"/>
-->
</launch>
以上代码,第2~5行通过环境变量TURTLEBOT3_MODEL的指定,设置tb3使用的机器人(burger和waffle两种),以及机器人的初始位置。
第7~14行通过include的方式,启动gazebo_ros并指定了相关参数设置。
第16行通过xacro的方式,调入tb3机器人的urdf模型。
第18行通过api进行gazebo_ros调用,在gazebo中动态添加机器人模型。
第20~22行运行一个robot_state_publisher节点,用来发布机器人urdf模型中指定的各个link之间的tf关系,这个比较重要,如果没有他则机器人在rviz中不能正常显示。这个节点的输入是gazebo仿真输出的joint_states话题,输出是tf。
运行
该文件的运行命令如下:
$ roslaunch tb3_sim_bringup tb3_empty_world.launch
运行后并没有弹出gazebo的client显示界面,这是由于程序中第11行设置的gui值为false(关闭gui可提升仿真运行速度),如果希望显示client界面,将这个参数改为true,在从新运行即可。client界面显示如下:
gazebo仿真启动后,还可以另外打开两个命令终端,分别运行teleop和rviz节点,来控制和显示tb3机器人:
终端窗口1:
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
终端窗口2:
$ rosrun rviz rviz -d `rospack find tb3_sim_bringup`/rviz/demo.rviz
运行结果如下:
这时可以尝试用键盘来控制机器人行走(需要使teleop节点运行的终端窗口获得当前输入焦点),在rviz中观看移动显示。
还可以新开启一个命令终端窗口,输入rqt_graph来显示系统节点和话题关系图。这对于初学者理解各个节点之间的相互关系非常重要。
参考资料:
[1] ROS官方wiki:http://wiki.ros.org/
[2] TurtleBot3电子手册:http://emanual.robotis.com/docs/en/platform/turtlebot3/overview/
[3] 《ROS by Example》 R.Patrick Goebel