Lesson5:自分の位置をしる(静止時)

このlessonでのポイント:

Lesson3でみたようにサッカーサーバから受け取るsee情報は, 今回は, について説明します.
フィールド上には、図.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の情報を用いて自分の位置を計算します。

  1. 配列p_flag[]の最初の2つのflagを計算の基準に選ぶ。
  2. 三角測量の原理から(位置のわかっている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

課題:

プログラム参考:
http://java.sun.com/Series/Tutorial/java/javaoo/index.html