使用Kalibr進行IMU+相機的標定

利用kalibr標定IMU和相機:  https://github.com/ethz-asl/kalibr/wiki/Camera-IMU-calibration#2-collect-images

在開始需要明確幾點的是:需要先安裝kalibr,該工具主要是標定相機和IMU, 在標定的過程中需要用到IMU和相機的內參文件,這裏的內參文件可以用ROS 幫忙獲得,或者如果已經有這個文件可以直接用。

接下要做的即安裝realsense的ros接口主要是爲了方便讀取topic來錄製rosbag, 因爲kalibr在標定的時候需要用rosbag中的數據進行標定;

這裏的相機採用realsense d435i 因此在安裝標定前要確保相關庫已經安裝

-----IMU內參標定-----

1. 確保realsense的SDK已經安裝:

2. 安裝realsense的ros warpper

   https://github.com/IntelRealSense/realsense-ros 這是前兩步的參考鏈接,包含安裝realsense的SDK和roswarpper

  我之前已經安裝過ros kinect在Ubuntu16.04的平臺上,因此這裏直接從catkin的工作空間開始

3. 標定IMU

   3.1 安裝cereshttps://blog.csdn.net/jz1570551401/article/details/78207208

1. 預安裝,其中libgoogle-glog-dev 可能需要再單獨安裝
sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev 
libgoogle-glog-dev libgtest-dev   
2. 下載ceres:https://github.com/ceres-solver/ceres-solver
3. 解壓文件後進入ceres-master:
    mkdir build
    cd build
    cmake ..  //如果這一步驟報錯,可以檢查一下是具體那個庫沒有安裝成功,再sudo apt-get 對應的庫就好
    make  //大概等幾分鐘
    sudo make install 
    
    安裝完成後/usr/local/include/ceres 和 /usr/local/lib/ 中

     3.2 下載code_utils: https://github.com/gaowenliang/code_utils

            解壓至catkin下的src文件,然後在code_utils下面找到sumpixel_test.cpp,修改#include "backward.hpp"爲 #include “code_utils/backward.hpp”,然後運行catkin_make

           錯誤提示:code_utils/backward.hpp:216:30: fatal error: elfutils/libdw.h: No such file or directory
compilation terminated.

     運行: apt-get install libdw-dev 安裝對應的庫即可,一般安裝這個就可以,如果這樣還不可以試試:sudo apt-get install elfutils

    3.3 下載imu_utils: https://github.com/gaowenliang/imu_utils

           再次catkin_make

    3.4 接下來就可以就可以標定IMU了:

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/camera/imu"/>  #imu topic的名字
        <param name="imu_name" type="string" value= "d435i"/>
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/d435i"/>
        <param name="max_time_min" type="int" value= "30"/> #標定的時長
        <param name="max_cluster" type="int" value= "100"/>
    </node>
</launch>

將該launch文件保存成imu.launch至src和install下的launch中, 然後在兩個終端中同時運行

~/catkin_ws_rs$ roslaunch realsense2_camera rs_camera.launch
~/catkin_ws_rs/install/share/realsense2_camera/launch$ roslaunch imu.launch

運行imu.launch文件的終端中會出現

process[imu_an-1]: started with pid [8274]
[ INFO] [1571305008.871258796]: Loaded imu_topic: /camera/imu
[ INFO] [1571305008.872137757]: Loaded imu_name: d435i
[ INFO] [1571305008.872762617]: Loaded data_save_path: /home/shinan/catkin_ws_rs/src/imu_utils/data/d435i
[ INFO] [1571305008.873749085]: Loaded max_time_min: 30
[ INFO] [1571305008.874493932]: Loaded max_cluster: 100
gyr x  num of Cluster 100
gyr y  num of Cluster 100
gyr z  num of Cluster 100
acc x  num of Cluster 100
acc y  num of Cluster 100
acc z  num of Cluster 100
wait for imu data.

接下來等待30分鐘即可,標定完成後imu的參數將會被保存在data_save_path的路徑中;

也可以錄製bag保存imu數據後進行標定;https://blog.csdn.net/fang794735225/article/details/92804030

將IMU的標定結果保存到文件imu.yaml中:

#Accelerometers
accelerometer_noise_density: 2.4753056458491202e-02   #Noise density (continuous-time)
accelerometer_random_walk:   5.1092097834339175e-04   #Bias random walk

#Gyroscopes
gyroscope_noise_density:     4.0642638745600332e-03   #Noise density (continuous-time)
gyroscope_random_walk:       2.6537322064011450e-05   #Bias random walk

rostopic:                    /imu0      #the IMU ROS topic
update_rate:                 200.0      #Hz (for discretization of the values above)

 

相機標定:https://blog.csdn.net/heyijia0327/article/details/43538695

標定realsense的RGB相機,如果使用的是其他相機可以用opencv採集圖像後進行單目標定,這裏不多寫,主要是標定Realsense的彩色相機:

設定好相機的相關參數後(主要是size 和fps):目前設置圖像大小爲640*480 幀率爲30

roslaunch realsense2_camera rs_camera.launch

啓動realsense相機後,可以用rostopic list 查看對應的打開的topics

可以用ros自帶的標定方法進行相機標定:

~/catkin_ws_rs$ rosrun camera_calibration cameracalibrator.py  --size 8x6 --square 0.035 image:=/camera/color/image_raw

最開始的CALBRATE按鈕爲灰色,當採集的圖像符合條件夠就變成綠色,然後可以點擊CALIBRATE進行標定,標定結果顯示如下:
 

  ('D = ', [0.20848791559812113, -0.36507062055202405, 0.012079145675854016, -0.006358054188595459, 0.0])
('K = ', [653.7064773464425, 0.0, 314.4404941629716, 0.0, 654.2058371422769, 261.91335661459755, 0.0, 0.0, 1.0])
('R = ', [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0])
('P = ', [677.4393920898438, 0.0, 311.13625111082183, 0.0, 0.0, 676.0581665039062, 266.3551872155367, 0.0, 0.0, 0.0, 1.0, 0.0])

將標定的結果保存到.yaml文件中 如下所示:

cam0:  #640*480
  camera_model: pinhole
  intrinsics: [653.7064773464425, 654.2058371422769,314.4404941629716, 261.91335661459755]
  distortion_model: radtan
  distortion_coeffs: [0.20848791559812113, -0.36507062055202405, 0.012079145675854016, -0.006358054188595459]
  rostopic: /camera/color/image_raw
  resolution: [640, 480]

準備標定板文件aprilgrid.yaml:

 

 相機+IMU標定: https://github.com/ethz-asl/kalibr/wiki/Camera-IMU-calibration#2-collect-images

1. 啓動realsense相機和imu,所以也要先設置好rs_camera.launch文件中的相關參數;

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.021383           #size of apriltag, edge to edge [m]
tagSpacing: 0.2853        #ratio of space between tags to tagSize 0.61cm/2.1383cm = 0.285273348
                         #example: tagSize=2m, spacing=0.5m --> tagSpacing=spacing/tagSize = 0.25[-]

 2. 爲相機和IMU錄製數據包,

可以先運行 rosrun image_view image_view image:=/camera/color/image_raw 查看圖像, 保證在錄製數據包的時候標定板不會超出畫面

錄製的時候儘量保證圖像清晰,不要劇烈移動,採集數據的起始和結束階段注意別晃動太大,如從桌子上拿起或者放下。如果有這樣的動作,在標定階段應該跳過bag數據集的首尾的數據. 同時儘可能地激活IMU的各個角度,各個方向,可以先依次繞各個軸運動,運動完後來個在空中畫8字之類的操作,當然也要注意別運動太劇烈,圖像都模糊了。:

rosbag record /camera/color/image_raw  /camera/imu -O rgb_imu.bag​

 

 3.  進行標定:參數分別是包名稱(不用加.bag),相機參數文件,imu參數文件, 標定板文件

~/Project/kalibr_workspace$ kalibr_calibrate_imu_camera --bag ~/Project/kalibr_workspace/rgb_imu.bag​.bag --cam ~/Project/kalibr_workspace/camchain.yaml --imu ~/Project/kalibr_workspace/imu.yaml --target ~/Project/kalibr_workspace/aprilgrid.yaml 

 出現錯誤提示:

importing libraries
Traceback (most recent call last):
  File "/home/shinan/Project/kalibr_workspace/devel/bin/kalibr_calibrate_imu_camera", line 15, in <module>
    exec(compile(fh.read(), python_script, 'exec'), context)
  File "/home/shinan/Project/kalibr_workspace/src/kalibr-master/aslam_offline_calibration/kalibr/python/kalibr_calibrate_imu_camera", line 5, in <module>
    from kalibr_imu_camera_calibration import *
  File "/home/shinan/Project/kalibr_workspace/src/kalibr-master/aslam_offline_calibration/kalibr/python/kalibr_imu_camera_calibration/__init__.py", line 4, in <module>
    import IccSensors as sens
  File "/home/shinan/Project/kalibr_workspace/src/kalibr-master/aslam_offline_calibration/kalibr/python/kalibr_imu_camera_calibration/IccSensors.py", line 16, in <module>
    import scipy.optimize
ImportError: No module named scipy.optimize

 安裝python相關庫:

sudo apt-get install python-scipy

標定結果如下:

After Optimization (Results)
==================
Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.552748299525, median 0.473100512902, std: 0.3640429471
Gyroscope error (imu0):        mean 0.215478847361, median 0.161409013393, std: 0.19024901177
Accelerometer error (imu0):    mean 0.165613674102, median 0.132037510374, std: 0.129116309678

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.552748299525, median 0.473100512902, std: 0.3640429471
Gyroscope error (imu0) [rad/s]:     mean 0.0123851576362, median 0.00927736573336, std: 0.0109350130176
Accelerometer error (imu0) [m/s^2]: mean 0.0579749018736, median 0.0462211936851, std: 0.04519859501

Transformation T_cam0_imu0 (imu0 to cam0, T_ci): 
[[ 0.9999488  -0.00279248  0.00972605  0.03555196]
 [ 0.00297818  0.99981255 -0.01913078 -0.00461578]
 [-0.0096708   0.01915877  0.99976968  0.00838297]
 [ 0.          0.          0.          1.        ]]

cam0 to imu0 time: [s] (t_imu = t_cam + shift)
-0.0280180128084

IMU0:
----------------------------
  Model: calibrated
  Update rate: 200.0
  Accelerometer:
    Noise density: 0.0247530564585 
    Noise density (discrete): 0.350061081538 
    Random walk: 0.000510920978343
  Gyroscope:
    Noise density: 0.00406426387456
    Noise density (discrete): 0.0574773709247 
    Random walk: 2.6537322064e-05
  T_i_b
    [[ 1.  0.  0.  0.]
     [ 0.  1.  0.  0.]
     [ 0.  0.  1.  0.]
     [ 0.  0.  0.  1.]]
  time offset with respect to IMU0: 0.0 [s]

  Saving camera chain calibration to file: camchain-imucam-homeshinanProjectkalibr_workspacecam_imu640_480_retrgb_imu​.bag.yaml

  Saving imu calibration to file: imu-homeshinanProjectkalibr_workspacecam_imu640_480_retrgb_imu​.bag.yaml
  Detailed results written to file: results-imucam-homeshinanProjectkalibr_workspacecam_imu640_480_retrgb_imu​.bag.txt
Generating result report...

Timeshift表示的就是IMU相對於camera的延時;

 參考博客:https://blog.csdn.net/mxdsdo09/article/details/83514310

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章