跳转至

slam导航

ROS Navigation Stack概述

ROS Navigation Stack是ROS提供的一个二维的导航功能包集合,通过输入里程计、传感器信息和目标位姿,输出控制机器人到达目标状态的安全速度指令。 ROS Navigation Stack为移动机器人的导航规划提供了比较好的参考,通过实现功能包集合提供的接口,也可以比较容易地将自己的算法应用到移动机器人上。

整个功能包集合以move_base为核心,将里程计信息、传感器信息、定位信息、地图以及目标点输入给move_base,move_base经过规划后会输出速度指令。

move_base包括三个关键部分:

global_planner(全局规划器)

local_planner(局部规划器)

recovery_behaviors(恢复行为)

另外,move_base还包括了global_costmap(全局代价地图)和local_costmap(局部代价地图),规划器需要在代价地图上进行导航规划。

odometry(里程计)

简单来说,里程计的作用就是估计机器人运动的距离和速度。

通过阅读源码可以得知,在ROS Navigation Stack中,里程计信息有两个作用,一个作用是提供给局部规划器,当局部规划器选取最优路径和判断机器人是否停止的时候会使用到里程计的速度信息,另一个作用就是将估计位姿信息用于定位。

里程计信息一般从机器人底盘的轮式编码器获取,当然根据不同的机器人也可以选择使用视觉里程计,还可以使用扩展卡尔曼滤波对轮式里程计和IMU进行数据融合,得到更加准确的位姿估计。

消息类型nav_msgs/Odometry中包括了机器人的位姿和速度以及各自的协方差。

sensor(传感器)

传感器数据一般来自于激光雷达、IMU和深度相机,可以用于定位和避障。使用传感器需要设定传感器参考系与机器人参考系之间的坐标变换关系,也就是常说的tf变换,这样做是为了表示传感器感知到的环境与机器人参考系之间的关系。

激光雷达也可以感知到环境中障碍物的位置,通过将障碍物加入到代价地图中,实现避障。

tf

tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数据结构,根据时间缓存并维护多个参考系之间的坐标变换关系,可以帮助用户在任意时间,将点、向量等数据的坐标,在两个参考系中完成坐标变换。

机器人系统通常有许多随时间变化的三维参考系,例如世界参考系和机器人参考系。tf会随着时间的变化跟踪这些参考系。

基于ROS Navigation Stack实现移动机器人的自主导航,必须维护一棵完整的tf树,即map->odom->base_link->sensor_link。

map_server

map_server在ROS Navigation Stack中是可选的,其主要的作用就是给机器人导航提供地图。

通过map_server提供的地图为pgm格式,通过加载yaml配置文件,将地图以话题的形式加载到系统中。在yaml文件中可以配置地图的分辨率,原点以及表示占据/空闲的概率。下面为yaml配置文件的内容:

amcl(自适应蒙特卡洛定位)

amcl是ROS Navigation Stack中唯一指定的定位算法,全称为自适应蒙特卡洛定位,它是一种用于在二维环境中移动的机器人的概率定位系统。简单概括一下它的原理就是通过在全局地图中撒粒子,粒子可以理解为机器人的可能位姿。

按照评价标准,例如激光雷达数据与地图的匹配程度给粒子打分,分数越高代表机器人在这个位置的可能性越大,经过粒子滤波器以后留下的就是分数高的粒子了。

经过多次撒粒子,粒子就会集中到机器人位置可能性高的地方,称之为粒子收敛。自适应其实简单理解就是会根据粒子的平均分数或者粒子是否收敛来增加或减少粒子数

costmap_2d(代价地图)

在ROS Navigation Stack中,代价地图分为全局代价地图和局部代价地图,全局代价地图使用基于map_server初始化代价地图,也就是Static Map Layer(静态地图层),局部代价地图为基于滚动窗口的代价地图。

代价地图还包括Obstacle Map Layer(障碍物层)和Inflation Layer(膨胀层),有时候根据应用场景的需要也可以加入用户自定义层,用户自定义层可以用插件来实现。

上面这张图为ROS wiki上的一个示例,可以看到图中灰色部分即为静态地图,红色部分为传感器感知到的障碍物,蓝色部分为膨胀层。红色多边形表示机器人的形状,为了避免碰撞,机器人形状不应该和红色部分相交,机器人中心点不应该和蓝色部分相交。

move_base

move_base是整个ROS Navigation Stack的最顶层,它将各个功能模块组合起来,通过SimpleActionServer接收目标点并完成导航任务。

global_planner(全局规划器)

根据给定的目标位置和全局地图进行总体的路劲规划

global_planner功能包实现了两种路径规划算法:A*和dijkstra

local_planner(局部规划器)

局部规划器的一个基本流程就是读取局部代价地图,设定要跟踪的全局路径,对全局路径进行分段,根据分段的全局路径的坐标进行局部规划,计算机器人每个周期(采样周期)内的线速度、角速度,使之尽量符合全局最优路径,并实现实时避障。

recovery_behaviors(恢复行为)

恢复行为会在机器人移动过程中出现了异常状态时被触发,目的是帮助机器人摆脱异常状态

导航

1.启动gazebo节点

roslaunch turtlebot3_gazebo turtlebot3_autorace_2020.launch

2.打开键盘控制节点,移动到起点

roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

3.开始导航

roslaunch turtlebot3_navigation turtlebot3_navigation.launch