velo2cam_calibration——最新最准确的激光雷达Lidar和相机Camera外参标定算法实现
目錄
- 寫在前面
- 參考資料
- 算法原理
- 準備工作
- 開始使用
- 檢測結果
- 總結
寫在前面
因為實驗需求,要實現相機和雷達之間的融合,因此需要完成相機內參標定和雷達與相機外參標定。
相機內參標定使用ros自帶的包camera_calibration即可完成。
具體方法可以參考博客: SLAM之相機標定
相機外參之前使用了Autoware的工具箱,但標出來的效果有一定的誤差,不太滿意。
velo2cam_calibration的單目相機和雷達標定是2021年才出來的一篇文章,而且算法更為魯棒,但網上參考資料較少,坑也不算少,因此寫這篇博客記錄一下,希望可以幫助到有需要的人。
參考資料
這個算法的官方地址為velo2cam_calibration,這里面有源碼等資料,也是唯一的參考資料。
算法原理
還是PnP的原理,通過相機和雷達觀測同一個東西,并檢測出來東西在各自坐標系下的誤差來完成坐標系之間相對姿態的估計。
對于這個算法,這個物體指的就是標定板上的四個圓(標定板見下面的圖片),相機通過檢測四個Apirltag,通過標定板尺寸參數得到圓心,雷達通過透過去的洞洞檢測圓心。這樣把四個圓心分別對應上就可以實現外參的標定、
準備工作
一、準備一塊標定板。
這個算法的標定板和其他的不一樣,這也是很麻煩的一點。需要找廠家定制,板子的樣式和參數詳見下圖。四個角上面是四個Arpiltag,因此加工需要給廠家說明,四個角上面的正方形是不需要打穿的,畫上線即可。我們選用的材料是亞克力的,但拿回來發現效果沒有想象中那么好,因為板子尺寸太大,在不規則放置時會存在一定的彎曲,可以試試選用木板或者鋼板等。當然亞克力的也是可以用的。
加工好板子之后,四個角上還需要貼上對應的Arpiltag,這個Arpiltag的樣式是不能換的,因為程序里面相機需要檢測四個樣式,而且位置也必須和圖中的對應。這個可以直接打印出來,Arpiltag的大小沒有限制,只要把圖案放在正方形的中心即可(因為是識別中心的)。
四個圖案我放在下面了(我是截圖處理了一下,沒找到原版)
依次為左上、左下、右上、右下
二、部署代碼
github上開源了代碼,可以直接搜到。
如果外網速度慢的同學,可以使用gitee下載,Gitee下載地址。
下載完之后安裝catkin_make的一般方法編譯即可,這倒是沒有遇到什么問題。
開始使用
一、內參發布
我們使用的為USB相機,使用程序啟動了相機并發布圖像到ROS中,其主題為/camera/image_raw,消息類型為sensor_msgs::Image,其中camrea為相機名稱。
但程序除去這個原始圖像外,還需要知道相機的內參,也就是說需要一個camera_info的消息,這個并且主題名稱應該為/相機名稱/camera_info,消息類型為sensor_msgs::CameraInfo,對應到我們自身就是/camera/camera_info。
相機內參標定完成之后便可以得到一個標定結果,可以參照這篇文章來完成:
根據相機內參向ROS發布camera_info
二、打開調試按鈕
為了更方便之后工作進行,可以打開DEBUG,這樣便可以發布出來相機和雷達的檢測結果啦。對于調試代碼非常非常非常有用!!!
具體做法是修改~/catkin_ws/velo2cam_calibration/include/velo2cam.utils.h中第30行的
改為
#define DEBUG 1注意修改之后需要重新編譯。
三、開始調試相機
打開一個終端,輸入指令
這一部分是相機的檢測,相機會通過檢測四個Apirltag,估計出四個圓心的位置。
因為打開了DEBUG,應該會自動彈出一個opencv的窗口顯示檢測結果,如下
可以看到很好地檢測到了圓心,并且終端不斷輸出檢測結果。
如果存在全部沒有檢測出來的情況,可能原因是:
代碼中存在兩個消息/camera/image_raw和/camera_info的同步處理,有可能沒有同步成功,理論來講,會同步最近的兩個消息,但不知道什么原因沒有成功(至少我們測試是這樣的)。解決方法就是把時間戳改為完全一樣,比如將發布時候的nescs均設置為0,相機頻率10,內參頻率1,最后同步出來頻率就是1,經過測試這樣是可以同步成功的。
四、開始調試雷達
新打開一個終端窗口,輸入指令( cloud_topic)寫你的點云主題名稱。
終端會開始輸出檢測結果,比如找到幾個目標(四個才對)。
可以打開rviz來查看檢測。
雷達檢測圓洞的方法是檢測斷點,如果周圍環境太復雜會影響檢測結果,因為可以人為過濾一下。
再新開一個終端,運行
會打開一個過濾器,過濾掉周圍的點云,在/lidar_pattern_/zyx_filtered中只留下板子和透過圓洞打過去的點,在lidar_pattern_/range_filtered_cloud中只留下板子,這樣是檢測效果最好的。如下
過濾完之后,可以把檢測結果在RVIZ中顯示出來,效果如下,綠色的就是檢測出來的圓心。
五、標定
確保相機和雷達的都完成了檢測,終端不再一直報warnning之后(偶爾報沒有關系),便可以開始標定,就是根據兩個傳感器檢測結果來迭代求取外參。
再再新開打開終端輸入
一直輸入Y就行,直到迭代完成,會詢問你是否換一個姿態繼續。
作者告訴我們至少要三個姿態,可以繼續重復步驟三-五直到不想繼續了。
檢測結果
在完成標定之后會立刻在終端顯示標定結果,也就是一個tf,具體的還可以在~/catkin_ws/velo2cam_calibration/launch/calibrated_tf.launch中查看,他給了三個坐標系之間的靜態tf,但我們需要的是lidar到camera的。
那這個tf應該怎么使用呢?可以參考這篇文章,將這兩個tf得到外參矩陣。
訂閱TF消息,并轉化為齊次變換矩陣
使用得到的外參矩陣和內參矩陣,可以通過投影的方法測試效果,具體可以參考文章:
ROS中點云學習(七):激光點云和圖像的融合
最終效果如下
總結
使用這個算法還是花費了很長時間,我主要遇到的坑列在下面:
總結
以上是生活随笔為你收集整理的velo2cam_calibration——最新最准确的激光雷达Lidar和相机Camera外参标定算法实现的全部內容,希望文章能夠幫你解決所遇到的問題。