写在前面

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高级功能预览

7.理解tf的原理

(1)机器人中的坐标系

一个机器人系统中通常会有多个三维参考坐标系,而且这些坐标系之间的相对关系随时间推移会变化。这里举一个实际的机器人应用场景例子,来说明这种关系和变化:

全局世界坐标系:通常为激光slam构建出来的栅格地图的坐标系map。

机器人底盘坐标系:通常为机器人底盘的坐标系base_footprint。

机器人上各部件自己的坐标系:比如激光雷达、imu等传感器自己的坐标系base_laser_link、imu_link。

这些坐标系之间的关系有些是静态的、有些是动态的。比如当机器人底盘移动的过程中,机器人底盘与世界的相对关系map->base_footprint就会随之变化;而安装在机器人底盘上的激光雷达、imu这些传感器与机器人底盘的相对关系base_footprint->base_laser_link、base_footprint->imu_link就不会随之变化。其实,这个很好理解。

如图25中,map->base_footprint会随着底盘的移动而变化,即动态坐标系关系。

(图25)动态坐标系关系

如图26中,base_footprint->base_laser_link、base_footprint->imu_link不会随着底盘的移动而变化,即静态坐标系关系。

(图26)静态坐标系关系

(2)机器人坐标关系工具tf

由于坐标及坐标转换在机器人系统中非常重要,特别是机器人在环境地图中自主定位和导航、机械手臂对物体进行复杂的抓取任务,都需要精确的知道机器人各部件之间的相对位置及机器人在工作环境中的相对位置。因此ROS专门提供了tf这个工具用于简化这些工作。

tf可以让用户随时跟踪多个坐标系的关系,机器人各个坐标系之间的关系是通过一种树型数据结构来存储和维护的,即tf tree。借助这个tf tree,用户可以在任意时间将点、向量等数据的坐标在两个坐标系中完成坐标值变换。

如图27,为一个自主导航机器人的tf tree结构图。圆圈中是坐标系的名称,箭头表示两个坐标系之间的关系,箭头上会显示该坐标关系的发布者、发布速率、时间戳等信息。

(图27)一个自主导航机器人的tf tree结构图

(3)使用tf

使用tf分为两个部分,广播tf变换、监听tf变换。

广播tf变换:

ROS网络中的节点可以向系统广播坐标系之间的变换关系。比如负责机器人全局定位的amcl节点会广播map->odom的变换关系,负责机器人局部定位的轮式里程计计算节点会广播odom->base_footprint的变换关系,机器人底盘上安装的传感器与底盘的变换关系可以通过urdf机器人模型进行广播(urdf将在后面实际机器人中进行讲解)。每个节点的广播都可以直接将变换关系插入tf tree,不需要进行同步。通过多个节点广播坐标变换的关系,便可以实现tf tree的动态维护。

关于广播tf变换的具体程序实现,请直接参考ROS官方教程http://wiki.ros.org/tf/Tutorials

监听tf变换:

ROS网络中的节点可以从系统监听坐标系之间的变换关系,并从中查询所需要的坐标变换。比如要知道机器人底盘当前在栅格地图坐标系下的什么地方,就可以通过监听map->base_footprint来实现,比如要知道机器人底盘坐标系上的某个坐标点在世界坐标系下的坐标是多少,就可以通过监听map->base_footprint,并通过map->base_footprint这个变换查询出变换后的坐标点取值。

关于监听tf变换的具体程序实现,请直接参考ROS官方教程http://wiki.ros.org/tf/Tutorials

参考文献 

[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

Github源码:https://github.com/xiihoo/Books_Robot_SLAM_Navigation