文章结构
- 导航模块简介
- 全局地图
- 自身定位
- 路径规划
- 运动控制
- 环境感知
- 导航之坐标系
- 坐标系变换
导航模块简介
在ROS中机器人导航(Navigation)由多个功能包组合实现,ROS 中又称之为导航功能包集,关于导航模块,官方介绍如下:
一个二维导航堆栈,它接收来自里程计、传感器流和目标姿态的信息,并输出发送到移动底盘的安全速度命令。
首先,机器人需要外部数据。而外部数据来源于里程计(里程计是用来测量移动物体移动距离和移动方向的一种装置)、传感器流(通过雷达或者摄像头感知到的障碍物信息)和目标姿态。将这些数据进行运算,输出就是控制机器人运动的速度指令。底盘接收到速度指令之后,就按照指令开始运动。
那么,机器人是如何实现导航的呢?
假定我们已经以特定方式配置机器人,导航功能包集将使其可以运动。上图概述了这种配置方式。白色的部分是必须且已实现的组件,灰色的部分是可选且已实现的组件,蓝色的部分是必须为每一个机器人平台创建的组件。
总结下来,涉及的关键技术有如下五点(请配合上图食用):
全局地图
在现实生活中,当我们需要实现导航时,可能会首先参考一张全局性质的地图,然后根据地图来确定自身的位置、目的地位置,并且也会根据地图显示来规划一条大致的路线。对于机器人而言也是如此。
map_server:地图服务,为导航提供一张全局性质的地图,同时也可以保存地图。
当然,如果要使用地图,首先需要绘制地图。
SLAM(simultaneous localization and mapping):即时定位与地图构建,或并发建图与定位。机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置估计和地图进行自身定位,同时在自身定位的基础上建造增量式地图,以绘制出外部环境的完全地图。
自身定位
amcl(adaptiveMonteCarloLocalization):自适应的蒙特卡洛定位,是用于2D移动机器人的概率定位系统。它通过传感器感知到的周边环境信息,和地图中的特征点进行匹配,通过一个匹配算法,去估计机器人的大致位置。它实现了自适应(或KLD采样)蒙特卡洛定位方法,该方法使用粒子过滤器根据已知地图跟踪机器人的姿态。
sensor transforms:传感器坐标变化,用于将感知到的环境信息进行坐标变换。
odometry source:里程计,可以感知机器人的运动距离和运动方向。
路径规划
在导航过程中,机器人需要根据目标位置计算全局运动路线,并且在运动过程中,还需要时时根据出现的一些动态障碍物调整运动路线,该过程称之为路径规划。
global_planner:全局路径规划,根据给定的目标点和全局地图实现总体的路径规划,使用 Dijkstra 或 A* 算法进行全局路径规划,计算最优路线,作为全局路线。
global_costmap:全局代价地图,用于描述环境中的各个位置的可行性或代价程度,以便机器人能够根据这些代价信息做出决策,选择最优的路径。全局路径规划依赖于全局代价地图进行计算。
local_planner:本地路径规划,在实际导航过程中,机器人可能无法按照给定的全局最优路线运行,本地规划的作用就是使用一定算法(Dynamic Window Approaches)来实现障碍物的规避,并选取当前最优路径以尽量符合全局最优路径。
local_costmap:本地代价地图,实时感知障碍物信息所生成的局部地图。本地路径规划依赖于本地代价地图进行计算。
recovery_behaviors:恢复行为,一种脱困策略。例如当遇到障碍物陷入死胡同时,试图恢复选择绕行。
运动控制
base_controller:机器人的底盘
通过话题cmd_vel
发布 geometry_msgs/Twist
类型的消息到机器人的底盘,这个消息基于机器人的基座坐标系,它传递的是运动命令。这意味着必须有一个节点订阅cmd_vel
话题, 将该话题上的速度命令转换为电机命令并发送。
环境感知
sensor sources:传感器如摄像头、激光雷达、编码器等,可以感知周边的环境,可以为本地代价地图以及SLAM、amcl、move_base提供支持。
导航之坐标系
定位是导航中的重要实现之一。所谓定位,就是参考某个坐标系(比如:以机器人的出发点为原点创建坐标系)在该坐标系中标注机器人。定位原理看似简单,但是这个这个坐标系不是客观存在的,我们也无法以上帝视角确定机器人的位姿,定位实现需要依赖于机器人自身,机器人需要逆向推导参考系原点并计算坐标系相对关系,该过程实现常用方式有两种:
- 通过里程计定位:时时收集机器人的速度信息计算并发布机器人坐标系与父级参考系的相对关系。
- 优点:里程计定位信息是连续的,没有离散的跳跃。
- 缺点:里程计存在累计误差,不利于长距离或长期定位。
- 通过传感器定位:通过传感器收集外界环境信息通过匹配计算并发布机器人坐标系与父级参考系的相对关系。
- 优点:比里程计定位更精准;
- 缺点:传感器定位会出现跳变的情况,且传感器定位在标志物较少的环境下,其定位精度会大打折扣。
坐标系变换
上述两种定位实现中,机器人坐标系一般使用机器人模型中的根坐标系(base_link 或 base_footprint)。里程计定位时,父级坐标系一般称之为 odom,如果通过传感器定位,父级参考系一般称之为 map。
当二者结合使用时,map 和 odom 都是机器人模型根坐标系的父级,这是不符合坐标变换中"单继承"的原则的。由于map精度会高一些,所以一般会将转换关系设置为:map -> doom -> base_link
或 base_footprint
。