ROS--雙目相機標定中遇到的問題

JasonSunJian發表於2018-01-26

ROS–雙目相機標定中遇到的問題

現象

使用兩個usb_cam分別釋出image_raw話題後(如官網上所要求的),再執行rosrun camera_calibration cameracalibrator.py … 進行標定時,視窗變黑,無響應。

反省

這個問題從剛開始弄雙目標定就遇到,起始原因是使用兩個獨立的攝像機代替雙目攝像機。之後為了解決這個問題,去使用ROS書上的程式碼,但是由於版本比較老,導致機器上編譯原始碼一直有錯誤,不斷嘗試各種方法也沒有解決;而且程式碼工程量大,導致一直沒有真正理解原始碼。直到約兩三個月後的2018.01.26實在走投無路,從頭開始一步一步排查的時候發現了官網上一直沒有細看的文件

解決

文件裡面這段話太重要了!如下:

3.1.1 Unsynchronized Stereo
By default, the image_pipeline assumes that stereo cameras are triggered to capture images simultaneously, and that matching image pairs have identical timestamps. This is the ideal situation, but requires hardware support.
Starting in Diamondback, you will be able to calibrate stereo pairs that are not (or inexactly) synchronized.
To enable approximate timestamp matching, give the –approximate=0.01 option. This permits a “slop” of 0.01s between image pairs. If you still don’t see a display window, or it is sporadically updated, try increasing the slop.

分析

雙目相機在硬體上將兩個攝像機整合到一起,會將兩個相機影象打包後一起進行傳送,所以左右影象是同步的。但是如果使用兩個單目攝像機代替雙目相機時就不能保證收到的左右影象是同一時刻的,這就不滿足標定程式cameracalibrator.py中對左右影象時間戳相同的要求,所以會出現上述視窗黑掉無反應的情況。所幸官網對這種情況作了支援,如上文所示,在只要加入–approximate=0.01即可,如果還沒有反應可以嘗試增大0.01這個值。

例子

  • 單獨執行
$ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 --approximate=0.01 right:=/my_stereo/right/image_raw left:=/my_stereo/left/image_raw right_camera:=/my_stereo/right left_camera:=/my_stereo/left
  • 在launch檔案的node中
<node ns="$(arg camera)" name="cameracalibrator"
  pkg="camera_calibration" type="cameracalibrator.py"
  args="--approximate=0.01 --size 8x6 --square 0.028" output="screen">
  <remap from="left" to="left/image_raw"/>
  <remap from="right" to="right/image_raw"/>
  <remap from="left_camera" to="left"/>
  <remap from="right_camera" to="right"/>
</node>

工程原始碼

移步到我的github,這個工程實現了使用兩個usb攝像頭組成的雙目相機完成雙目標定以及雙目測距功能,基本功能已經實現,文件還在完善中。本篇文章相關的部分可檢視/launch/stereo_calibration.launch檔案。

總結

所以,使用ROS要看官網文件!不要對英文有排斥!不要過度依賴課本,因為ROS版本不斷更新,書本上很多東西都不適用了。

2018.01.26晚,小記,自省。

相關文章