前一段时间总有一个想法,那就是,我只直到视觉slam是远远不够的,激光slam仍然是一个比较稳妥的技术,好落地,应用广泛,我想着,如果我学会了会大大增加自己的核心竞争力,所以我抽时间开始看关于激光slam和无人驾驶的相关内容,我也只是看个大概,由于没有项目支撑,所以我理解和明白的,接触的东西非常有限,由于没有很强的外部驱动力,我的进度很慢,并且学习质量也很差,代码看不下去,就这样陷入的恶性循环,我开始迷茫,感觉自己到达了瓶颈期,但又明白,我必须尽快的突破它,要不然结果很不好。
之前的想法就是从宏观上把控自己的认知,想着多接触框架,多学习更加广泛的知识,殊不知,我没有一个擅长的领域,很难在这样的强竞争力的技术领域站稳脚,我开始思考,我想要的事一种解决问题的能力,这种能力,不被不同的种类限制,就比如说,视觉slam里我可以,激光slam里我也可以,抛开slam领域,其他的地方我也有用武之地,这样思考起来,发现,一个东西很符合这样的标准,那不就是,编程能力嘛,当然这个有些宽泛了,再细化一些,但从slam领域,一个很突出的问题就是,优化问题,这是一个很关键的问题,如果没有优化,可想而知,一个slam系统将会有多糟糕,而解决优化问题,目前我们常用的是g2o和ceres两个库,当然,沈韶杰老师说,对于新进课题组的学生,它都会安排一个,手写优化器的任务,并且最多只能使用eigen库,好吧,咱们这里先降低难度,怎么使用现成的优化库,来解决现实中的问题,具有这样的能力,其实已经是很不错了。
上面的这种思维的转变,让我豁然开朗,我们需要积累的不是一个一个具体的问题,而是慢慢去掌握解决更多问题的通用方法只有这样,才能实现我们的真正的价值。
不啰嗦了,不过把上面的思路捯饬清楚了,自己的目标也就清晰了,干起活来也不会再犹豫不定,瞻前顾后了。
学习第一步:当然是临摹
就是先学会ceres-solver中给的examples中的例子。别怕麻烦,如果有时间可以自己敲一遍代码,从0开始构建起来你的优化库。
example中关于2d-slam和3d-slam的优化问题。我直接编译example没有成功,于是我创建了一个独立的工程,然后将slam_2d和slam_3d的代码重新写了一遍,然后调试通过,代码我放到了我的github上,https://github.com/Serena2018/ceres-solver
需要使用的数据集可以在下面这个链接上下载,https://lucacarlone.mit.edu/datasets/
下面分别是2d和3d数据优化前后效果的对比。
代码调试通只是第一步,更重要的是要理解代码,并且总结出,如何将实际问题抽象成一个在ceres-solver可以解决的问题。