摘要
ROS 机器人操作系统在机器人应用领域很流行, 依托代码开源和模块间协作等特性, 给机器人开发者带来了很大的方便. 我们的机器人 "miiboo" 中的大部分程序也采用 ROS 进行开发, 所以本文就重点对 ROS 基础知识进行详细的讲解, 给不熟悉 ROS 的朋友起到一个抛砖引玉的作用. 本章节主要内容:
1.ROS 是什么
2.ROS 系统整体架构
3. 在 ubuntu16.04 中安装 ROS kinetic
4. 如何编写 ROS 的第一个程序 hello_world
5. 编写简单的消息发布器和订阅器
6. 编写简单的 service 和 client
7. 理解 tf 的原理
8. 理解 roslaunch 在大型项目中的作用
9. 熟练使用 rviz
10. 在实际机器人上运行 ROS 高级功能预览
9. 熟练使用 rviz
(1)rviz 整体界面
(图 29)rviz 整体界面
rviz 是 ROS 自带的图形化工具, 可以很方便的让用户通过图形界面开发调试 ROS. 操作界面也十分简洁, 如图 29, 界面主要分为上侧菜单区, 左侧显示内容设置区, 中间显示区, 右侧显示视角设置区, 下侧 ROS 状态区.
(2)添加显示内容
(图 30)设置 Global Options
如图 30, 启动 rviz 界面后, 首先要对 Global Options 进行设置, Global Options 里面的参数是一些全局显示相关的参数. 其中的 Fixed Frame 参数是全局显示区域依托的坐标系, 我们知道机器人中有很多坐标系, 坐标系之间有各自的转换关系, 有些是静态关系, 有些是动态关系, 不同的 Fixed Frame 参数有不同的显示效果, 在导航机器人应用中, 一般将 Fixed Frame 参数设置为 map, 也就是以 map 坐标系作为全局坐标系. 值得注意的是, 在机器人的 tf tree 里面必须要有 map 坐标系, 否则该选项栏会包 error. 至于 Global Options 里面的其他参数可以不用管, 默认就行了.
(图 31)添加地图显示
如图 31, 在机器人导航应用中, 我们常常需要用 rviz 观察机器人建立的地图, 在机器人发布了地图到主题的情况下, 我们就可以通过 rviz 订阅地图相应主题 (一般是 / map 主题) 来显示地图. 订阅地图的 / map 主题方法很简单, 首先点击 rviz 界面左下角 [add] 按钮, 然后在弹出的对话框中选择 [By topic], 最后在列出的 topic 名字中找到我们要订阅的主题名字 / map, 最后点击[OK] 就完成了对 / map 主题的订阅. 订阅成功后, 会在 rviz 左侧栏中看到 Map 项, 并且中间显示区正常显示出地图.
(图 32)添加 tf 显示
如图 32, 在机器人导航应用中, 除了观察地图外, 我们常常还需要观察机器人在地图中的位置以及各个坐标系的关系是否工作正常, 这个时候就需要通过 rviz 来显示 tf. 和上面添加显示主题的方法类似, 这里添加 TF 这个类型主题就可以了. 说明一下, 添加主题可以按主题类型查找, 也可以按主题名称查找. 上面添加地图主题就是按主题名称查找的, 这里添加 tf 主题是按主题类型查找的.
(图 33)添加里程计显示
如图 33, 我们可以通过 rviz 订阅里程计来观察机器人的运动轨迹(图中红色箭头连接起来的轨迹). 和上面添加显示主题的方法类似, 这里添加 / odom 这个主题就可以了. 这里特别说明一点, 我们需要去掉左侧栏中 Odometry 里面 Covariance 项后面后面的勾, 也就是在 Odometry 显示中不启用 Covariance 信息. Covariance 是描述里程计误差的协方差矩阵, 如果启用 Covariance 来描述 Odometry 将导致显示效果很难看, 所以建议去掉.
(图 34)添加机器人位置粒子滤波点显示
如图 34, 在机器人导航中, 通常采用 AMCL 粒子滤波来实现机器人的全局定位. 通过 rviz 可以显示全局定位的例子点. 和上面添加显示主题的方法类似, 这里添加 / particlecloud 这个主题就可以了.
(图 35)添加激光雷达显示
如图 35, 机器人 SLAM 和导航中用到的核心传感器激光雷达数据, 我们可以通过 rviz 显示激光雷达数据(图中红色点组成的轮廓). 和上面添加显示主题的方法类似, 这里添加 / scan 这个主题就可以了.
(图 36)添加摄像头显示
如图 36,rviz 还可以订阅摄像头发布的主题, 这样在 rviz 上就可以实现远程视频监控了. 和上面添加显示主题的方法类似, 这里添加 / usb_cam/image_raw 这个主题就可以了.
通过上面的实例, 我们已经知道在 rviz 中订阅需要显示的主题了, 被订阅的主题会在 rviz 左侧栏中列出, 并且主题的显示与否是相互独立的, 可以通过勾选的方式决定是否显现该主题, 主题项下拉条目中有很多参数可以设置, 这些参数决定显示的风格等等, 可以根据需要进行设置. 其他一些不常用的主题订阅实例没有给出, 有需要可以依葫芦画瓢在 rviz 中进行订阅显示就行了.
(3)主界面中常用按钮
(图 37)rviz 显示配置保存
在上面的添加显示内容的实例中, 我们在 rviz 中添加了很多主题显示项, 并对各显示项的参数做了相应的设置. 为了下次启动 rviz 时, 能直接显示这些内容和风格, 我们需要将当前的 rviz 显示风格以配置文件的方式保存, 下次启动 rviz 后只需要载入这个配置文件就能进入相应的显示风格. 很简单, 点击 rviz 左上角 [file] 菜单, 在下拉中选择 [Save Config As], 在弹出来的对话框中给配置文件取一个名字(我取名为 my_cfg1), 然后直接 Save,my_cfg1.rviz 配置文件会被保存到系统中 rviz 的默认目录. 下次启动 rviz 后, 通过点击 rviz 左上角[file] 菜单, 在下拉中选择[Open Config], 打开相应的配置文件就行了. 如图 37.
(图 38)机器人初始位置设定与导航目标设定
在机器人导航中, 当机器人刚启动的时候, 机器人位置往往需要人为给定一个大概的估计位置, 这样有利于 AMCL 粒子滤波中粒子点的快速收敛. 如图 38, 点击 [2D Pose Estimate] 按钮, 然后在地图中找到机器人大致的位置后再次点击鼠标左键并保持按下状态, 拖动鼠标来指定机器人的朝向, 最后松手就完成对机器人初始位置的设定了. 其实就是两步, 先指定机器人的位置, 再指定机器人的朝向. 我们可以在地图中指定导航目标点, 让机器人自动导航到我们的指定的位置. 通过 [2D Nav Goal] 按钮就可以完成. 操作步骤和机器人初始位置的设定是类似的, 就不累述了.
(图 39)获取地图中指定点的坐标值
有时候我们需要知道地图中某个位置的坐标值, 比如我们获取地图中各个位置的坐标值并填入巡逻轨迹中, 让机器人按照指定巡逻路线巡逻. 通过 [Publish Point] 按钮就可以知道地图中的任意位置的坐标值, 点击 [Publish Point] 按钮, 然后将鼠标放置到想要获取坐标值的位置, rviz 底部显示栏中就会出现相应的坐标值.
(4)rviz 启动方法
首先需要启动 roscore, 然后启动 rviz, 命令如下:
- # 打开终端, 输入下面命令
- roscore
- # 再打开一个终端, 输入下面命令
- rviz