转载自:https://zhuanlan.zhihu.com/p/53972892
三川小哥
OmniVision 算法优化工程师
兄弟们,我正在崩溃的边缘,不过我还在撑着。因为我想在因子图优化方向发一篇文章(泪目)。
先絮叨两句我的情况吧~
我在因子图优化这个坑里蹲了半年多了吧!目前仍然没有找到适合我的论文点。因为走过很多弯路,把很多时间浪费在无关紧要的地方。我写这篇文章的目的就是,想让兄弟们踩着我的肩膀继续网上冲,我可能扛不住了(再次泪目),但是我希望能看到这篇文章的你(☞)能坚持下去。
我后面分三个部分说:
1. 怎么快速入门。
2. 有哪些研究点可以挖掘。
3. 有哪些坑需要避过。
我刚开始时因为看cartographer的那篇论文,根据里面的介绍找到了平方根sam和isam2.
然后顺藤摸瓜找到了gtsam,还发现了一本书
factor graphs for robot perception
心里一合计,有论文有教材还有开源的框架,岂不美哉。就它了
然后我给导师汇报说:“SLAM经历了三个阶段
2. 图优化阶段:全局一致性优化
3. 增量平滑阶段:用贝叶斯树维护一个动态更新的数,兼具滤波的速度和图优化的精度
而我的研究方向正处于第三个阶段,代表先进生产力的发展方向”
老师拍拍我的肩膀说:“有想法,万元红包等着你”。
然后就开始了漫长的蹲坑。
我的错误路线:
我首先把bayes tree那几篇论文打印了出来,然后看看看,看不懂。
估计作者没有把细节说出来,细节在哪呢,对了,开源的框架GTsam,下载编译配置,学习库文件。哇哦,优美的C++,不错,写的很好。就是不太能看懂。
怎么办?看官方文档,有一本书啊,啊呼呼,打印出来好好看,暑假带回家,全部推到一遍<什么因子图,平方根矩阵,稀疏性,边缘化,增量优化,贝叶斯书,小弦,小团>一个概念一个概念过。额~~~ ,还是看不懂,一点都没懂。
怎么办呢,对了,他不是支持matlab吗,我就先看matlab的程序。matlab用着兼职爽啊,可视化的demo,真优美,嘻嘻,各个都能跑通,呼呼哈。不过源文件还是看不懂。
有点着急了,
怎么办,上网搜搜,一搜还真有个视频教程,泡泡机器人-董卿。这个好啊。先看三遍再说,看完没多大作用,就是简单的介绍了下。
再搜搜,哇,我找到了什么,我找到了作者本人的YouTube讲座视频呦。帅,看五遍。还是MKD~~~。
这时候有点丧。
要发论文啊,我的天哪,时间都过去这么久了。
是不是方法不对啊,我上一篇时怎么发表出来的呢,总结一下看看呗。
三川:论文怎么找点子
按照我总结的方法还是找不到点子,都是骗人的,哼,我还骗了别人,呜呜呜~~~
过了一段时间,看到刘富强把那本书翻译出来了,买了看看,没懂...
又过了一段时间,找到了少磷兄专门修改gtsam库的,他人员光广,一起建了微信群,他把这个圈子里的人竟然都拉进去了,讨论了几次,未果...
然后我就陷入了“论文-程序-教材书-论文-程序-教材书.......” 之间的切换循环中,(6个月后)直到现在....
好了,说了我的错误路线,就是想让大家吸取下教训“没有咬住一点使劲钻研, 一直在犹豫”
下面说下,我建议的正确学习路线:
首先,可以试着用一下gtsam这个库,有个直观的感受。
然后,切记,不要上去就打开库看源文件,这样一来限制你的思维,二来,浪费时间。应该看下那本书,中文翻译的最好,我推荐先看懂isam1中的 因子图构建,然后最好能把因子图的构建方法用matlab实现一下。
能够实现到,Ax=b这个方程。其实因子图的基本思想到这里已经完成了。
后面的那一堆更多的呢,只是对这个方程,以及增量优化这个方程的加速。【所以不要舍本逐末】
然后学习书中的QR分解实现稀疏优化。因为QR分解是能够实现增量平滑优化的最简单方法。如下:
然后再辅助上givens旋转。
这一步也学明白了,再开始看看因子图转成贝叶斯网的过程,即 消元顺序。
最后的最后,如果你能看到这一步,那就再看看 Bayes tree 的构建和更新吧。这块论文写的叫一个糊涂啊,我是没看懂。如果前几步都没学就直接看这里,我估计和我一样,浪费年华啊。
根据我的浅薄了解,因子图增量平滑,由两个方面可以出文章,算法改进和新的应用。
1 首先是isam1,isam1中采用整体优化和增量优化切换的方法优化,那么怎么切换呢,作者采用的是 固定N步,就整体优化一次。哈哈,看到了吧,你可以搞一个更加智能的方法(随机森林判定树啊)来判断什么时候增量平滑,什么时候全局处理。这块还真有兄弟跟进了,我查到了一片AprilSAM,就是在这块做的文章。创新点在下图中小字:
这个文章提出的这几点都可以继续深挖,像批处理和增量模式的切换条件 动态变量冲排序,减少回带次数。
2. isam2,即贝叶斯树,这块呢,我个人觉的(意思就是我没看懂),作者不知道是在造概念还是怎么的,里面用了好几种树的转换。流程多效率肯定就低,能否看懂这几种转换之间的关系 然后将其简化,所谓 end-to-end,哈哈哈
3. 关于贝叶斯树的深度调整,如果你仔细看的话就会发现,根据论文中的推导,树的深度会一直增加,那么,能不能吧树的深度调整一下呢。实不相瞒,我开始选定的方向就是贝叶斯树的平衡构建方法。不过 未遂。
基于增量平滑的新的应用方向。这里举个例子把,LOAM大家听过吧,我看了下最近的IROS会议中有个兄弟发了一篇文章叫 lego_loam,就是在LOAM的基础上加入了回环检测,后端采用了Gtsam优化。
首先,不要陷入到程序中,gtsam为了面向工程而开发的,不是教程,里面很多内容其实没必要学习,也看不懂,先看论文和书本。
正如导师今早给我说的,"找论文点的时候不要有太多的羁绊,要保持赤纯,代码只是思想的表达,算法思想永远是第一位,爱因斯坦的相对论....."。我的理解是,有一定理论基础后,在理论上推导,我就是深陷入代码之坑了。(为啥呢?因为矫枉过正,我上一篇就是最后编不出代码)。
还由一个大坑,不要直接上去就整贝叶斯树,他只是对增量平滑的一个改进,真正的算法核心就是 因子图的构建和 信息矩阵的增量优化(增量QR求解)划重点
最后呢,说一个我的困惑,我目前还没找到哪里需要这么实时准确的地图,就是说在跑的局部就需要全局的优化,我自己觉得这样的应用场景肯定是机器人的速度非常之快。
有时候一想其实隔一段时间优化一次也挺好呀。G2o,ceres。【黑人脸】
如果大家选定了这个方向,就抓住一个小点,咬住不放。能不能出文章,我就不敢保证了,因为我还没写出来,但是祝大家都能写出SCI。