本章的理论内容我已经将其总结在了SLAM14讲学习笔记(六)后端(最难一章:卡尔曼滤波器推导、理解以及扩展)以及SLAM14讲学习笔记(七)后端(BA与图优化,Pose Graph优化的理论与公式详解、因子图优化)当中。 本文主要针对其中的代码进行讲解。
这章的代码纯粹靠自己学习,对于初学者来说是很难的。 我个人有些感觉:之前的练习,都是一些小demo,相当于实验内容。而这章,给读者展现了一些工程上的东西。类似于第9讲的设计前端,这章已经算一个小型的slam后端系统了。对于普通学生来说,C++的那一套东西,只是懂得理论,主要平时做实验,写代码还是属于面向过程的。从这节的代码中,我们可以充分的学习和体会到面向对象的优势与精髓,了解到工程上的一些设计思想。可能是因为有的一些架构属于C++的内容,而不是后端的理论内容,因此高博没有展开讲解,给初学者造成了困扰。其实他应该放一些笔记和注释在上面,不然谁都不可能无师自通不是吗。 我把我查资料、参考别的博主的和自己总结的本章带有注释的代码上传到了github主页中:SLAM第10讲后端1-带注释代码。
本章的g2o内容本身相比之前几章,没有什么特殊的难点。g2o的部分内容我之前总结过一节:参见这里。而本节的难点主要在于对整体项目的架构上。例如,common文件夹下的BALProblem跟优化数据txt对接,负责txt的读取、写入,同时还有生成PLY点云文件的功能;BundleParams类负责优化需要的参数值,默认值设定和用户命令行输入等功能。整体这样归类之后,所有优化数据就去BALProblem类对象中询问,参数就去BundleParams类对象询问。关于这些内容,高博并没有给出介绍,在其github主页中,也没有相关的注释文件。因此贸然去学习,感觉是非常困难的。好在有一些大佬已经做了一些探索,参考他们的笔记,可以大大减少我们的学习时间,加快学习效率。 详情参见:robinhjwy的博客-14讲程序注释 我对注释中,很多都参考了这位大佬的笔记,感谢有这些人的付出。
而本章的ceres内容,相比ch6中,增多了很多内容。除了上面的那位大佬,还有其他别的博主做过一些补充。 详情参见:短者的博客- Ceres-Solver学习笔记(3) 偷偷吐槽一下:高博在书中写出,相比g2o这样公开文档太少的库,更推荐读者使用Ceres这样的库来做SLAM。然而书中在ch7,8,9都是用的g2o,Ceres相关的内容太少了,还没有注释。可能高博把这个内容放在了课后,希望我们能通过自学来掌握吧。