若是本身想要搭建一個激光相機系統,那麼首要的就是要肯定激光與相機的位置關係。那麼下面將介紹一些典型的標定方法歷史。php
最先的激光相機標定方法,由一些與相機標定相似,只須要一塊標定板,網站提供matlab工具包:http://www.cs.cmu.edu/~ranjith/lcct.html. 算法思路很簡單,先採集十張左右的數據,分別尋找標定板在相機和激光中的對應平面方程,求解約束方程獲取;兩傳感器位置方程。這些在做者的主頁有詳細介紹。html
KITTI數據集的標定與這個算法相似,文章發表在2012年的ICRA上Automatic Camera and Range Sensor Calibration using a single Shot. 只不過一張圖像中出現了多張標定板:git
難點在做者如何對應激光中某一張的標定板就是圖像上的某一張?做者利用了ransac算法,大體過程就是先假設某三個對應關係是正確的,得出相機與激光的位置關係,而後在反求其餘標定板對應關係是否正確。不斷循環這一操做,最終找出最優關係。github
近幾年又出現了,無需標定板,利用激光和圖像的互信息標定:http://robots.engin.umich.edu/SoftwareData/ExtrinsicCalib.算法
不過筆者認爲若是想要獲取穩定快捷的標定方法,仍是最原始的方法好。下面介紹筆者所用設備及其標定方法:app
筆者所選用的是一架全景相機配合一個旋轉的單線激光,單線激光的配置教程能夠參考: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.ui
能夠經過最小化以下方程來約束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場景: