LoginSignup
12
18

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-10-09

環境

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

項目
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が生成されます。この画面が出た時から測定は開始しています。
cam_calib2.png

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

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

右側の青い「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カメラが広角であったのもあって、四隅での歪みがだいぶあったことがわかりますね。
cam_calib3.png

参考

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

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

参考

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

目次ページへのリンク

ROS講座の目次へのリンク

12
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
18