學習Kalibr工具--Camera與IMU聯合標定過程
上一節介紹了,用kalibr工具對camera進行標定的操作流程,在camera標定之好之後,進行camera與IMU進行聯合標定的操作的學習,即求取相機和IMU 之間的轉換關係(座標系之間的相對位姿矩陣);需要先知道相機的內外引數(單目的內外引數和雙目的內外引數),用kalibr工具進行 單目標定或者雙目標定上一節已介紹。
這裡以雙目+IMU為例進行介紹相機和IMU 的聯合標定,也叫多感測器融合;
一、camera - IMU相機標定介紹
參考連結:https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration
- (一)標定的輸出檔案包括:
1.包含影象和IMU資料的 bag包; ( cam_imu.bag檔案):採集數相機圖片和IMU資料
2.相機引數檔案; ( camchain.yaml檔案):包含相機的內參和畸變引數的YAML檔案(該檔案包含相機內在和外在引數的校準以及IMU相對於相機的空間和時間校準引數。)
3.IMU引數檔案; ( imu.yaml檔案):包含IMU的基本引數,噪音等
4.標定板引數; ( target.yaml檔案):標定板標準 - (二)當上述檔案都準備好的時候,執行命令列:
kalibr_calibrate_imu_camera –target xx/target.yaml –cam xx/camchain.yaml –imu xx/IMU.yaml –bag xx/xx.bag –bag-from-to 5 45
由於資料在採集過程中,在開始和結束處存在躁動和激勵,所以僅使用 5到45秒之間的資料;
- (三)輸出結果:
report-imucam-%BAGNAME%.pdf: Report in PDF format. Contains all plots for documentation.
results-imucam-%BAGNAME%.txt: Result summary as a text file.
camchain-imucam-%BAGNAME%.yaml: 這個檔案是在輸入檔案camchain.yaml基礎上增加了標定後的cam-imu資訊的結果檔案。我們想要的T_cam_imu矩陣就在這裡。
二、標定資料製作過程
1.資料採集: 資料採集的過程是手持需要標定的裝置,同時啟用camera和imu器件分別採集影象和imu資料,對著預先製作好的標定板,在激勵充分(從不同的角度,旋轉和平移,對標定板拍照,並且使得IMU的accel和gyro兩個器件的三個軸都被啟用)的情況下,同時儲存影象和IMU的資料。採集到的資料應該如下所示(雙目+IMU):(假如是單目的話,只需要保留cam0和imu0.csv即可。)
+-- dataset-dir
+-- cam0
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
+-- cam1
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
-- imu0.csv
imu0.csv是一個文字檔案,是IMU的資料,每一行就是一個gyro和accel在某一時刻的讀數,如下所示: 19位時間戳(精確到ns),角速度,含重力的加速度
(timestamps=[ns], omega=[rad/s], alpha=[m/s^2])
timestamp,omega_x,omega_y,omega_z,alpha_x,alpha_y,alpha_z
1385030208736607488,0.5,-0.2,-0.1,8.1,-1.9,-3.3
...
1386030208736607488,0.5,-0.1,-0.1,8.1,-1.9,-3.3
2.製作 .bag包: 將在連續時間內通過採集獲得的拍攝標定板的影象和IMU 的資料檔案(上述中的:cam0、cam1、imu0.csv),將三個資料利用kalibr工具轉化為 .bag格式檔案,因為kalibr的所有應用程式使用ROS包作為影象和IMU 的資料的源;bag檔案製作參考: https://github.com/ethz-asl/kalibr/wiki/bag-format;命令列(建立ROS包):
kalibr_bagcreater --folder dataset-dir/. --output-bag awsome.bag
dataset-dir/. 是資料輸入路徑:
其內檔案結構應是這樣:
dataset-dir/cam0/image_raw
dataset-dir/cam1/image_raw
dataset-dir/imu0
awsome.bag 是製作好的bag檔案。輸出預設在kalibr_bagcreater同目錄下。
注意:a.在包含圖片的資料夾的同一目錄下需要一個:output空白資料夾,否則 .bag 檔案無法生成
b.生成的.bag檔案使用:rosbag info XX.bag 判定是否生成成功,如果只有4kb,則生成失敗,而一般情況都是路徑問題
c.calib可以標定單目+imu,bag內只放單目影象,修改帶參執行中的引數即可。
3.相機引數檔案: camchain.yaml
camchain.yaml 檔案模板:
cam0:
camera_model: pinhole
intrinsics: [461.629, 460.152, 362.680, 246.049]
distortion_model: radtan
distortion_coeffs: [-0.27695497, 0.06712482, 0.00087538, 0.00011556]
T_cam_imu:
- [0.01779318, 0.99967549,-0.01822936, 0.07008565]
- [-0.9998017, 0.01795239, 0.00860714,-0.01771023]
- [0.00893160, 0.01807260, 0.99979678, 0.00399246]
- [0.0, 0.0, 0.0, 1.0]
timeshift_cam_imu: -8.121e-05
rostopic: /cam0/image_raw
resolution: [752, 480]
cam1:
camera_model: omni
intrinsics: [0.80065662, 833.006, 830.345, 373.850, 253.749]
distortion_model: radtan
distortion_coeffs: [-0.33518750, 0.13211436, 0.00055967, 0.00057686]
T_cn_cnm1:
- [ 0.99998854, 0.00216014, 0.00427195,-0.11003785]
- [-0.00221074, 0.99992702, 0.01187697, 0.00045792]
- [-0.00424598,-0.01188627, 0.99992034,-0.00064487]
- [0.0, 0.0, 0.0, 1.0]
T_cam_imu:
- [ 0.01567142, 0.99978002,-0.01393948,-0.03997419]
- [-0.99966203, 0.01595569, 0.02052137,-0.01735854]
- [ 0.02073927, 0.01361317, 0.99969223, 0.00326019]
- [0.0, 0.0, 0.0, 1.0]
timeshift_cam_imu: -8.681e-05
rostopic: /cam1/image_raw
resolution: [752, 480]
camchain.yaml檔案內容說明:
CAMERA_MODEL
camera_model(pinhole / omni)(針孔、全向)
intrinsics
包含給定投影型別的內部引數的向量。要素如下:
pinhole:[fu fv pu pv]
omni:[xi fu fv pu pv]
ds:[xi alpha fu fv pu pv]
eucm:[alpha beta fu fv pu pv]
distortion_model
distortion_model(radtan /equidistant)
distortion_coeffs
失真模型的引數向量
T_cn_cnm1
相機外在轉換,總是相對於鏈中的最後一個相機
(例如cam1:T_cn_cnm1 = T_c1_c0,將cam0轉換為cam1座標)
T_cam_imu
IMU extrinsics:從IMU到相機座標的轉換(T_c_i)
timeshift_cam_imu
相機和IMU時間戳之間的時間間隔,以秒為單位(t_imu = t_cam + shift)
rostopic
攝像機影象流的主題
resolution
相機解析度[width,height]
4.IMU引數檔案:imu.yaml
imu.yaml 檔案模板:(編寫這個檔案需要imu的手冊。)
#Accelerometers
accelerometer_noise_density: 1.86e-03 #Noise density (continuous-time)
accelerometer_random_walk: 4.33e-04 #Bias random walk
#Gyroscopes
gyroscope_noise_density: 1.87e-04 #Noise density (continuous-time)
gyroscope_random_walk: 2.66e-05 #Bias random walk
rostopic: /imu0 #the IMU ROS topic
update_rate: 200.0 #Hz (for discretization of the values above)
5.標定板檔案:target.yaml
Kalibr支援三種標定板,分別是Aprilgrid、Checkerboard和Circlegrid。
引數比較簡單:見https://github.com/ethz-asl/kalibr/wiki/calibration-targets
target.yaml檔案模板:
1)對於april板.yaml檔案格式如:
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.088 #size of apriltag, edge to edge [m]
tagSpacing: 0.3 #ratio of space between tags to tagSize,實際上就是小黑塊與大黑塊的邊長之比 example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25
2)對於checkboard板.yaml檔案格式如:
target_type: 'checkerboard' #gridtype
targetCols: 6 #number of internal chessboard corners
targetRows: 7 #number of internal chessboard corners
rowSpacingMeters: 0.06 #size of one chessboard square [m]
colSpacingMeters: 0.06 #size of one chessboard square [m]
3)對於circle板.yaml檔案格式如:
target_type: 'circlegrid' #gridtype
targetCols: 6 #number of circles (cols)
targetRows: 7 #number of circles (rows)
spacingMeters: 0.02 #distance between circles [m]
asymmetricGrid: False #use asymmetric grid (opencv) [bool]
三、Camera-IMU 聯合標定 DEMO:
從官網 Downloads 下載資料集 IMU-camera calibration。
下載下來內容:4個檔案
april_6x6.yaml 標定板引數
camchain.yaml 相機標定引數
imu_adis16448.yaml IMU標定引數
dynamic.bag 拍攝內容
cd到bag所在目錄下使用kalibr_bagextractor 解碼 dynamic.bag
解壓命令:
extractor --image-topics /cam0/image_raw /cam1/image_raw --imu-topics /imu0 --output-folder dataset-dir --bag dynamic.bag
得到結果:cam0, cam1, imu0.csv
使用上述三個檔案建立 .bag檔案:
source /home/wcd/app/kalibr/devel/setup.bash
kalibr_bagcreater --folder dataset-dir/. --output-bag awsome.bag
執行標定程式:
kalibr_calibrate_imu_camera --target april_6x6.yaml --cam camchain.yaml --imu imu_adis16448.yaml --bag dynamic.bag --bag-from-to 5 45
執行後得到 :
report-imucam-dynamic.pdf
results-imucam-dynamic.txt
包含:
1.相機的重投影誤差,IMU的誤差(加速度和陀螺儀)可以作為先驗誤差來影響資料融合的定權問題
2.相機和IMU各自的標定引數,2個.yaml檔案給的
3.IMU與相機之間的相對位姿標定(正反旋轉矩陣)cam1 to imu0也有
T_ci: (imu0 to cam0):
[[ 0.01680206 0.99985864 -0.00062288 0.06847911]
[-0.99985871 0.01680236 0.00048881 -0.01472898]
[ 0.00049921 0.00061458 0.99999969 -0.00376988]
[ 0. 0. 0. 1. ]]
T_ic: (cam0 to imu0):
[[ 0.01680206 -0.99985871 0.00049921 -0.0158756 ]
[ 0.99985864 0.01680236 0.00061458 -0.06821963]
[-0.00062288 0.00048881 0.99999969 0.00381973]
[ 0. 0. 0. 1. ]]
相機之間的位姿變換標定(基線baseline):
Baseline (cam0 to cam1):
[[ 0.99999877 0.00118911 -0.00102243 -0.1101676 ]
[-0.00118838 0.99999904 0.00071255 -0.00032166]
[ 0.00102327 -0.00071134 0.99999922 0.00012079]
[ 0. 0. 0. 1. ]]
baseline norm: 0.110168134052 [m]
使用標定命令列完成標定演示:
kalibr_calibrate_imu_camera –target xx/target.yaml –cam xx/camchain.yaml –imu xx/IMU.yaml –bag xx/xx.bag –bag-from-to 5 45
參考部落格:
https://blog.csdn.net/wwchen61/article/details/78013962
https://blog.csdn.net/heyijia0327/article/details/83583360
https://blog.csdn.net/zhubaohua_bupt/article/details/80222321
https://blog.csdn.net/w492751512/article/details/81218618
https://blog.csdn.net/xinmei4275/article/details/84998506
http://www.mamicode.com/info-detail-1719627.html