Navigation--导航机理

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)icon-default.png?t=M85Bhttps://www.yun88.com/news/992.html

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值