序
我在毕业了之后进入了一家传统企业里做AGV,团队整体来说比较不成熟,不过我作为一个完全没有接触过AGV的人来说更加不成熟。
一进来的时候团队刚刚用一套开源代码实现了简单的定位和导航工作,使用的是Gmapping算法进行定位以及move_base的自由导航。在这个阶段,我们能对开源代码做的也就是改一些参数,看一看原理之类无关痛痒的工作。
后来在10月份我们要出一款新产品,用了几个月的gmapping感觉这个算法对里程计依赖过于严重,而且没有全局自动重定位的功能。虽然从计算消耗和定位稳定性的角度来说,gmapping的能力已经基本能满足要求了,但是为了能更进一步,我们使用了google2017年开源的代码cartographer。
cartographer作为一个谷歌推出的神级代码,里面仅仅依赖了它自己写的protoc序列化的库和engine做计算的库,非常的简洁而且能做到全局匹配重定位。我们就先将cartographer跑通,然后进行了一些小测试。虽然我们在11月的时候用cartographer完成了我们的任务目标,但是它由于激光slam存在的固有缺陷,在遇到相似的小场景时经常会发生跳变和旋转,定位的稳定性不够好,对环境的要求也更加高。
其实做了这么几个月关于定位的算法,我发现cartographer的突出贡献在于将BBA(分支界限法)加入到了scan-to-map的评分机制当中,加速它计算的效率。虽然我还没有深入地研究分支界限法是如何进行加速的,但是我在看了orbslam和其他等等的slam机制之后,我认为slam可以很简单地分为scan-to-scan以及scan-to-map两种形式。
简单来说,scan-to-scan的原理就是通过上一帧和这一帧的变化情况来判断自己走了多远,然后跟上一帧的位置进行计算,这个不一定通过激光来判断,也可以加入IMU、里程计等等东西。
scan-to-map的意思就是我通过观察身边的某些东西,发现跟我记忆力地图的某个角落很相似,然后比对一下发现匹配上了,那么我就知道我大概在地图的哪一个角落了。
从这两个大方向出发,我希望能自己写一些很简单的实现原理以及代码,来确保自己能对其他的定位代码有更深入的了解。
网友评论