ロボット工学の最も重要な分野の1つはコンピュータビジョンである。その環境を "見る"ことができるマシンには、多くのアプリケーションが考えられる。例えば、ある部品をつかんで別の部品を動かす生産ラインのロボットや、部屋に何人の人がいるかを認識できる監視システムがあるだろう。また、テーブル、椅子、人などの障害物を避けて、2足歩行ロボットに部屋の中を歩かせるというのも考えられる。

長年にわたり、コンピュータビジョンの最も一般的なセンサーは2Dカメラであった。これはその場のRGB画像を(ラップトップやスマートフォンなど、一般的にはデジタルカメラのように)取得できるものである。画像中の物体が回転したり、拡大縮小されていても、それを見つけられるアルゴリズムがある。また、ビデオストリームからモーションデータを取得したり、カメラの位置を追跡するために3D解析をすることができるアルゴリズムがもある。 OpenCV(Open Source Computer Vision Library)のようなライブラリでは、これらの研究がすべて利用可能になっている。

3Dセンサーも利用可能である。これが提供する最大の利点は距離とモーションについての測定が簡単ということだが、新なた次元の測定を追加すると計算が高価になるという問題がある。取得したデータを扱う作業では、2D画像を扱う作業とは大きく異なり、テクスチャ情報はほとんど使用されない。

次のチュートリアルでは、3D処理ライブラリを使用して一般的な深度センサーを取得する方法を説明する。

深度センサー

3D(深度)センサーは、シーン内の「ポイント」までの距離の正確な情報を提供する(ここでポイントとは2Dのピクセルにあたる3Dのオブジェクトである)。 深度センサーにはいくつかのタイプがあり、それぞれ異なる技術で作られている。 センサによっては低速であったり高速であったりする。 また高精度の高解像度測定を行うものも、ノイズが多く、低解像度のものもある。 高価なものも、1万円程度で買えるものもある。 しかし「完璧な」センサーというものはない。なにを選択するかは、実装対象のプロジェクトと予算によって異なる。

ステレオ・カメラ

ステレオカメラは、ここであげるセンサーリスト中、唯一の受動的な測定装置である。 これは本質的に一緒に組み立てられた(互いに数センチ離れた位置にある)2つの同一のカメラで構成され、わずかに異なる場面をキャプチャする。この2つの画像間の差異を計算することによって、各画像内の点に関する深度情報を推定できる。

ステレオカメラは安価であるが、おそらく最も精度の低いセンサーでもある。 理想的には、両方のカメラの完全な較正が必要であるが、実際には実現不可能である。 光の状態が悪いと、役に立たないものである。 また、アルゴリズムが動作する方法(2つの画像内の対応点の検出)のため、何も写っていない空のシーンやテクスチャが単調な物体に対しては、悪い結果をもたらす。 一部のモデルには、グリッドや光のテクスチャをシーンに投影することでこれを回避するものもある(アクティブ・ステレオビジョンという)。

三角測量についての数学はインターネット上で見つけることができるので、ここでは詳細を省く。

ステレオカメラの例

Time-of-flight (飛行時間型)

Time-of-flight(ToF)センサーは、光やパルスを飛ばして、物体との距離までの時間を測定するものである。 光の速度は既知の定数であるため、簡単な公式により、物体までの距離を取得することができる。このセンサは、光条件の影響を受けず、かなりの正確性がある。

LIDAR

LIDAR(ライト+レーダー)はロボットの躯体上に配置されるとても一般的なレーザーレンジファインダであり、非常に速く回転し、瞬間ごとのシーンをスキャンできるものである。 非常に精密なセンサーではあるが、高価であり、テクスチャ情報を取得しない。 長年にわたり、気象学、考古学、天文学など、さまざまな分野で使用されてきた。 LIDAR装置は、衛星、飛行機、移動ロボットに搭載することができる。 LIDARによって取得されたデータは非常に高い解像度を有するため、リアルタイムのアプリケーションで使用するには何らかの処理が必要である。

移動ロボットに搭載されたLIDAR

ToFカメラ

飛行時間型カメラは、LIDARのように1点ごとのスキャンは行わない。 その代わり、フレームごとに1回、シーン全体をキャプチャするために一個の光パルスを使用する。 そのため高速動作が可能であり、いくつかのモデルは100Hz以上のものがある。 その代償として、320×240以下という低解像度になる。 奥行き測定は約1cmの精度がある。 ToFカメラはLIDARセンサーよりも安価であるが、40万円程度はする。 色情報は取得されない。

なおKinect v2は、内部で512×424で動作するToFセンサーであり、1920x1080のRGBカメラを搭載している。

Time-of-flight カメラ                    MicrosoftのKinect V2

パターン照射方式(structured-light)

KinectやXtionのようなパターン照射方式(structured-light)センサーは、赤外光のパターン(例えば枠線や「星座」の点パターン)を物体上に投影することによって動作する。パターンを照射したプロジェクタとは別の角度からこのパターンを見ると歪んで見える。この歪みを解析することにより、深度情報を取得し、物体表面を再構成することができる。

この方式のセンサーの解像度と速度は一般的なVGAカメラと同じである。通常は30FPSで640x480である(実際にはセンサーの方式によって低くなる、Kinectは内部では320x240であり、"ギャップを埋める"方式で補間してそれ以外のデータを作っている )。精度はToFカメラと同様に、1cm以下で、最大のカバー範囲は3〜6mであるが、小さな物体を見るのには問題がある。このセンサーは他のセンサーよりも安価で、第1世代Kinectの価格は約1万円であった。そのため、ここ数年人気が高い。次のチュートリアルでは、これらのカメラのインストールと使用法について説明する。



左:Microsoft Kinect     右:ASUS Xtion PRO

Kinectによって照射される赤外光のパターン(ドットパターン)

ポイントクラウド

深度センサは、3Dデータをポイントクラウド(点群)の形で返す。ここでポイントクラウドとは、3次元空間内の点の集合であり、それぞれに独自のXYZ座標がある。 ステレオカメラやToFカメラ、パターン照射方式カメラの場合、それぞれのポイント(点)はキャプチャされた画像のちょうど1つのピクセルに対応する。 必要に応じて、ポイントには色などの追加情報を格納できる(センサにRGBカメラがあり、それを用いてポイントにテクスチャを設定する場合)。 3Dモデリング・ソフトウェアがある場合は、ポイントクラウドを特定のアルゴリズムで三角メッシュに変換できるが、実際にはこれはほとんど行われず、元のデータセットでクラウドの処理が行われるということを知っておく必要がある。

ポイントクラウド・ライブラリ

Point Cloud Library(PCL)は、ロボット・オペレーティングシステム(ROS)とOpenCVのバックアップをしている(TurtleBotのようなロボットも販売している)ロボット研究会社Willow Garageによって2010年初頭に開始されたプロジェクトである。最初のバージョンは2011年に完成し、それ以来積極的に維持管理されている。

PCLはポイントクラウドと3D処理のための、一つで全部に対処(one-for-all)する解決策を目指している。これには、可視化、フィルタリング、セグメンテーション、登録、検索、機能評価などのさまざまなタスクのための多数のサブモジュールに分割されたオープンソースのマルチプラットフォームライブラリである...さらに、互換性のあるセンサからデータを取得するために使用できるので、何十もの別々のライブラリをコンパイルしたりインストールしたりする必要がないため、このチュートリアルには最適の選択である。

Willow Garageとは別に、PCLは、ライブラリの最も活動的な開発者の1人であるRadu Bogdan Rusuによって設立された非営利団体Open Perceptionの支援を受けている。私は、彼の2009年に書かれた非常に興味深い論文を読むことをお勧めする。これには、PCLに実装された多くの概念やテクニックが紹介されている。

結論

次回のチュートリアルでは、PCLをLinux環境にインストールする方法、KinectやXtionなどのセンサーからポイントクラウドを取得する方法、物体認識などのためにそれらを操作する方法について説明する。 私はチュートリアルというものは入りやすいよう単純化すべきと思っているので、複雑な話は脇に置くことにする(技術の詳細を知りたい場合はいつでも元の文書を検索できるからです)。

Go to root: PhD-3D-Object-Tracking

Links to articles:

PCL/OpenNI tutorial 0: The very basics

PCL/OpenNI tutorial 1: Installing and testing

PCL/OpenNI tutorial 2: Cloud processing (basic)

PCL/OpenNI tutorial 3: Cloud processing (advanced)

PCL/OpenNI tutorial 4: 3D object recognition (descriptors)

PCL/OpenNI tutorial 5: 3D object recognition (pipeline)

PCL/OpenNI troubleshooting