第2,3回ROS勉強会でトライしたNEXTAGEのカメラパッケージの続きです。時間はかかりましたが、たくさんあった問題点は解決し、頭部ステレオカメラ、左右ハンドカメラの合計4つのカメラを同時接続、取得できるようになりました。今回はまず頭部ステレオカメラに焦点を当てたいと思います。

カメラドライバ

NEXTAGEにはIDS社製のuEyeカメラというUSB2.0接続の産業用カメラが頭部とハンドに内蔵されています。スペックは以下のとおりです(ロボットの型番によって異なる恐れがあります)。

  • 頭部カメラ:1600x1200px, 10fps or 800x600px, 30fps
  • ハンドカメラ:752x480px, 30fps

民生用Webカメラと違い、露出やホワイトバランス、シャッター速度などのパラメータを完全にマニュアルで操作できます。利用するROSパッケージueye_camは下記レポジトリです。本来はuEyeカメラのドライバインストールが先に必要ですが、ueye_camcmakeで未インストールの場合、自動的にダウンロードしてきてインストールするようになっているので、非常に便利です。

カメラキャリブレーション

カメラに写る物体の精確な大きさを知るためには、カメラの焦点距離やレンズの歪み計数などの内部パラメータを計測するためには、キャリブレーションが不可欠です。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.launchnextage_ros_bridgeのものに少し修正を加えたものです。--approximate=0.03のオプションは、左右カメラの画像で0.03秒以内の撮影タイミングの違いを許すことを意味します。NEXTAGEのステレオカメラは同期信号を用いていないため、800x600pxで取得する場合、最大で0.03秒ほどのタイミングのずれが生じる恐れがあります。

キャリブレーションした結果が、下の2つのスクリーンショットです。上が内部パラメータと外部パラメータを基に補正した結果です。下はその結果のうち黒くなった(何も写っていない)部分を切り出したものです。実は今回使った個体は、ステレオカメラの固定位置がピッチ方向に対して左右で少しずれているのですが、キャリブレーションすることでエピポーラ拘束がうまく働くようになりました。

stereo_ueye.launchでは、たくさんのノードが起動されていることがわかります。ueye_cam以外のノードを簡単に紹介します。

  • image_proc

    カメラのimage_rawcamera_infoをsubscribeして、モノクロ画像のimage_mono, image_rectとカラー画像のimage_color, image_rect_colorをpublishします。rectが付いているものはcamera_infoを使った補正後の画像です。それ以外に帯域の狭いネットワークで画像伝送を行うために、圧縮を施したtopicもpublishしてくれます。非常に便利です。

  • stereo_image_proc

    ステレオカメラをsubscribeして視差disparityとポイントクラウドpointsをpubslishします。

  • static_transform_publisher

    pointsトピックのローカル座標系を設定します。

ちなみにNEXTAGEのステレオカメラは左右のカメラが5度ずつ内側を向いて固定されています。

視差画像とポイントクラウド

長くなってきたので、次回の勉強記で扱うことにします。