【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们学习了amcl,但它只是navigation里面的一个package而已。真正的导航还包含很多的内容。举个例子来讨论下,我们假设需要一个机器人从a点走到b点,应该分成哪几个步骤来完成呢。首先,机器人需要确认下自己的位置吧,是在其他地方,还是已经在a点了?接着,机器人需要规划一条a点到b点的路径吧?规划的路径只是保证了这条道路的可行性,但小车本身的机械属性是不是可以走完这条路、每段路上的速度该如何规划,这是需要进一步细化的内容。所有这些都准备好了,下面就是机器人不停和底盘交互的过程了。
本身navigation是一个软件栈,里面有很多的内容,地址在这,https://github.com/ros-planning/navigation。

这幅图的信息非常多,也非常重要,建议反复观看。它包含了用户层的输入、tf的输入、odom的输入、传感器的输入、map的输入,以及对外底盘的输出cmd_vel。在整个navigation最核心的部分,还包含了global_planner、global_costmap、local_planner、local_costmap,这些也是非常重要的。整个框架由move_base实现,每个细节又由具体的模块来实现。
图中的recovery_behavior也是蛮有意思的一点。目前ros提供的recvoery behavior机制可能不适用于所有robot,比如它提出的360°旋转,就不太适合一些工业机器人,需要开发者根据自己的实际情况灵活处理。
所谓的全局搜路,就是global_planner。这方面有很多的算法,比如迪杰斯特拉算法、a*算法等等。这种算法主要是找出一条从出发地到目的地的拓扑路。本身搜路的过程就是一个拓扑搜索的过程,并不考虑robot自身的机械性能。
全局搜路本身只是一个简单分析一下路径实施的可行性。至于机器人究竟应该在节点之间怎么走比较好,以什么样的速度走比较合适,这就是局部搜路的范畴。目前ros上面也提供了相关的局部搜路算法,比如dwa算法。和全局搜路算法相比较,局部搜路需要考虑到robot自身的一些机械素质,即规划的速度是否可以ok、规划的角速度是否可以ok、转弯半径是否可以ok,在此基础上尽可能实现全局搜路的路线要求。对于效率优先的场景而言,肯定是希望越快越好。但是对于robot来说,它本身又有自己的安全要求和设备性能瓶颈障碍,所以这中间就有一个权衡和取舍的问题。
所谓的global costmap,主要是指障碍物对robot的影响。global costmap显示的cost,要比实际扫到的障碍物cost要大一点,这也是为了安全考虑。而local costmap,主要是为了区别于global costmap,前者是利用传感器避开临时障碍物,后者是扫描物体时的障碍物,两者处理的场景不一样。
这里我们看到了amcl,也就是robot定位。实际生产中,amcl定位是非常重要的。但是实际场景中,稳定输出的环境特征是非常困难的,很多时候都需要我们人为去创造、或者设计出合理的环境特征。这样才能在实际场景中稳定地运行。所以hector slam也好,gmapping slam也好,他们只是基础,但是仅仅依靠这些基础构建出来的栅格地图来定位,还是远远不够的。
控制目标的输出,是我们所有操作的真正目的。前面我们已经知道,所有的控制目标都可以分成线速度控制和角速度控制,所以底盘的最终目标就是实现ros系统提出的线速度、角速度目标即可。

实际用ros做项目的时候,global planner和local planner都会替换成自己的算法,或者做部分修改。因为实际项目中,全局路径都是规划好的,只能在指定拓扑上搜路。而局部搜路和robot底盘关系密切,相关路径和速度的规划必须和底盘进行匹配才行。
对于一开始学习ros anvigation的同学来说,全局搜路可能比较好理解,局部规划有一点难度。这主要还是因为对于机器人线速度v、角速度w缺少了解。此外有的机器人可以原地旋转,转弯半径r为0;而有的机器人对转弯半径r有明确的最低要求。此外,不仅仅是转弯半径r,在最大线速度v、最大角速度w、最大线加速度av、最大角加速度aw方面,不同的机器人也是不一样的。所以我们可以通过学习ros自身提供的dwa算法,深入学习和了解一下局部规划究竟是怎么回事。
https://blog.csdn.net/weixin_42301220/article/details/127769819
在一定范围内,遍历所有的线速度v和角速度w,那么就可以计算出小车的转弯半径、行走轨迹。有了行走轨迹,就可以评价当前路径的好坏,方便给他们打分,评价标准当然可以有很多种,看我们需求而定。一旦确定了最高分的行走路径,接下来就把它发送给底盘,循环往复,这就是局部规划的意义所在。