ステレオカメラとキャリブレーション
第2,3回ROS勉強会でトライしたNEXTAGEのカメラパッケージの続きです。時間はかかりましたが、たくさんあった問題点は解決し、頭部ステレオカメラ、左右ハンドカメラの合計4つのカメラを同時接続、取得できるようになりました。今回はまず頭部ステレオカメラに焦点を当てたいと思います。
カメラドライバ
NEXTAGEにはIDS社製のuEyeカメラというUSB2.0接続の産業用カメラが頭部とハンドに内蔵されています。スペックは以下のとおりです(ロボットの型番によって異なる恐れがあります)。
- 頭部カメラ:1600x1200px, 10fps or 800x600px, 30fps
- ハンドカメラ:752x480px, 30fps
民生用Webカメラと違い、露出やホワイトバランス、シャッター速度などのパラメータを完全にマニュアルで操作できます。利用するROSパッケージueye_cam
は下記レポジトリです。本来はuEyeカメラのドライバインストールが先に必要ですが、ueye_cam
のcmake
で未インストールの場合、自動的にダウンロードしてきてインストールするようになっているので、非常に便利です。
カメラキャリブレーション
カメラに写る物体の精確な大きさを知るためには、カメラの焦点距離やレンズの歪み計数などの内部パラメータを計測するためには、キャリブレーションが不可欠です。ROSに抜かりはありません。まず、カメラのROS APIは非常にシンプルで、以下の2つのトピックと1つのサービスを実装するだけで、どんなカメラでもROS対応のカメラとして利用することが出来るようになります。
このROS APIだけを使って実行できるカメラキャリブレーションのROSパッケージcamera_calibration
があり、シングルカメラなら
$ rosrun camera_calibration cameracalibrator.py --size 9x6 --square 0.024 image:=/camera/image_raw camera:=/camera
で、非常によく出来たGUIが起動して順を追ってキャリブレーションできます。キャリブレーションプレートには白黒の縞模様が描かれたチェスボードのようなものを用意しましょう。縦横方向の縞模様の数(--size
)と各四角の大きさ(--square
)も指定できます。OpenCVでキャリブレーションプログラムを書いてた頃が馬鹿らしくなるくらい良く出来ています。
ステレオカメラのキャリブレーションも同じcameracalibrator.py
で同様に行えます。ステレオカメラは左右のカメラの内部パラメータ以外に、カメラ間の位置関係を表す外部パラメータのキャリブレーションも必要となります。NEXTAGE用のカメラノードの起動設定などを行なったlaunchファイルが僕のレポジトリにあるので、そちらを例に説明します。今回新しく、youtalk_ros_pkg
というROSパッケージを作ってみました。再利用性のあるものをここに詰めていこうと思っています。
$ roscd; cd src
$ git clone git@github.com:youtalk/youtalk_ros_pkg.git
$ ROS_NAMESPACE=stereo roslaunch nextage_camera stereo_ueye.launch
$ rosrun camera_calibration cameracalibrator.py --size 9x6 --square 0.024 --approximate=0.03 right:=/stereo/right/image_mono left:=/stereo/left/image_mono right_camera:=/stereo/right left_camera:=/stereo/left
stereo_ueye.launch
はnextage_ros_bridge
のものに少し修正を加えたものです。--approximate=0.03
のオプションは、左右カメラの画像で0.03秒以内の撮影タイミングの違いを許すことを意味します。NEXTAGEのステレオカメラは同期信号を用いていないため、800x600pxで取得する場合、最大で0.03秒ほどのタイミングのずれが生じる恐れがあります。
キャリブレーションした結果が、下の2つのスクリーンショットです。上が内部パラメータと外部パラメータを基に補正した結果です。下はその結果のうち黒くなった(何も写っていない)部分を切り出したものです。実は今回使った個体は、ステレオカメラの固定位置がピッチ方向に対して左右で少しずれているのですが、キャリブレーションすることでエピポーラ拘束がうまく働くようになりました。
stereo_ueye.launch
では、たくさんのノードが起動されていることがわかります。ueye_cam
以外のノードを簡単に紹介します。
カメラの
image_raw
とcamera_info
をsubscribeして、モノクロ画像のimage_mono, image_rect
とカラー画像のimage_color, image_rect_color
をpublishします。rect
が付いているものはcamera_info
を使った補正後の画像です。それ以外に帯域の狭いネットワークで画像伝送を行うために、圧縮を施したtopicもpublishしてくれます。非常に便利です。ステレオカメラをsubscribeして視差
disparity
とポイントクラウドpoints
をpubslishします。points
トピックのローカル座標系を設定します。
ちなみにNEXTAGEのステレオカメラは左右のカメラが5度ずつ内側を向いて固定されています。
視差画像とポイントクラウド
長くなってきたので、次回の勉強記で扱うことにします。
Comments powered by Disqus.