前一段時間總有一個想法,那就是,我只直到視覺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可以解決的問題。?