最近由於項目需求,折騰了好久激光雷達與相機外參聯合標定,期間嘗試過好多能找到的開源的標定方法,包括matlab、livox、autoware等,但是最終還是選擇使用autoware calibrationtoolkit 來進行激光和相機的標定主要原因如下:
1、autoware工具操作方便,可以很快在激光點雲里選取到標定版的點;
2、autoware工具標定結果相對較好,前提是錄制的數據得覆蓋各種場景;
先貼代碼鏈接:https://github.com/XidianLemon/calibration_camera_lidar.git
使用autoware工具最令人頭疼也最折騰的就是環境問題,本來我一開始想在jetson xavier上直接編譯該代碼,這樣就能進行在線標定,而不用錄包了。可是在jerson xavier編譯報錯,主要是opencv和cv_bridge版本的問題,當時發現一個師弟電腦16.04系統編譯這個代碼很流暢,一點問題都沒有遇到,於是去查了下他的環境,opencv版本是3.3.1。於是我又在jetson xavier上安裝3.3.1版本的opencv,之后又發現cv_bridge用的還是opencv4的,依舊會報錯。后來在網上查了之后,說是要重新源碼編譯cv_bridge,但是我怕編譯過后,jetson上其他代碼會出問題,就沒再繼續了。
后來我直接在我筆記本上安裝了虛擬機,ubuntu16.04的系統,安裝ros之后,再次編譯該代碼,毫無阻礙的就成功了。
在錄制數據的時候,最好同時打開ros自帶的cameracalib工具,保證錄制的每個位置下,標定版的棋盤格能被自動檢測到,因為autoware也用了這個工具,如果無法自動檢測棋盤格,后續autoware的工具是無法標定的。
錄制數據最好保證能夠近、中、遠三個位置左、中、右各錄制一個場景,為了保證相機標定的准確,可以選幾個位置錄制標定版俯仰和左右轉的數據。
最后只需要按流程進行標定就可以了,這塊我主要參考了https://zhuanlan.zhihu.com/p/147638876/
這里簡單說一下操作:
1、再播放bag的時候,記得把雷達點雲的topic改成points_raw播放,這樣autoware才能讀取點雲;
2、加載好點雲數圖像之后如下圖所示(這里點雲方向比較難調,根據我的經驗,如果你的點雲坐標系是ros坐標系的話,先按E鍵讓點雲方向變正,然后按W鍵變成點雲前視圖,然后再放大就行)
3、這里記得用空格鍵暫停bag的播放,同時注意點雲和圖像的時間戳,保證盡可能的接近,然后點右上方的Grab,可以獲取如下結果
4、然后在右下方點雲的標定板中間選取平面,如下圖所示,注意這里盡量選取中間,效果會好一些
5、當把各個方向的數據都按如下操作之后,點擊右上方的calibrate,然后點擊project就可以查看之前選取的標定板平面點雲在對應圖像上的投影結果,結果圖片如下
6、最后點擊save保存即可。
最后放一個連續可視化的標定的結果(等我b站視頻上傳了發鏈接)
https://www.bilibili.com/video/BV1S54y147Fe/
感覺最后實測的結果就是圖像邊緣部分不是特別准,不知道是不是由於圖像畸變的原因,還沒試過用畸變矯正過后的圖像進行點雲投影的結果,后面有空會試試。
(ps. 需要用標定得到的相機畸變參數對圖像進行畸變矯正,或者在激光投影圖像的時候對激光點對應的像素坐標進行反矯正,這樣效果就完美了,不會出現視頻里邊緣不准,中間准的問題了)
ps:注意標定得到的結果是image->lidar , 如果要使用lidar->image投影記得求逆。