ROS講座66 カメラのキャリブレーションを行う


環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

カメラで使用しているレンズには何であり「歪み」があります。これを測定して、ゆがんでいる分をソフトウェア的に補正することがキャリブレーションです。

インストール

歪みの補正用と画像の補正用のパッケージをインストールします。

sudo apt-get install -y ros-kinetic-camera-calibration
sudo apt-get install -y ros-kinetic-image-proc 

歪みの測定

歪みの測定を行います。rosではカメラのノードは画像のトピック(/image_raw[sensor_msgs/Image])とカメラのプロファイルのトピック(/camera_info[sensor_msgs/CameraInfo])をpublishしています。正しいcamera_infoをpublishするための設定ファイルを得ることが目的です。

チェッカーボードの印刷

チェッカーボードは白黒のチェス盤のような市松模様のついた板のことです。例えばROSwikiのチェッカーボードを印刷して平らな板に貼って使用します。後々使うのでチェックの交点の数(≠四角形の数)と、各チェックの一辺のサイズを測ります。
このファイルをA4で印刷するとチェックの交点は8x6個、一辺は0.025m(=2.5cm)あたりになります。

歪の測定

まずUSBカメラをPCに繋ぎます。3つのターミナルで以下の3つのコマンドを打ってください。

1つ目のターミナル
roscore
2つ目のターミナル
rosrun uvc_camera uvc_camera_node 
3つ目のターミナル
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.025 image:=/image_raw

3つ目のターミナルから歪みの測定用のGUIが生成されます。この画面が出た時から測定は開始しています。

チェッカーボードをいろいろな見せ方で見せて測定を行います。上の図のように虹色のマークがついている時に測定を行っています。うまくキャリブレーションするためのコツとしては

  • 様々な距離で撮る
    • カメラいっぱいに写す。
    • カメラの遠くで写す。
  • 隅々まで撮る。
    • カメラの遠くで全体をカバーするように動かす。
  • チェッカーボードを斜めにして写す

右側の青い「CALIBRATE」ボタンが押せるようになったら測定は十分です。ボタンを押すと計算が始まります。この計算には数分~10分ほどかかります。

camera.yamlの解凍

/tmp/calibrationdata.tar.gzに測定の結果がまとまっています。まず解凍して、リネームします。

設定ファイルの取り出し
tar -xvzf /tmp/calibrationdata.tar.gz
mv ost.yaml camera.yaml

camra.yamlを開いて以下のように修正します。

camera.yamlの修正
camera_name: narrow_stereo  #この行を
camera_name: camera         #このように修正

camera.yamlを適当な場所(今回はcam_lecture/config/)に移してここは終わりです。今回だと以下のようなyamlの設定ファイルを得ることができました(もちろんパラメーターはカメラによって異なります。)。

cam_lecture/config/camera.yaml
image_width: 640
image_height: 480
camera_name: camera
camera_matrix:
  rows: 3
  cols: 3
  data: [318.898697, 0, 311.613177, 0, 319.855587, 291.248501, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.016615, -0.025819, 0.002167, 0.003753, 0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
  rows: 3
  cols: 4
  data: [315.782593, 0, 314.915759, 0, 0, 318.99234, 293.472369, 0, 0, 0, 1, 0]

カメラ画像の補正

カメラ画像の補正にはimage_procというノードを使います。このノードは/camera_infoと歪んでいる画像/image_rawをsubscribeして補正した画像/image_procをpublishします。

launchファイル

cam_lecture/launch/cam_proc.launch
<launch>
  <node name="uvc_camera_node" pkg="uvc_camera" type="uvc_camera_node" output="screen">
    <param name="camera_info_url" value="file://$(find cam_lecture)/config/camera.yaml"/>
  </node>
  <node name="image_proc" pkg="image_proc" type="image_proc" output="screen"/>

  <node name="image_raw_view" pkg="image_view" type="image_view" >
    <remap from="image" to="image_raw"/>
  </node>
  <node name="image_rect_view" pkg="image_view" type="image_view" >
    <remap from="image" to="image_rect_color"/>
  </node>
</launch>

3行目の<param name="camera_info_url" value="file://$(find cam_lecture)/config/camera.yaml"/>で先ほどの設定ファイルをロードしています。このように初めにfile://を付ける必要があります。

実行

roslaunch cam_lecture cam_proc.launch

チェッカーボードを写して補正前と補正後の画像を比較してみました。使っているwebカメラが広角であったのもあって、四隅での歪みがだいぶあったことがわかりますね。

参考

ここでカメラ系のトピックをまとめてみます。

  • uvc_cameraがpublish
    • camera_info
      カメラの画素数や歪みのデータ
    • image_raw
      カメラの生画像
  • image_procがpublish
    • image_rect
      歪みが補正されている(白黒)
    • image_rect_color
      歪みが補正されている(カラー)
    • image_color/image_mono
      今回は使用していないが色味を修正したもの

参考

ROS KineticでのUSBカメラ接続とキャリブレーションまで

目次ページへのリンク

ROS講座の目次へのリンク