1.ROS navigation为移动机器人导航相关包的集合,实现定位规划避障等相关功能。
整体工作流程为:
1.加载地图
navigation通过map_server加载现有地图。navigation无建图相关包,需另外实现后保存,默认只支持2维地图,其他包类似grid_map提供2.5维地图的加载。
2.发布TF坐标变换
navigation包内的AMCL提供map->odom的变换,AMCL实际为全局绝对定位,即map->base,但在应用时里程计会提供odom->base的变换,因此AMCL会获取TF信息转换后再发布map->base变换,navigation不包含里程计的实现,需另外独立实现。
3.启动move_base加载相关插件
move_base为导航的核心框架,通过预设接口(plugin)加载地图(costmap_2d)和规划避障(global_planner, local_planner, recovery)相关插件,读取设置参数(机器人外形,规划避障设置等),并发布相关话题和服务器。
实现机器人的自主导航除navigation外还需要一张图和里程计,当然navigation内部的算法都可以根据需要进行更换。
一张地图--map
amcl+里程计---odom
异常处理(recovery_behaviors)
一、一张地图--map
1.要进行导航,我们肯定需要有个地图,这个地图可以手绘也可以用SLAM方法来创建,但是原始的地图并不能直接进行导航,通常需要先将其转换成“代价地图”(cost_map)。
什么是“代价地图”,就是说机器人在地图里移动是需要付出“代价”的,这个“代价”有显性的也有隐性的。显性的,比如行走的距离,绕远路费电啊,这是最明显的“代价”。隐性的,比如靠近障碍物,万一机器人一哆嗦就磕着脑袋碰着胳臂了,这是隐性的“代价”。还有一些机器人体型比较长(无人驾驶大卡车有木有),转个弯掉个头巨费劲,对它来说,路线转弯太多也是“代价”,所以导航的路线越顺滑代价就越小。
1.因此产生global_costmap,是由全局地图(通常是SLAM建好的)和激光雷达侦测到的当前机器人周围的障碍物分布融合后生成。
map_server提供的全局地图代表的是以前记录的地图。近处的变化可以用激光雷达侦测扫描由sensor_source提供;
越靠近障碍物,与障碍物碰撞的风险越大,于是颜色越深,隐性“代价”越大;移动距离产生的显性代价,通常都是在路径规划算法内部才会实现,一般不会显示。
2.有了代价地图,由全局规划器(global_planner)来生成得到导航的路线;
global_planner 全局规划器的任务就是从外部获得导航的目标点,然后在全局代价地图里找出“代价最小”的那条路线;
3.现在nav_msgs/path路线已经有,突发情况如何规避,这就是局部规划器(local_planner)。局部规划器的工作就是从全局规划器获得导航路线,根据这个路线向机器人发送速度,驱动机器人“尽可能”按照路线去行走。
局部规划器(local_planner)的调教也是最曲折最费时的部分。因为机器人的底盘类型千差万别,有的只能前后移动和原地转向(差动底盘),有的可以360°随意移动(全向底盘),有的底盘是履带双足四足甚至多足,除非撞墙否则都不带避障的.
4.局部规划器利用激光雷达获得的当前障碍物数据,又做了一个“代价地图”,叫做局部代价地图(local_costmap)它是由sensor_source联合产生的。
远处瞅个大概,近处瞄得仔细,既有大局观,又注重局部视野,再加上各种细节走位。
全局地图是导航;局部地图是视野(躲避行人,红绿灯等特殊情况);amcl是gps(告诉你现在在哪里);
二、amcl
多重影分身之术;
所有分身随机的分布在地图里,rviz里面的PoseArry;机器人移动时,所有的分身也跟随移动,在移动的过程中,会不停的用激光雷达扫描到的身边障碍物和地图进行比对,以判断自己是不是那个正确的位置。比如有的分身走着发现面前一堵墙,再查查地图里自己的位置,这地方没有墙自己的位置八成是错的,于是“嘭”的一声,这个分身就消失了。最终收敛成少量的分身,也就最有可能是机器人位置的真身。
三、异常处理(原地旋转)
导航调试中,最常见的问题莫过于机器人遇到新出现的障碍物时,会不停的原地打转。
recovery_behavior”的机制
recovery_behavior”被激活,通常是出现在机器人面前被大体积的障碍物挡住导航路线的时候。一些局部规划器(local_planner)如果参数设置不合理,就会导致规划不出能绕过障碍的局部路线。
在ROS中,“recovery_behaviors”里默认行为通常会设置为“rotate_recovery”,也就是让机器人原地旋转,用激光雷达去完全的扫描附近的障碍物。
按照“recovery_behavior”设计的机制,当转圈也解决不了问题的时候,最终还是得全局规划器(global_planner)出马,按照现在的囧境,重新规划一条新的全局导航路线;
参考大神:5分钟看懂ROS的Navigation导航系统-云巴巴 (yun88.com)https://www.yun88.com/news/992.html