如果自己想要搭建一個激光相機系統,那么首要的就是要確定激光與相機的位置關系。那么下面將介紹一些典型的標定方法歷史。
最早的激光相機標定方法,由一些與相機標定類似,只需要一塊標定板,網站提供matlab工具包:http://www.cs.cmu.edu/~ranjith/lcct.html. 算法思路很簡單,先采集十張左右的數據,分別尋找標定板在相機和激光中的對應平面方程,求解約束方程獲取;兩傳感器位置方程。這些在作者的主頁有詳細介紹。
KITTI數據集的標定與這個算法類似,文章發表在2012年的ICRA上Automatic Camera and Range Sensor Calibration using a single Shot. 只不過一張圖像中出現了多張標定板:
難點在作者如何對應激光中某一張的標定板就是圖像上的某一張?作者利用了ransac算法,大致過程就是先假設某三個對應關系是正確的,得出相機與激光的位置關系,然后在反求其他標定板對應關系是否正確。不斷循環這一操作,最終找出最優關系。
近幾年又出現了,無需標定板,利用激光和圖像的互信息標定:http://robots.engin.umich.edu/SoftwareData/ExtrinsicCalib.
不過筆者認為如果想要獲取穩定快捷的標定方法,還是最原始的方法好。下面介紹筆者所用設備及其標定方法:
筆者所選用的是一架全景相機配合一個旋轉的單線激光,單線激光的配置教程可以參考:https://jvgomez.github.io/pages/hokuyo-dynamixel-coupling-for-3d-mapping.html 其由一個hokuyo 30米激光和一個舵機dynamixel組成。通過舵機旋轉,記錄下每一時刻的點雲來將2D激光轉變為3D激光。
首先筆者對全景相機進行了標定:http://www-sop.inria.fr/icare/personnel/Christopher.Mei/ChristopherMeiPhDStudentToolbox.html. 如果是其他相機可以自行尋找標定工具包。
這個工具包都直接給出了相機的投影方程,和每個標定板在相機坐標系下的方程,我們記為:αm,i: θm,iX+dm,i=0.
另一方面利用PCL中的DoN 特征(http://pointclouds.org/documentation/tutorials/don_segmentation.php#don-segmentation)分離出標定板在激光坐標系下的方程:αl,i: θl,iX+dl,i=0.
可以通過最小化如下方程來約束RT矩陣:
$\arg \mathop {\min }\limits_{R,T} \sum\limits_{i = 1}^n {\frac{1}{{l(i)}}} \sum\limits_{j = 1}^{l(i)} {({\theta _{m,i}}(RX_{l,i}^{(j)} + T) + {d_{m,i}})}$
R和T可以分別求解:
${{R_1} = \arg \mathop {\max }\limits_R \sum \theta _{c,i}^T(R{\theta _{l,i}})}$
${{t_1} = \mathop {\arg \min }\limits_t \sum\limits_i {({\alpha _{l,i}}} - ({\alpha _{c,i}} - {\theta _{c,i}}t){)^2}}$
先用USV分解求出近似解:
${R_1} = V{U^T}$
${\theta _l}\theta _c^t = US{V^T}$
再用 Levenberg-Marquardt優化求解。
下面給出標定求解代碼:https://github.com/ZouCheng321/6_calibration
更多詳請下載我的文章:An automatic calibration between an omni-directional camera and a laser rangender for dynamic scenes reconstruction (http://ieeexplore.ieee.org/document/7866544/)
運行calibration.m 進行標定。
運行colorize.m 進行點雲上色。
如果需要看上色后的效果:
cd view mkdir build cmake .. make ./cloud_viewer ../../1.pcd
可以看到圖像轉為3D場景: