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つの引数で距離センサが取得できる距離の範囲を変更することができます。第一引数にoffset値、第2引数に取得する距離データの範囲を指定します。この例ではカメラから距離が50.0~550.0(cm)までの距離データを取得できることになります。このとき戻り値は先ほどと同様0~255です。つまりカメラからの距離が50.0cm以下の場合は戻り値が0になり、550.0cm以上の場合は255となります。取得できる距離データの値と実際の距離は常に比例関係にあります。範囲を大きくすると広範囲の距離データを取得することができますが分解能が悪くなります。
最後の引数はカメラID番号です。 何も指定しない場合はカメラのID番号1から距離データを取得します。
このコントローラではロボットは向いている方向に進み、視線方向のオブジェクトまでの距離が80よりも近くなるとロボットの体全体の向きをランダムに変えます。
Makefileに作成したファイルを追加してコンパイルします。(手順省略)
次に世界ファイルを作成します。
$ cd .. $ emacs xml/distanceSensor.xml
distanceSensor.xml
今回は車輪付き移動ロボットを使用します。
それでは実行してみましょう。
$ ./sigserver.sh -p 9001 -w xml/distanceSensor.xml
#ref(): File not found: "distance_1.JPG" at page "Distance sensor"
シミュレーションを実行するとロボットが前に進み始めます。そしてオブジェクトに衝突しそうになると方向転換します。
次にエージェントの視線方向の水平面に沿って距離データを取得するサンプルを紹介します。水平面の距離データが配列データとして一度に取得します。
コントローラを修正します。
$ 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つのオブジェクトに囲まれたロボットはなかなか外に出られなくなります。
次は視野全体の距離データを取得します。
distanceSensor.cppの以下を修正します。
↓
captureViewで取得した画像と同様に距離データをファイルに保存したい場合は以下の行を適当に追加します。
それでは実行してみましょう。
$ cd ~/sigverse/bin $ ./sigserver.sh -p 9001 -w xml/distanceSensor.xml
保存した距離データ画像を見てみると以下のような距離データが見ることができます。
#ref(): File not found: "distance.bmp" at page "Distance sensor"
遠いオブジェクトほど色が薄くなり、近いオブジェクトほど色が濃くなっています。