上一篇:[译]机器人操作系统简介:终极机器人应用框架(上)
运行一个模拟系统
模拟世界
首先的目标是创建一个可以在其中模拟想要实现的脚本的环境。在stage_ros包中的stageros节点允许我们在一个由一张图片定义的2D图形中运行机器人。 在stage_ros包中有一个完整的针对世界文件和如何生成他们的语法。这些非常简单,但超出了我们的范畴。幸运的是, 这些包都带有几个demo世界。首先,去到文件的目录:
roscd stage_ros
cd world
在这个目录里有几个文件。运行其中一个,
rosrun stage_ros stageros willow-erratic.world
这样就创建了几个主题。每一个的意义在包的文档中都有说明。重要的部分是它有cmd_vel。
在显示的图形中,有一个蓝色的广场,代表你控制机器人。通过使用我们的代码或者_Robot Steering_,可以控制这个机器人。试试吧!
通过加载文件来启动系统
在我们的包中创建一个launch目录,并且在它里面创建一个teleop.launch文件。最后目录的结构应该看起来像这样:
toptal_tutorial/
├── CMakeLists.txt
├── launch
│ └── teleop.launch
├── package.xml
├── scripts
│ └── teleop.py
└── src
在teleop.launch文件中我们定义了一系列节点以及他们的互联。
<launch>
<arg name="world_file" default="$(find stage_ros)/world/willow-four-erratics-multisensor.world" />
<node pkg="stage_ros" type="stageros" name="simulated_world" args="$(arg world_file)"></node>
<group ns="robot_0">
<node pkg="joy" type="joy_node" name="joy_input"></node>
<node pkg="toptal_tutorial" type="teleop.py" name="joy_convert"></node>
</group>
</launch>
新的世界包括了四个机器人,并且他们每一个主题都有前缀robot_<n>。所以,0号机器人有一个叫作robot_0/cmd_vel的速度命令主题。 这就是为什么我们在命名空间中放置名叫robot_0的控制器,以便把他们的名字调整到新的格式。在这样的场景下,你可以想象得到在文件系统中这些主题的目录名字。
为了运行启动文件,不需要roscore。在某些场景,roscore只是无作为的启动文件的一个特别案例。如果缺少roscore,仅是第一个启动文件被加载时会运行 一个core,剩下的则连接到此。现在,我们通过这样来运行加载器:
roslaunch toptal_tutorial teleop.launch
如果全部都正确,结果会有一个带4个机器人的模拟器,其中一个机器人由我们的游戏柄或者操纵杆控制。这个世界比前一个的引擎盖要多得多。这四个机器人每一个都有:
/robot_<n>/base_pose_ground_truth
/robot_<n>/base_scan_0
/robot_<n>/base_scan_1
/robot_<n>/camera_info_0
/robot_<n>/camera_info_1
/robot_<n>/cmd_vel
/robot_<n>/depth_0
/robot_<n>/depth_1
/robot_<n>/image_0
/robot_<n>/image_1
/robot_<n>/odom
可用0,1,2,3来替换<n>。这把我们带到了最后一个主题。
使用rqt查看数据
我们不会深入研究rqt,但它是查看更复杂数据的完美工具。你可以尝试全部主题,但这里我们关注于image_0,image_1,depth_0,和depth_1这几个主题。
让我们加载rqt并移除全部开启的插件。现在打开4个图片展示台(Plugins > Visualization > Image View),并且在2x2的表格结构中放置他们。最后,在每个视图的左上角, 在四个状态主题中选择robot_0。
我们得到的是带尝试知觉的立体视觉,和低分辨率的摄像机。记住我们甚至可以获得这个结果而不用输入系统。如果我们只是这样运行(在stage_ros/world目录里面):
rosrun stage_ros stageros willow-four-erratics-multisensor.world
并且通过一个叫作/robot_0/cmd_vel主题添加_Robot Steering_插件,也可以获得带在屏幕滑块进行控制的相同的结果。
将结果应用到真实系统
大量的硬件都能完整支持ROS,这些经常由第三方志愿者提供。很多机器人平台有生成这些消息类型的驱动,而ROS有采取网络摄像头以及发布图片反馈的节点。
最后的结果是我们想要实现的一个模拟,通过以下修改也可以达到同样的效果:
在你的机器人的车载计算器上安装ROS
在车载计算机上创建一个启动文件把ROS和底层平台,全部高层的传感器如摄影机以及激光测距义等连接起来。需要的节点可能已经存在,或者可以通过在某一边为ROS创建发布者/订阅者,同时在另一边创建针对序列通信的驱动来实现
在启动时运行启动文件
在你的远程计算机中把export ROS_MASTER_URI=http://<robot_hostname>:11311/添加到你的bash启动中,使得远程计算机在给定的域名和端口寻找roscore
加载rqt并且/或者任意监控和控制机器人的脚本
这样下来其实只是在远程设备上放置合适的环境变量,其余的则是处理它本身。在计算机集群上运行ROS仅需要在每一个机器上都完成某一个步骤。
结论
我们已经通过非常少量的代码,演示了你怎样才能随心所欲操纵一个复杂系统的变量。简单的发布者/订阅者系统允许你快速开发在计算机集群中处理数据的软件管道,而不需要担心底层相关元素的实现。
我们只是使用了一个简单的模拟器,更复杂的模拟器如gazebo(也包含在完整的桌面版本中)可以让你创建有物理和复杂传感器的3D世界, 并且可以给你最终结果的体验和远在它被开发前的产品。
这个只是一个很基本的简介,但希望你对和这个多才多艺的框架一起工作的更感兴趣。
------------------------
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
本文翻译作者为:dogstar,发表于艾翻译(itran.cc);欢迎转载,但请注明出处,谢谢!