Raspberry Pi に 3Dカメラ Astra Sを繋いでROSライブラリのテスト

ORBBECのAstra SはマイクロソフトのKinectと同じパターン照射タイプの3Dカメラで、距離画像が必要な産業用アプリケーション用途をターゲットに販売されています。

このAstraS用のROSライブラリが提供されていたのでインストールしてテストしてみました。

参考にしたサイト: astra_camera – ROS Wiki

ROSについてはまだ手探り状態なので、詳しい手順についての説明は省きますが、やったことは以下の項目です。

  1. catkin_wsにソースをダウンロード
  2. catkin_makeでコンパイル
  3. ~/catkin_ws/src$ roslaunch astra_camera stereo_s.launch で実行
  4. 別のターミナルからrvizを実行して画像データを表示する

参考にしたサイトではubuntu 16.04向けのkinetic向けのサンプルということになっていますが、ubuntu 18.04向けmelodicでもとりあえず動作しました。

ただ、一日以上連続して走らせているとハングアップしてしまう症状が発生していて、これがバージョンの違いに起因するものかどうかは確認していません。

ROSロボット用センサとしての実用性

色々なサイトを見てもロボットを動かしながら自己位置推定と地図作成を同時に行うSLAMにはLRF(レーザーレンジファインダー)を使った例ばかりでした。
LRFは水平面で回転するレーザービームで障害物の距離を測るのでロボットの目線の高さの平面にあるものしか検出できませんが、検出距離が30m以上で屋外での使用にも耐える特性を持っています。

Astra sはSimpleViewerで確認すると有効距離8mで30fpsの距離画像を取得できるので、室内での低コストロボット用センサとしてなら、かなり使えそうな気がします。

しかし、ROSで距離画像を取得すると1~2fpsと極端に応答が悪くなってしまいます。
LRFでは2次元の視野なので最大1000データ/scan × 10 / secで、毎秒10,000個のデータを取り込むのに対し、Astra-Sでは640 x 480 x 30fps = 毎秒9,216,000データを取り込んでいます。
これではリアルタイムで距離画像を取得しながらロボットを動かしてマップを生成するSLAMに使うのは難しい印象です。

単に私が使い方を理解していないせいで応答性を上げる手法があるのかもしれませんが、3Dカメラ内部か距離画像を取り込んだ時点でリサンプリングして、例えば画素数を64x48に減らすなどすれば3次元データが取れる特性を活かすことが出来るのではないかと思います。

ROSの活躍場所

ROSについてWebで検索すると様々なセンサやアクチュエータを標準的なプロトコルで接続することが出来るシステムで、例えばパナソニックの収穫ロボットなど実用的なロボットにも採用されたとのプラス面を強調した謳い文句ばかり目につきます。

また次のサイトなどを見るとアームロボットの制御にもROSが活躍するような印象を受けていました。

ROSによるロボットアームの制御

しかし、ROSを触っているうちに現段階のROSは実用的なアームロボットの制御に使うものではなく、ロボット全体とLRFや3Dカメラ及びSLAM等の高度なアルゴリズムによるソフトウェアモジュールを使ってみるための研究向けシステムなんだなと思えてきました。