0x00 What’s STDR Simulator?
STDR是Simple Two Dimentional Robot Simulator的缩写,它可以非常容易的对在二维平面移动的机器人进行仿真,STDR的设计目的不是为了像Gazebo那样的大型逼真的机器人仿真或者一个功能最全面、功能强大的仿真器,这款软件的目的是为了尽可能的简单的去模拟单个移动机器人的运动或者多个机器人的协同仿真。而且STDR不仅可以运行在一个有图形界面的环境中,还可以运行在一个无桌面环境的系统中,这样我们就可以在终端中使用ssh连接后就可以进行仿真任务了。 STDR可以完美的与ROS兼容配套,机器人上的传感器数据都是通过ros话题的形式发布。跟ROS运行一样,STDR的运行也可以将图形用户接口和服务器分开在不同的电脑上运行,而且STDR也可以和Rviz一起工作,在Rviz中将STDR中的机器人数据可视化显示。关于该仿真器的更多详细介绍可以观看其在ROS Wiki上的主页,网址如下: http://wiki.ros.org/stdr_simulator
0x01 安装STDR仿真器 下面介绍两种安装方式,一种是最简单的使用apt来安装,另外一种下载源码后自己编译来安装,下面先介绍第一种apt安装,直接在终端中输入如下命令: sudo apt-get install ros-$ROS_DISTRO-stdr-simulator 其中$ROS_DISTRO会根据当前安装的ROS版本来自动区分,如果安装的是indigo,那么就会被替换成indigo,如果安装的是kinetic就会被替换成kinetic,这样我就不用为了两个不同的ROS版本来写两遍安装命令了。 下面来介绍使用源码来编译安装,此方式不建议一般用户来尝试,只有当现在发布的功能已经无法满足自己的仿真需要才需要在源码基础上修改,不过要想增加自己需要的功能前提是自己对STDR源码结构需要非常了解才行,下面来介绍源码编译过程,首先从github下面源码,下载命令如下: git clone https://github.com/stdr-simulator-ros-pkg/stdr_simulator.git
当最后编译到达100%时整个编译过程就结束了,然后需要source devel/setup.bash这样就能保证在命令行中直接找到该仿真软件包了,通过使用下图中命令来操作来验证,只有出现下图所示的输出stdr的各项操作才能正常进行:
0x02 STDR代码架构介绍 在真正运行该仿真以前我们需要对该软件的实现需要有个简单的认识,这样在后面的实际运行中会了解的更加通透,首先查看一下源码目录组成:
在认识了各个代码目录后,需要弄清楚各代码直接是如何互相调用、协同工作来完成整个仿真任务的,了解这个简单的仿真软件实现方式非常有助于我们后对该代码的修改。 0x03 启动STDR进行仿真 对STDR有了初步的认识后,我们现在开始真正的启动来查看STDR的效果,直接在终端中输入以下命令即可启动,会自动弹出如下的窗口: roslaunch stdr_launchers server_with_map_and_gui_plus_robot.launch
启动后在地图的左下角会自动的生成一个机器人,其中红色的线是雷达的扫描输出,绿色的部分是超声波的输出。我们同样可以在rviz中显示该仿真环境,使用如下命令: roslaunch stdr_launchers rviz.launch
当将从上往下的视图方式修改为orbit视图方式后我们就可以来转换不同的观察视角了,那个像喇叭一样的东西就是超声波的输出。
接下来我们查看下当前的话题输出和服务列表,分别使用rostopic list命令和rosservice list命令即可:
话题和节点之间的关系图通过rqt_graph命令来查看,如下图所示:
0x04 控制机器人移动 (1)在控制机器人移动我们可以直接往控制其移动的/robot0/cmd_vel话题中发送消息即可,或者也可以使用teleop_twist_keyboard软件包来键盘遥控仿真机器人四处移动,这种控制方式跟我们在现实中控制真实的小车是一样的,这样就起到了仿真的作用,首先来使用向话题中直接的发布消息控制仿真机器人移动: rostopic pub -r 2 /robot0/cmd_vel geometry_msgs/Twist ‘{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}’
当开始向话题中发布消息后就会发现仿真的机器人开始顺时针转动,这是因为在ROS中规定角速度的正方向是逆时针方向,我们在发布的消息中角速度设定为-0.5,所以就会出现顺时针运动,运动效果如下图所示。
(2)接下来第二种方式是我们可以使用键盘来遥控仿真机器人来四处移动,首先需要下载teleop_twist_keyboard源码,下载操作步骤如下: git clone https://github.com/ros-teleop/teleop_twist_keyboard.git
对于teleop_twist_keyboard.py源码修改部分主要是修改成robot0仿真机器人的速度控制话题,因为默认的发送话题名称是/cmd_vel,这样键盘控制时没办法发送到指定的/robot0/cmd_vel话题上,也就没办法来遥控机器人了,所以需要修改话题名:
接下来我们就可以先编译一下该软件包,然后就可以运行该控制节点来遥控仿真机器人四处走动了,首先我们需要先进入工作空间的根目录运行catkin_make来编译该软件包,然后使用source devel/setup.bash配置环境变量使该软件包可以被搜索到,接下来就可以运行如下命令来启动该节点了: rosrun teleop_twist_keyboard teleop_twist_keyboard.py 当我们根据提示使用键盘上的按键就可以控制仿真机器人四处走动了,需要注意的是该仿真机器人对速度的处理方式为:当接收一条控制命令后会一直不断执行该命令,直到有下一条命令来改变当期的运行状态,如果想让机器人停止走动只需要按k键即可,向控制移动命令话题中发送全为0的控制命令就会让其停止移动,具体效果如下图所示:
0x05 创建多个机器人 到现在我们一直操作的就是一个机器人,接下来我们看看如何使用该仿真器创建更多的机器人,点击STDR Simulator工具栏中的Load robot工具就会弹出可以加载的各种传感器和机器人。
我们现在只加载robots目录下的各种机器人,下面是机器人的列表,我们加载pandora_robot.xml这款机器人,因为它跟默认显示的机器人相同型号:
当选中后点击open按钮后我们就可以在STDR Simulator上来选则放置的位置了,同时如果感觉放置的位置不合适还可以通过”Move robot”来更换位置,如果想删除机器人就选择“Delete robot”即可,具体操作如下图所示:
接下来我们使用rostopic pub方式来使两个仿真机器人同时运动,下面的两条命令大家可以根据自己创建的机器人来做相应修改: 向robot0发送一条控制其顺时针旋转的命令: rostopic pub -1 /robot0/cmd_vel geometry_msgs/Twist ‘{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}’ 向robot2发送一条控制其逆时针旋转命令: rostopic pub -1 /robot2/cmd_vel geometry_msgs/Twist ‘{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}’ 运动效果如下图所示:
0x06 参考资料 [1].ROS wiki上stdr_simulator的主页[OL]. http://wiki.ros.org/stdr_simulator [2].stdr_simulator的独立参考网址[OL]. http://stdr-simulator-ros-pkg.github.io/ [3].GitHub上stdr_simulator源码地址[OL].https://github.com/stdr-simulator-ros-pkg/stdr_simulator [4].GitHub上teleop_twist_keyboard源码地址[OL].https://github.com/ros-teleop/teleop_twist_keyboard
0x07 问题反馈 大家在按照教程操作过程中有任何问题,可以关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题即可,我基本上每天都会处理公众号中的留言!当然,如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流!