Lesson5:自分の位置をしる(静止時)
このlessonでのポイント:
-
静止してプレイヤは、視覚情報からどうしてフィールド上の位置を計算するか。
Lesson3でみたようにサッカーサーバから受け取るsee情報は,
-
プレイヤの向いている方向を中心とする相対位置情報(q度の向きに距離rだけ離れた位置),
-
誤差を含んでいます。
今回は,
-
see情報の flag 情報から自分の位置の計算方法と
-
サッカーサーバが誤差を与える方法
について説明します.
フィールド上には、図.1に示すような仮想的なflagがあります。
(flag c) は、フィールドの真中 (0 ,0)、(flag l b) は左下のコーナ( -フィールドの長さ
/2, フィールドの幅 /2) にあります。
各ラインに沿って、10m毎にflagがあります。たとえば、(flag t l 20) は上のサイドラインにそって、センタラインから左に
20m にある。但し、ラインに沿いの flag はラインから 5m 外側にあるので、(-20,
フィールドの幅 /2 + 5) にああります。
ObjectInfoクラスのサブクラスFlagInfo のインスタンスを作成するときに、フィールドの位置情報を追加するようにします。
ObjectInfo.javaからFlagInfo クラスに関する行をコメントにし、新たにFlagInfo.javaを作成します。
FlagInfoプログラムの説明:
行5:
FlagInfoクラスはObjetInfoクラスを継承するサブクラスです.
さらに、implementsでインターフェースクラスであるParameterクラスを継承しています。
(Javaは多重継承(複数のクラスからの継承)はありません。
但し、インターフェースクラスを多重継承することはできます。)
ここでは、 フィールドやペナルティアリアの大きさを示す定数 {FieldLength,
FieldWidth, PenaltyAreaLength, PenaltyAreaWidth, GoalWidth}を定義します。
Player3プログラムの説明:
Player3クラスはPlayer2クラスのサブクラスです。
行47-76:
see情報を{ball, player, gola, flag, line}に応じて分類します。
行78-108:
flagの情報を用いて自分の位置を計算します。
-
配列p_flag[]の最初の2つのflagを計算の基準に選ぶ。
-
三角測量の原理から(位置のわかっている2点への距離とその間の角度から自分の位置を計測する)位置を求める。
プログラムの実行:
1番のプレイヤ (-47, 0) に対する実行結果です。
-------------------------------------------------
where_am_i (x, y, r0) = -46.48714671064405, -0.6835002660206726, 68.0
angles (j-i, a, b) = 70.0, 56.72617615567415, -53.273823844325854
ObjectInfo [type]=
flag
[distance, direction]=
58.0 -35.0
[distChange, dirChnage]= 0.0
0.0
[bodyDir., HeadDir.]= 0.0 0.0
{area, hori, vert, no}=
c t
0
{position_x, y}= 0.0
-34.0
ObjectInfo [type]=
flag
[distance, direction]=
58.0 35.0
[distChange, dirChnage]= 0.0
0.0
[bodyDir., HeadDir.]= 0.0 0.0
{area, hori, vert, no}=
c b
0
{position_x, y}= 0.0
34.0
:
where_am_i (x, y, r0) = -47.439688790427525, -0.10891792782165055,
52.5
angles (j-i, a, b) = -17.0, 144.15548256831113,
18.844517431688864
ObjectInfo [type]=
flag
[distance, direction]=
58.0 -13.0
[distChange, dirChnage]= 0.0
0.0
[bodyDir., HeadDir.]= 0.0 0.0
{area, hori, vert, no}=
c b
0
{position_x, y}= 0.0
34.0
ObjectInfo [type]=
flag
[distance, direction]=
105.6 -30.0
[distChange, dirChnage]= 0.0
0.0
[bodyDir., HeadDir.]= 0.0 0.0
{area, hori, vert, no}=
r b
0
-------------------------------------------------
正しい位置(-47, 0)に大体あった値(-46.4., -0.683.)や(-47.4., -0.108.)とが表示されるのは、サッカーサーバが距離に応じて誤差が入るように、距離
d を切り上げを含む以下の計算をした後の距離d'を出力しているからです。
d'=Quantize(exp(Quantize(log(d), 0.01), 0.1)
Quantize(V, Q)=celieng(V/Q)*Q
(manual [Ver.5] 3.2.1Visual Informaion, Unreliability of Information
about Far Ojectsの項)
左の図はy=d のグラフ、右の図はy=Quantize(exp(Quantize(log(d), 0.01),
0.1)のグラフ.
プログラムリスト
Client.java
Player.java
Player1.java
Player2.java
Player3.javaP
ObjectInfo.java
Parameter.java
FlagInfo.java
Makefile
課題:
-
上記のプログラムでは、see情報にある最初の2つのフラグを使用している。
計算誤差が少なくなるようなフラグの選択方法は?
プログラム参考:
http://java.sun.com/Series/Tutorial/java/javaoo/index.html