Up:Tutorial?    Previous:車輪移動ロボット    Next: 眼球運動   

距離センサ

ここでは距離センサ機能を使ったサンプルを紹介します。距離センサAPIはdistanceSensor(), distanceSensor1D, distanceSensor2D()の3つがあります。distanceSensor()はカメラから視線方向の点と点の距離としてのスカラ値、distanceSensor1Dはエージェントの視線から水平面に沿って,物体までの距離を連続的に得るベクトル値(一次元配列)、distanceSensor2D()は同様に視野全体に渡る,二次元配列の距離データを取得することができます。

※このサンプルはSIGVerseのバージョン110927, SIGViewer-1.4.1以降で正常に動作します。

※このサンプルはサービスプロバイダ機能を使用するため、ポートフォワーディングでサーバに接続している場合は双方向のポートフォワーディングが必要です。設定方法はこちら?を参照ください。

視線方向の距離センサ

distanceSensor()を使ってカメラの視線方向のオブジェクトまでの距離を取得するサンプルを紹介します。

コントローラ作成

まずはコントローラを作成します。

$ cd sigverse-<version>/bin/NewWorld
$ emacs distanceSensor.cpp

distanceSensor.cpp

このコントローラは以下の行

で視線方向のオブジェクトまでの距離を取得しています。戻り値はunsigned char型です。つまり取得できる距離データは0~255までの整数です。デフォルトでは255(SIGVerseの距離の単位)までの距離を取得することができ、255よりも遠いオブジェクトはすべて255が返ってきます。

このコントローラではロボットは向いている方向に進み、視線方向のオブジェクトまでの距離が120よりも近くなるとロボットの体全体の向きをランダムに変えます。

Makefileに作成したファイルを追加してコンパイルします。(手順省略)

世界ファイル

次に世界ファイルを作成します。

$ cd ..
$ emacs xml/distanceSensor.xml

distanceSensor.xml

実行

それでは実行してみましょう。

$ ./sigserver.sh -p 9001 -w xml/distanceSensor.xml
distance_1.jpg

シミュレーションを実行してみるとロボットが進んで、オブジェクトに近づくとロボットが方向転換しているのがわかると思います。

距離範囲、カメラIDの指定

デフォルトでは0~255(SIGVerseの距離)までの距離データしか取得することができません。 さらに遠くの距離を取得したい場合などはdistanceSensor()の引数に取得したい距離データの範囲を指定することができます。

distanceSensor()を例えば以下のように修正します。

    ↓

最初2つの引数で距離センサが取得できる距離の範囲を指定します。この例ではカメラから距離が50.0~500.0までの距離データを取得することができます。このとき取得できる距離データの値は先ほどと同様0~255です。つまりカメラからの距離が50.0以下の場合は戻り値が0になり、500.0以上の場合は255となります。取得できる距離データの値と実際の距離は常に比例関係にあります。範囲を大きくすると広範囲の距離データを取得することができますが分解能が悪くなります。

さらにカメラが複数ある場合などは3番目の引数でカメラIDを指定します。

この後で出てくるdistanceSensor1D, distanceSensor2Dも同様の設定が可能です。

1次元距離センサ

エージェントの視線の水平面に沿って距離を取得するサンプルです。水平面の距離データが配列データで一度に取得することができます。

コントローラ修正

コントローラを修正します。

$ cd NewWorld
$ emacs -nw distanceSensor.cpp

distanceSensor.cpp

    ↓

distanceSensor1D()で視線方向の水平面に沿った1次元の深度マップが得られます。戻り値はクラスDepthImageです。 デフォルトではカメラの視野角内の幅320ピクセル(高さ1ピクセル)のデータが取得できます。(2011年9月の時点では320のみ対応)。距離データを取得するにはgetDistanceFromPixel()を使います。引数はピクセル位置を指定します。0が横方向の視野角内のいちばん左、320がいちばん右のピクセルになります。

このサンプルは水平面の距離データの最小値(いちばん近い距離)が120以下の場合に方向を変えるサンプルです。

コンパイルします。

$ make

実行

実行してみましょう。

$ cd ../
$ ./sigserver.sh -p 9001 -w xml/distanceSensor.xml

先ほどのサンプルでは近くにオブジェクトがあっても視線方向と外れていたら向きを変えませんでしたが、 こちらのサンプルではロボットはより衝突を回避できているのがわかります。

2次元距離センサ

視野全体の距離データを取得するサンプルを紹介します。

コントローラ

新しくコントローラを作成します。

$ cd NewWorld
$ emacs distanceSensor2D.cpp

distanceSensor2D.cpp

このサンプルはcaptureViewのときと同様にエージェントに"move","rotation"等のメッセージを送信してロボットを操作します。また、"capture"を送信した場合はdistanceSensor2D()を使って視野全体の距離データ(深度画像)を取得し、その中で最も近いオブジェクトがある方向を計算し、その方向をロボットが指さします。画像中に同じ距離が複数ある場合は左上を優先して指さします。デフォルトで取得できる距離データのサイズは320×240(2011年9月の時点では320×240のみ対応)です。

また、captureViewで取得した画像と同様に  

で距離データを保存し、可視化することができます。

それではMakefileを修正してコンパイルします。

$ make

世界ファイルの編集

次に世界ファイルを修正します。

$ cd ..
$ emacs xml/distanceSensor.xml

コントローラ指定箇所を修正します。

distanceSensor.xml

    ↓

視線ベクトルを修正します。(※下を向いていると地面を検出してしまうので。。)

    ↓

実行

それでは実行してみましょう。

$ cd ~/sigverse/bin
$ ./sigserver.sh -p 9001 -w xml/distanceSensor.xml

ロボットがリビングに立っているので好きなところでメッセージ"capture"を送信して見てください。ロボットが最も近いオブジェクトの方向を指します。

distance_2.jpg

次に保存した深度画像を見てみましょう。 以下のような濃淡画像が見えると思います。

view001.jpg

                深度画像の例

遠いオブジェクトほど色が薄くなり、近いオブジェクトほど色が濃くなっています。

Up:Tutorial?    Previous:車輪移動ロボット    Next: 眼球運動   


Attach file: fileview001.jpg 1116 download [Information] fileview000.jpg 766 download [Information] filedistance_2.jpg 1193 download [Information] filedistance_1.jpg 1178 download [Information]

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2011-10-27 (Thu) 19:29:36 (4561d)