序言
机器人在完成建图后即可在建立好的地图中进行导航,在ROS机器人中,导航使用到Navigation功能包集。Navigation包中最重要的就是Amcl与Move_base两个核心节点,本篇将详细讲解这两个核心节点及其参数。
Navigation导航原理
一. 基本概述
ROS机器人导航功能的实现主要是依靠 navigation 功能包集来完成的,navigation 是 2D 的导航包集,它通过接收里程计数据、tf 坐标变换树以及传感器数据,为移动机器人输出目标位置以及安全速度。
二. 导航逻辑图
三. 功能分析
导航功能的核心是 move_base 节点,它接收来自里程计消息、机器人姿态位置、地图数据等信息,在节点内会进行全局规划以及局部规划。其中局部规划是为了能在导航过程中随时根据环境的改变来改变自己的路径,达到自动避障的效果。
导航功能的实现首先要有的三个因素就是地图、导航的起点、终点目标,并在导航过程中不断根据里程计、激光雷达等传感器数据来确定自己的位置。在 navigation 导航功能中,首先会根据代价地图规划处起点到终点的路线,然后结合里程计信息以及激光雷达的数据判断当前位置并规划处当前位置附近的局部路线以达到避障的效果。最终将局部规划的路线以速度指令的形式输出。
我们来分析一下 navigation 这个 launch 文件:
可以看到启动了三个核心节点
- Map_server:加载地图到地图服务器
- Amcl:基于地图和激光雷达,里程计实现概率定位
- Move_base:导航与路径规划节点
接下来详细讲解一下Amcl与Move_base的功能参数。
Amcl自主定位
一. 基本概述
Amcl 是基于现有地图与激光雷达实现概率自定位的节点,用于确认并输出机器人在当前地图中的位置。
二. Amcl订阅与发布
Amcl 订阅的话题:
/scan | 激光雷达输出的话题,在进行 amcl 定位时,这个是必不可少需要订阅的话题,因为我们要知道目标周围的环境状态。 |
---|---|
/tf | 订阅了各坐标系转换的话题,用于查询各坐标系的转换。 |
/initialpose | 用于(重新)初始化粒子滤波器的平均值和协方差,简单来理解就是先预估计一下机器人的初始位姿。 |
/amcl/map | 当在launch文件中设置了use_map_topic 为true 时,amcl 则订阅该话题获取地图,然后使用基于激光来进行定位,当然设置use_map_topic 为 false 时不订阅该话题也是可以的。 |
Amcl 发布的话题:
/amcl_pose | 机器人在地图上带有协方差的位姿估计, 这个是话题是整个粒子滤波定位的最终输出结果,该话题输出的位姿信息是根据全局坐标系/map 的坐标转换后的位置。 |
---|---|
/particlecloud | 在粒子滤波器维护下的一组粒子位姿估计,可以直接在 rviz 中显示,查看粒子的收敛效果。 |
/tf | 发布从 odom 坐标系到 map 坐标系的转换,当然该 odom 坐标系可以使用odom_frame_id 参数来重新映射为自定义的坐标系名称。 |
三. Amcl可调整的参数
滤波器可以设定的参数:
min_particles (int, default: 100):滤波器中的最少粒子数,值越大定位效果越好,但是相应的会增加主控平台的计算资源消耗。
max_particles (int, default: 5000):滤波器中最多粒子数,是一个上限值,因为太多的粒子数会导致系统资源消耗过多。
kld_err (double, default: 0.01):真实分布与估计分布之间的最大误差。
kld_z (double, default: 0.99):上标准分位数(1-p),其中 p 是估计分布上误差小于 kld_err 的概率,默认 0.99。
update_min_d (double, default: 0.2 meters):在执行滤波更新前平移运动的距离,默认 0.2m(对于里程计模型有影响,模型中根据运动和地图求最终位姿的似然时丢弃了路径中的相关所有信息,已知的只有最终位姿,为了规避不合理的穿过障碍物后的非零似然,这个值建议不大于机器人半径,否则因更新频率的不同可能产生完全不同的结果)。
update_min_a (double, default: π/6.0 radians):执行滤波更新前旋转的角度。
resample_interval(int, default: 2):在重采样前需要滤波更新的次数。