ROS勉強記も二桁を数えるまでになりました。遅筆ですが少しずつ回を重ねていきます。前回、ステレオカメラのキャリブレーションまで進んだので、次にステレオ画像処理を学んでいきます。ステレオマッチングでポイントクラウドを生成しましょう。

ステレオマッチングのパラメータ調整

前回少し紹介したように、ステレオマッチングにはstereo_image_procパッケージを使います。apt-getでインストールしたバージョンだと、内部でステレオ対応点探索にOpenCVのStereoBMアルゴリズムを使って実装されています。僕は以前大学時代に使っていた、よりマッチング精度の良かったStereoSGBMアルゴリズムを使いたいと思ったので、いざプルリクエストだ、と意気込んだのですが、すでに@garaemon_coderさんがプルリクエストを出してマージされていました。さすがです。ありがたく使いましょう。

$ ROS_NAMESPACE=stereo roslaunch nextage_camera stereo_camera.launch
$ rosrun image_view stereo_view stereo:=/stereo image:=image_rect_color _approximate_sync:=True
$ rosrun rqt_reconfigure rqt_reconfigure

2行目のコマンドでスクリーンショット1枚目の3つのウィンドウが起動し、3行目のコマンドでStereoSGBMのパラメータ調整をオンラインで行うことができるウィンドウが起動します。

視差画像が上手く生成されるように調整しましょう。調整の勘所は以下のページを見るとわかりやすいです。

http://wiki.ros.org/stereo_image_proc/Tutorials/ChoosingGoodStereoParameters

ポイントクラウド生成

stereo_image_procノードが起動していれば、ポイントクラウドはすでに/stereo/points2トピックでpublishされています。

実は動画を撮影した後に気づいたのですが、カメラのローカル座標系(フレーム)の取り方を間違えていました。以下のコードのassertionで左右のカメラでtfのフレーム名が同じにしなくてはならない、となっていてこれは間違いだろうと、この行をコメントアウトして動かしていました。

https://github.com/ros-perception/vision_opencv/blob/indigo/image_geometry/src/stereo_camera_model.cpp#L35

でも、どちらも左カメラのフレーム名にして、右カメラはカメラの外部パラメータ分オフセットされて出力されるのかな、と気づいたわけです。疑わしきは自分だったわけです。そのせいで設定を間違えて撮影した動画では、LeftCameraのウィンドウはカメラ画像とポイントクラウドが綺麗に重なっているのに、RightCameraの方は明らかにずれています。

NEXTAGEハッカソンまでに直してパラメータ調整もやり直しておきます。