【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们学习了amcl,但它只是navigation里面的一个package而已。真正的导航还包含很多的内容。举个例子来讨论下,我们假设需要一个机器人从a点走到b点,应该分成哪几个步骤来完成呢。首先,机器人需要确认下自己的位置吧,是在其他地方,还是已经在a点了?接着,机器人需要规划一条a点到b点的路径吧?规划的路径只是保证了这条道路的可行性,但小车本身的机械属性是不是可以走完这条路、每段路上的速度该如何规划,这是需要进一步细化的内容。所有这些都准备好了,下面就是机器人不停和底盘交互的过程了。
1、ros navigation的github地址
本身navigation是一个软件栈,里面有很多的内容,地址在这,https://github.com/ros-planning/navigation。
2、软件栈的结构图
这幅图的信息非常多,也非常重要,建议反复观看。它包含了用户层的输入、tf的输入、odom的输入、传感器的输入、map的输入,以及对外底盘的输出cmd_vel。在整个navigation最核心的部分,还包含了global_planner、global_costmap、local_planner、local_costmap,这些也是非常重要的。整个框架由move_base实现,每个细节又由具体的模块来实现。
3、全局搜路
所谓的全局搜路,就是global_planner。这方面有很多的算法,比如迪杰斯特拉算法、a*算法等等。这种算法主要是找出一条从出发地到目的地的拓扑路。本身搜路的过程就是一个拓扑搜索的过程,并不考虑robot自身的机械性能。
4、局部搜路
全局搜路本身只是一个简单分析一下路径实施的可行性。至于机器人究竟应该在节点之间怎么走比较好,这就是局部搜路的范畴。目前ros上面也提供了相关的局部搜路算法,比如dwa算法。和全局搜路算法相比较,局部搜路需要考虑到robot自身的一些机械素质,即规划的速度是否可以、规划的角速度是否可以、转弯半径是否可以。对于效率优先的场景而言,肯定是希望越快越好。但是对于robot来说,它本身又有自己的安全要求和设备性能瓶颈,所以这中间就有一个权衡和取舍的问题。
5、amcl定位
这里我们看到了amcl,也就是robot定位。实际生产中,amcl定位是非常重要的。但是实际场景中,稳定输出的环境特征是非常困难的,很多时候都需要我们人为去创造、或者设计出合理的环境特征。这样才能在实际场景中稳定地运行。所以hector slam也好,gammping slam也好,他们只是基础,但是仅仅依靠这些基础构建出来的栅格地图来定位,还是远远不够的。
6、控制目标输出
控制目标的输出,是我们所有操作的真正目的。前面我们已经知道,所有的控制目标都可以分成线速度控制和角速度控制,所以底盘的最终目标就是实现ros系统提出的线速度、角速度目标即可。