type
status
date
slug
summary
tags
category
icon
password
文章前言:
本文主要介绍Navigation导航的一些相关知识点,包括全局规划器、局部规划器、DWA、TEB等。
ROS:导航篇
Navigation导航系统

ROS导航架构图对比如下

- 矩形表示node节点
move_base第一次导航尝试
move_base即中间的大矩形,表示导航节点
- 环境准备
- 安装wpr_simulation仿真环境
- 安装wpr_home机器人驱动源码包,简化参数
- 准备导航所需地图
- roslaunch wpr_simulation wpb_gmapping.launch启动仿真环境
- rosrun wpr_simulation keyboard_vel_ctrl扫描地图
- rosrun map_server map_saver -f map保存地图文件
- 编写导航的launch文件
- 创建nav_pkg软件包
- 新建launch文件夹
- 编写launch文件

- 运行导航程序
- 运行仿真环境roslaunch wpr_simulation wpb_stage_robocup.launch
- 运行launch文件roslaunch nav_pkg nav.launch
- 使用rviz发送导航点:2D Nav Goal
全局规划器
相当于手机地图里的导航软件,主要用来生成大地图的导航路线。
在move_base中也提供了多种不同的规划器,每种规划器也提供了多种不同风格的导航算法。

- move_base默认使用Navfn全局规划器。
- 前两者在功能上没有区别,默认使用Dijkstra算法,可设置参数调整使用A*算法。
- 由于Navfn代码冗杂,且A*算法存在bug因此出现了第二种性能更优,参数更丰富,且有维护的算法。
- 而最后一种比较简单,即从起始点到目标点延伸一条路径,遇到障碍物就停止。
- 但是由于最后一种代码简单,常被用作自定义规划器的模板进行修改。
move_base支持自定义全局规划器,它提供一种Plugin插件接口,只要按照特定的格式,就能把自己编写的路径规划算法编写成新的规划器。
AMCL定位算法
AMCL,全称Adaptive monte Carlo Localization,自适应蒙特卡洛定位算法。是一种使用粒子滤波在已知地图中进行定位的算法。它同时使用了里程计和激光雷达数据,具有较强的自我纠错功能。
简单来说,就是周围有一堆粒子分身,每个分身都进行扫描,与真实的扫描结果进行对比,保留最符合真实情况的粒子,不断迭代得到最终最准确的结果。
代价地图Costmap
global_costmap全局代价地图,在全局所有的障碍物外围围上一圈障碍物。
- 代价地图是对地图上所有的点进行膨胀得到。
- 生成代价地图的范围越大,需要的计算时间就越长。
- 全局代价地图只有在规划全图导航路线的时候才会用到。

local_costmap局部代价地图,考虑的范围较小,计算耗时短,用于给局部规划器进行实时避障。
代价地图的参数设置。

- robot_radius:即机器人底盘半径,为第一个膨胀区。
- inflation_radius:膨胀半径,为第二个膨胀区。
- 通过危险程度不同的两层膨胀区域。保障了导航在开阔空间里尽可能远离障碍物,在狭小的路口也不会被膨胀区域堵死,能从最中间最安全的路劲通过,同时兼顾了安全性和可通过性。
- obstacle_range:代价地图半径,一般设置为激光雷达的有效检测距离。
- raytrace_range:用于清除动态障碍物的残留影子。
- observation_sources:动态障碍物的观测来源。
- 最后是观测源的数据参数。
global_costmap全局代价地图
- global_frame:地图的坐标系名称map
- robot_base_frame:机器人地盘坐标系名称
- static_map:是否将map_server发来的地图数据作为初始地图。
local_costmap局部代价地图
- 局部代价地图的global_frame通常会设置为odom,以odom作为参考系,测出的障碍物位置不易跳变。
recovery_behavior恢复行为

- 其中的保守重置和激进重置作用较小
- 适合激光雷达存在盲区的情况
Recovery_behavior参数设置
- 重置行为reset_recovery将看不到的地方恢复成出厂设置
- 旋转行为rotate_recovery
- MoveSlowRecovery
以下两个必须修改一处,否则由于名称对应不上导致恢复无效


局部规划器
局部规划器其实是机器人的运动控制器,它接收到全局规划器的路线后,会根据实际路况和机器人底盘的运动特性操纵机器人设法沿着导航路线移动,最终完成导航任务。
WpbhLocalPlanner:根据激光雷达采集到的障碍点信息,把代价地图、Dijkstra算法在局部规划器里再实现一遍,避障过程采用人工势场的方法,绕过障碍物后马上回到全局路线上。主要追求的是运动行为的确定性,但是因此也缺乏了通用性。
DWA规划器
采样:对速度分量的取值操作。
轨迹的生成
- 底盘加速度限制
- 与障碍物有效的刹车距离
- 尽快到达轨迹终点
轨迹的选择
- 运动轨迹与全局导航路线的贴合程度——过程
- 轨迹末端和目标点的距离——目标
- 轨迹路线和障碍物之间的距离——风险
rqt_reconfigure指令:可以进行动态调参
在众多参数中,执行路劲的挑选参数最为重要,尤以前三个为重。
TEB规划器
Timed Elastic Band时间弹力带,常用于一些竞速比赛。
全局规划器发来全局导航路线,TEB会在这段导航路劲上选取一段进行优化。
- EB:随机选取一段弹力带,其中全局路线产生吸引力,路线旁的障碍物产生排斥力。
- T:根据机器人的速度、加速度等运动性能,在这个弹力带上预测机器人未来相同时间间隔位移,当存在多条路劲时,就会选择其中最快的一条。
安装指令:sudo apt install ros-noetic-teb-local-planner
标志:倒车入库。因此适合阿克曼底盘这种不能原地选择的机器人,同时在机器人后方没有雷达视野时需要谨慎选择。
编程实现
导航的Action编程接口
Action:双向通信,Client和Server。
坐标导航的C++编程实现
- 编写节点代码nav_client.cpp
- 构建action客户端
- 向move_base发送导航目标值
- 等待导航结果
- 设置编译规则
- 编译节点文件
- 运行节点文件
航点导航
- 保存固定航点信息:包括名称,六元坐标,朝向等
C++实现方法
- 新建节点wp_node.cpp
- 节点初始化
- 发布nav_pub
- 订阅res_pub
- 编写订阅节点的回调函数NavResultCallback显示导航结果
- sleep(1)
- 编写消息包msg.name
- 发布消息包
- ros::spin()使程序节点保持运行别退出
- 添加编译规则
- 运行
📎 参考文章
- 一些引用
- 引用文章
有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://tangly1024.com/article/2c6c7b13-c6a7-80b0-a578-cb3b63131b13
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!


