1. 程式人生 > >利用kalibr工具進行camera-IMU標定

利用kalibr工具進行camera-IMU標定

camera-IMU標定

camera-IMU標定簡述

1標定目的

我們進行camera-IMU的目的是為了得到IMU和相機座標系的相對位姿矩陣T。

2標定工具

3輸入檔案:

以下內容預設為標定雙目相機。和靜態標定不同,本標定的輸入檔案包括

1 用帶imu的相機拍攝的視訊

2 視訊中imu實時資料

3 imu引數和cam的內外參

4標定板資訊

後面會詳細的介紹一下輸入檔案以及製作方法。

Kalibr安裝

           Kalibr工程有兩種,一種是已經編譯好的包,叫CDE package,另一種是未經編譯的原始檔。

           前者:安裝簡單,不需要依賴ROS,但是功能不全。

           後者:安裝稍麻煩,但功能全,建議安裝這種。

後者安裝方法:

1安裝 ROS

2安裝依賴項

sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-devlibboost-all-dev doxygen libopencv-dev ros-indigo-vision-opencvros-indigo-image-transport-plugins ros-indigo-cmake-modulespython-software-properties software-properties-common libpoco-devpython-matplotlib python-scipy python-git python-pip ipython libtbb-devlibblas-dev liblapack-dev python-catkin-tools libv4l-dev

sudo pip installpython-igraph --upgrade

注意:pip未安裝會報錯

3建立一個工作空間,這就是以後的工程根路徑

mkdir -p~/kalibr_workspace/src
cd ~/kalibr_workspace
source/opt/ros/indigo/setup.bash
catkin init
catkin config --extend /opt/ros/indigo
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release

4下載工程程式碼並編譯

cd~/kalibr_workspace
catkin build -DCMAKE_BUILD_TYPE=Release -j4

注意:如果你電腦記憶體不太夠用,試著減少編譯時開的執行緒數,把引數 –j4換成-j2或直接省略。

5設定一下你剛才編譯工程的環境變數

source~/kalibr_workspace/devel/setup.bash

至此,安裝部分結束,標定需要的所有工具都在本工程的devel/bin/目錄下。

camera-IMU標定需要輸入的四個檔案

一個標定的例子:

它們分別是:包含圖形和imu資料的bag檔案、相機引數檔案、IMU引數檔案和標定板引數檔案

1 bag 檔案

<1>. bag 檔案內容:

這是在連續時間獲得的拍攝標定版的影象和IMU資料包,需要自己採集後再利用kalibr提供的一個工具去轉化成.bag包。

.bag檔案的具體內容是:標定需要的影象以及相對應的imu資料。格式是:

+-- dataset-dir

    +--cam0

   │   +-- 1385030208726607500.png

   │   +--      ...

   │   \-- 1385030212176607500.png

    +--cam1

   │   +-- 1385030208726607500.png

   │   +--      ...

   │   \-- 1385030212176607500.png

    \--imu0.csv

IMU檔案格式是:19位時間戳(精確到ns),角速度,含重力的加速度

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的製作工具:

kalibr_bagcreater--folder dataset-dir --output-bag awsome.bag

dataset-dir是資料輸入路徑:

其內檔案結構應是這樣:

/cam0/image_raw

/cam1/image_raw

/imu0

awsome.bag 是製作好的bag檔案。輸出預設在kalibr_bagcreater同目錄下。

2相機引數檔案: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]

 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]

 timeshift_cam_imu: -8.681e-05

  rostopic:/cam1/image_raw

  resolution: [752,480]

  • camera_model//相機模型
    camera projection type (pinhole / omni)
  • intrinsics//相機內參
    vector containing the intrinsic parameters for the given projection type. elements are as follows:
    pinhole: [fu fv pu pv]
    omni: [xi fu fv pu pv]
    distortion_model//畸變模型
    lens distortion type (radtan / equidistant)
  • distortion_coeffs//畸變引數
    parameter vector for the distortion model
  • T_cn_cnm1//左右攝像頭的相對位姿
    camera extrinsic transformation, always with respect to the last camera in the chain
    (e.g. cam1: T_cn_cnm1 = T_c1_c0, takes cam0 to cam1 coordinates)
  • timeshift_cam_imu//在捕捉資料時,imu資料和影象時間偏移
    timeshift between camera and IMU timestamps in seconds (t_imu = t_cam + shift)
  • rostopic
    topic of the camera's image stream
  • resolution
    camera resolution [width,height]

3 IMU引數檔案:imu.yaml

#Accelerometers

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

update_rate:            200.0    #Hz //imu輸出資料頻率

編寫這個檔案需要imu的手冊。

4 標定板引數檔案:target.yam

Kalibr支援三種標定板,分別是AprilgridCheckerboardCirclegrid。

引數比較簡單:見https://github.com/ethz-asl/kalibr/wiki/calibration-targets

執行標定

在製作完成標定需要檔案後,就可以對cam-imu進行標定了。

比如:你的標定板檔案是april_6x6.yaml,相機引數檔案時camchain.yamlimu引數檔案是imu_adis16448.yaml,圖集檔案是dynamic.bag--bag-from-to 5 45這裡的545是你想在標定時利用圖集資料的時間段,單位是S。執行

kalibr_calibrate_imu_camera --targetapril_6x6.yaml --cam camchain.yaml --imu imu_adis16448.yaml --bag  dynamic.bag --bag-from-to 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 virtual memory exhaust 原因:電腦記憶體不夠

2 如果電腦沒有安裝 numpy,會報錯,安裝numpy

3 執行指令時如果找不到輸入檔案,附絕對路徑試試。

4 CDE包只支援64linux系統

5注意:在採集標定圖集時

i,確保影象不要模糊,運動不要太快。

ii,最好要遍歷imu的所有軸,即充分旋轉和加速。

6calib可以標定單目+imu,bag內只放單目影象,修改帶參執行中的引數即可。

7雖然標定板有幾種可以選擇,但作者建議使用aprilgrid型別的標定板來標定,aprilgrid地址:https://drive.google.com/file/d/0B0T1sizOvRsUdjFJem9mQXdiMTQ/edit