MCPTAM標定部分 運行結果

這裏主要記錄下MCPTAM的標定結果(運行該項目主要是希望能用它標定出相機的內外參文件)

MCPTAM的安裝過程參考:https://blog.csdn.net/qq_25458977/article/details/90406233

1. camera intrinsic calibration 部分

源碼中的launch文件夾裏面有一個camera_calibrator.launch文件,裏面只給出了camera_calibrator節點的使用方式,標定的話需要額外地添加uvc_node打開ui界面進行圖像的捕捉等,GettingStarted.pdf中有相關的節點使用,可以直接複製過來,如果運行的時候提醒launch文件某一行無效,全部刪除,新建一個文件,自己手動錄入一遍即可;

捕捉圖像大概爲11張左右,如果希望標定結果比較準確,儘量讓棋盤格能夠鋪滿一點,並且出現在圖像的各個方位,而不僅僅是隻有中間的圖像;

標定結果:

image_width: 640
image_height: 480
camera_name: camera
camera_matrix:
  rows: 3
  cols: 3
  data: [1.0005351573176, -0.00191943575754414, 321.517641212176, -0.0007109109945881, 1, 245.572365752173, 0, 0, 0]
distortion_model: taylor
distortion_coefficients:
  rows: 1
  cols: 4
  data: [374.391967784045, -0.000234296822387193, 5.68557569053981e-07, -5.2792558246302e-10]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
  rows: 3
  cols: 4
  data: [0, 0, 0, -0, 0, 0, 0, -0, 0, 0, 0, -0]

由於這裏使用的是Scaramuzza的Ocamcalib模型,所以distortion coefficient主要是採用的多項式模型,

這裏a0 爲 374.39, 其他依次類推;camera matrix參數依次爲[1,0, cx,0,1,cy,0,0,0] 主要參數就是計算出的圖像中心cx,cy;標定的結果會自動保存在calibration文件下的camera*.yaml文件中,這裏的*表示的是在camera_name參數傳入的名字,這個名字也需要與多相機標定時的group文件下group name傳入.yaml文件中的相機的名字一致;

這裏標定的兩個相機分別叫做camera1, camera2;

4. Camera Extrinsic Calibration

這部分在pdf中只給出了pose calibrator node的使用情況,沒有給出具體的節點使用,這裏如果標定兩個相機的相對位姿,也是需要調用兩次uvc node,將兩個相機分佈在不同的namespace下,然後進行調用,具體的launch文件如下:

<launch>
<node name="camera1" pkg="uvc_camera" type="uvc_camera_node" output="screen" ns="camera1">
<param name="device" type="string" value="/dev/video2"/>
<param name="camera_info_url" type="string" value="package://mcptam/calibrations/camera1.yaml" />
</node>
<node name="camera3" pkg="uvc_camera" type="uvc_camera_node" output="screen" ns="camera3">
<param name="device" type="string" value="/dev/video0"/>
<param name="camera_info_url" type="string" value="package://mcptam/calibrations/camera3.yaml" />
</node>
<node name="pose_calibrator" pkg="mcptam" type="pose_calibrator" clear_params="true" output="screen" >
<rosparam command="load" file="$(find mcptam)/groups/$(arg group_name).yaml" />
<remap from="reset" to="pose_calibrator/reset" />
<param name="image_transport" type="string" value="compressed"/>
<param name="pattern_width" type="int" value="6"/>
<param name="pattern_height" type="int" value="8"/>
<param name="square_size" type="double" value="0.036"/>
<param name="finder_max_ssd_per_pixel" type="int" value="500" />
<param name="kf_distance_mean_diff_fraction" type="double" value="0.0" />
<param name="kf_adaptive_thresh" type="bool" value="false" />
<param name="get_pose_separately" type="bool" value="false"/>
<param name="pose_out_file" type="string" value="$(find mcptam)/poses/poses.dat" />
</node>
</launch>

這裏camera_info_url 參數需要協商,主要用於後面讀取外參標定時讀取該文件中的參數,因此路徑也一定要指定正確;

運行lanch文件後會打開兩個uvc 窗口,顯示兩個攝像頭的捕捉圖像,這裏的處理狀態主要分爲四種:

CHECKERBOARD_INIT CHECKERBOARD_FIRST_STAGE CHECKERBOARD_SECOND_STAGE CHECKERBOARD_RUNNING, 四種狀態在運行的時候通過窗口的外邊框顯示出來:

1. 最開始爲深藍色,表示初始狀態,按下空格鍵表示開始捕捉KEYFRAME,camera1進入second stage,外邊框爲淺藍色,緩慢移動標定板,給足夠的時間建立camera1的地圖,這個過程第一次一般要花費幾分鐘,一定要耐心等待;

2. camera1的地圖構建完成之後外邊框會變成綠色,同時自動開始標定camera2, camera2的外邊框變成藍色;

3. 按下空格鍵開始標定camera2,這個過程一般很快,兩個相機外邊框都變成綠色後,可以在此移動標定板,移動的時候儘量保證角點都被檢測到,移動的範圍稍微大一點,過程緩慢一點,兩個相機的共同點越多,後期優化的mean square下降的越快;

pose calibrator的結果如下所示:

camera1
1 0 0 -0
0 1 0 -0
0 0 1 -0

camera2
0.99806 -0.0592349 0.0191656 -0.0544484
0.0597737 0.997794 -0.0288826 -0.00878772
-0.0174124 0.0299722 0.999399 1.44874e-05

以第一個相機的座標爲世界座標,計算第二個相機的旋轉和平移,camera2的3x4矩陣,最後一列爲平移向量;

 

 

 

 

 

 

 

 

 

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