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

距離センサ

SIGVerseでは距離センサはカメラを用います。 ここではSIGViewerサービスから距離データを取得するサンプルを紹介します。

カメラから取得可能な距離データは3つあります。一つ目はカメラから視線方向にあるオブジェクトまでの点と点の距離(スカラ値)、2つ目はエージェントの視線から水平面に沿って,物体までの距離を連続的に得るベクトル値(一次元配列)、3つ目は視野全体に渡る,二次元配列の距離データです。

※このサンプルはサービスプロバイダ機能を使用するため、SSH接続の場合は追加でポートフォワーディングの設定が必要です。

視線方向の距離センサ

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

コントローラ作成

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

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

distanceSensor.cpp

このサンプルでは62行目のdistanceSensor()で距離データを取得しています。

戻り値はunsigned char型です。つまり取得できる距離データは0~255までの整数です。デフォルトでは255cmまでの距離を取得することができ、255よりも遠くにオブジェクトがある場合はすべて255が返ってきます。 引数を変えることによってこれらの距離を変更することができます。

より遠くの距離を取得したい場合はdistanceSensor()の引数に取得したい距離データの範囲を指定することができます。

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

    ↓

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

最後の引数はカメラID番号です。 何も指定しない場合はカメラのID番号1から距離データを取得します。

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

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

世界ファイル

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

$ cd ..
$ emacs xml/distanceSensor.xml

distanceSensor.xml

今回は車輪付き移動ロボットを使用します。

実行

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

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

シミュレーションを実行するとロボットが前に進み始めます。そしてオブジェクトに衝突しそうになると方向転換します。

1次元距離センサ

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

コントローラ修正

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

$ cd NewWorld
$ emacs -nw distanceSensor.cpp

distanceSensor.cpp

    ↓

distanceSensor1D()で視線方向の水平面に沿った1次元の距離データを取得します。戻り値はViewImageクラスです。 デフォルトではカメラの視野角内の幅320ピクセルのデータが取得します。距離データを取得するにはgetBuffer()を使います。0が横方向の視野角内のいちばん左、320がいちばん右のピクセルになります。

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

コンパイルします。

$ make

実行

実行してみましょう。

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

先ほどのサンプルでは近くにオブジェクトがあっても視線方向と外れていたら向きを変えませんでした。 このサンプルでは近くにオブジェクトがあれば向きを変えます。 4つのオブジェクトに囲まれたロボットはなかなか外に出られなくなります。

2次元距離センサ

次は視野全体の距離データを取得します。

コントローラ

distanceSensor.cppの以下を修正します。

  ↓

captureViewで取得した画像と同様に距離データをファイルに保存したい場合は以下の行を適当に追加します。

実行

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

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

保存した距離データ画像を見てみると以下のような距離データが見ることができます。

filedistance.bmp

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

Old Version

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


Front page   New List of pages Search Recent changes   Help   RSS of recent changes