ロボカップの質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
西村

ロボカップの質問

#1

投稿記事 by 西村 » 17年前

Cでロボカップをすることになりました(サッカーのやつです)。シミュレーション部門というやつになると思うのですが・・・現在それに悩んでいます。この掲示版で質問するのは間違いなのかもしれませんが、質問させていただきます。
あまり細かく説明することは僕には出来ないのですが、現在 estimate_current_pos という関数の扱いに困っています。サーバから選手の場所を受信する関数なのですが、それを使うと選手が消えてしまいます。ゴールが視界から出ればこの関数を呼び出す、という風にしたいのですが・・・とりあえず、以下プログラムの一部です。
if(ball->dist <= 1.085){    //ボールがキックかのう距離にある//
if(goal == NULL){           //ゴールの情報が無い//
if(estimate_current_pos(sinf,pstate))     //自分の現在位置情報をサーバから受信//
send_com_kick(sock,20, pstate.dir);            //ボールをキック//
}
}
ゴールの情報がない時、連続して estimate_current_pos関数が呼び出されるからプレイヤーが消えてしまうというのは解るのですが・・・こういう時一度しか呼び出さない方法とか無いでしょうか?
こんな質問の書き方でいいのかはなはだ不安です。

追記:指摘を頂いた箇所を修正しました。

KEV

Re:ロボカップの質問

#2

投稿記事 by KEV » 17年前

関数の内容を知らないので分からないこと多々ですが、
勝手な推測で言うのをご了承ください。

ボールがシュートできる位置にある かつ
ゴールしてない          かつ
プレイヤーがボールの近くにいる  かつ
ときにシュートでしょうか。

上記のソースコードでゴールしてないときに複数回関数が読み込まれる場合、
「現在プレイヤーがシュート動作を行っている」フラグみたいなのを追加して
それで判断したらどうでしょうか。
例:if(isShootintFlag == 1){/* 実装 */}  みたいな

見当はずれのこと言ってるかもしれません;

今のとこ関数の中身とか変数が何なのかがよく分からないので
説明できる範囲で書いてみるとよいと思います。
特に変数が分からない…。
//ゴールの情報ってどうやって取得してるんだろう。

Mist

Re:ロボカップの質問

#3

投稿記事 by Mist » 17年前

> 関数の内容を知らないので分からないこと多々ですが、
たぶんこれのことだと思います。

o estimate_current_pos(SeeInfo *sinf, Side side, PosState *pstate)

estimates the current position of the player (absolute position (pos)
and absolute direction (dir) in the field) based on seen landmarks in sinf.
`sinf' specifies SeeInfo, a result of a parse by scan_info.`side' specifies
the side of the team of the player. The result is put into pstate.

プレーヤの現在位置を概算する。
(絶対位置と絶対方向で)
sinf内の見えている目標物を元にして。
結果はpstateに返される。

Absolute position (X,Y) means that the player is X meters forward and Y
meters right from the center mark. Absolute direction DIR is 0 if the
player faces to the opponent goal line, 90 if he faces to the right touch
line, -90 if he faces to the left touch line, and 180 or -180 if he faces
to the own goal line.

絶対位置(x,y)はプレーヤがセンターマークから何メータ前にいて何メータ
右にいるかを意味する。
絶対方向0はプレーヤは相手のゴールラインを向いている。
90は右のタッチラインを向いている。
-90は左のタッチラインを向いている。
180か-180は自分のゴールラインを向いている。

It returns TRUE if the current position is estimated successfully, and
FALSE if it fails.

現在位置の概算に成功したらTRUEを返し、失敗するとFALSEを返す。


> それを使うと選手が消えてしまいます。
これの意味がよくわかりません。
何から選手が消えるんですか?サーバ上の情報?
また、消えるとはどういった状態を指しているのでしょうか。

消えてしまうことが理解できるとの事ですが、そのあたりももう少し詳しい説明が欲しいです。
私は、上の関数説明を読んだ限りでは(何が消えるのかわからないけど)消えてしまうことに問題があるように思ってしまうのですが。

西村

Re:ロボカップの質問

#4

投稿記事 by 西村 » 17年前

返答ありがとうございます。
Mistさんへの返事になりますが、消えてしまうというのは選手がディスプレイに表示されるフィールド画面からいなくなるということです。僕自身どういう現象なのか良く解りませんが、関数の処理が重くなりすぎてサーバで処理できなくなるためにいなくなるのだと思います。

KEVさんの質問で気がつきました。ゴールというのは得点が入った時という意味でのゴールではなく、ゴールポストとかのゴールのことです。説明が足りませんでした。つまり「ゴールの情報が無い」というのは「敵のゴールが視界にない」という意味です。すみません。

それにしても、やっぱりロボカップをされている方はなかなかいらっしゃらないようで・・・期待して無かったと言えば嘘ですが、うーん・・・

Justy

Re:ロボカップの質問

#5

投稿記事 by Justy » 17年前

 消える問題に関してはこんな断片ソースだけでは何も解りませんが、
この断片を見ると不思議なところが何点かあります。

・ [color=#d0d0ff" face="monospace]if(ball->dist >= 1.085) [/color]
 ball->distの変数ってオブジェクトまでの距離ですよね?
 距離が大きければ中を実行、になっていますが、それで正しいですか?


・ [color=#d0d0ff" face="monospace]if(estimate_current_pos(sinf,pstate) == 0) [/color]
 この判定はサーバーからの現在位置受信に“失敗”したら、send_com_kick()でキック
しているように見えますが、それで正しいですか?

西村

Re:ロボカップの質問

#6

投稿記事 by 西村 » 17年前

説明が下手な上に色々と足りなくて本当に申し訳ないです。
Justyさんに指摘して頂いた if(ball->dist >= 1.085) に関しては完全にこちらのミスでした。emacs からのコピペの仕方が解らないものだから全部直接書き込んでたらミスしてしまいました。修正します。
if(estimate_current_pos(sinf, pstate) == 0)も色々と試行錯誤していた時のただの名残でした。本来は
if(estimate_current_pos(sinf, pstate)) だけになるものと思います(自分の勝手な解釈ですが・・・)。

考えてくれている人達がいるのにこんなにミスしまくってて本当にすみません。

Justy

Re:ロボカップの質問

#7

投稿記事 by Justy » 17年前

 なるほど。

 だとすると。

 1つ思いついたのは、estimate_current_pos()は必ず成功するわけではない
(絶対位置を求めるのにはゴールとかライン情報とかの何か目印が必要)ので、
この関数が失敗して FALSEが戻ったとき、プレイヤー消えたように見えてしまっている
ということはないでしょうか。

 これが原因でなければ、今ある情報だけではちょっと解りません。


# あ、そういえば estimate_current_pos()はサーバーとは通信しないみたいですよ。

西村

Re:ロボカップの質問

#8

投稿記事 by 西村 » 17年前

サーバと通信していないという話を聞いて、「それじゃあつまり自分が思ってなかったようなミスがあるということなのかな?」と思い更に色々調べていたところ、ソースファイルに position.h をインクルードしなければならないことに気がつきました。・・・けれど、ここでまた別の問題が・・・

貰って来たposirion.hがエラーを吐きまくりました。以下がそれなのですが・・・

../include/position.h:31: error: `NUM_FLAGS' undeclared here (not in a function)../include/position.h:31: error: `NUM_GOALS' undeclared here (not in a function)../include/position.h:36: error: `NUM_LINES' undeclared here (not in a function)../include/position.h:60: error: 文法エラー before "Points"
../include/position.h:60: 警告: data definition has no type or storage class
../include/position.h:64: error: 文法エラー before "build_position_knowledge"
../include/position.h:64: 警告: 関数宣言中に(型の無い)仮引数名があります
../include/position.h:64: 警告: data definition has no type or storage class
../include/position.h:65: error: 文法エラー before "init_points_locations"
../include/position.h:65: 警告: 関数宣言中に(型の無い)仮引数名があります
../include/position.h:65: 警告: data definition has no type or storage class
../include/position.h:66: error: 文法エラー before "estimate_current_pos"
../include/position.h:66: error: 文法エラー before '*' token
../include/position.h:66: 警告: data definition has no type or storage class
../include/position.h:67: error: 文法エラー before "int"
../include/position.h:60: 警告: array `Points' assumed to have one element

これだけで判断出来るのか解りませんが、こういうケースは直すべきはこちらのソースファイルなんでしょうか?それとも貰って来た position.h がどこか不完全なのでしょうか? position.h を開示しなければ無理かな・・・

御津凪

Re:ロボカップの質問

#9

投稿記事 by 御津凪 » 17年前

エラー文を見ると、最初の方に定義されていないなどのエラー文がかかれているので、
インクルードする順番に問題があるかも知れません。
もし一番上に position.h をインクルードしていたなら、
宣言されていないエラーが出ているのかもしれません。
他のインクルード文の後に置くようにすると直るかも。

あるいは、 position.h 内で使用している宣言や定義は、
別のファイルにあって、それもインクルードしなければいけないのかもしれません。

西村

Re:ロボカップの質問

#10

投稿記事 by 西村 » 17年前

なるほど!
ありがとうございます、無事にコンパイルを通すことが出来ました!
無事に選手が消えることも無くなった・・・のですが、これまた奇怪な現象が起こるようになってしまいました。でも、とりあえず今回の質問はここで終りにします。とりあえず自分の力でバグにあたってみます。

ここまで導いて下さった方々、本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る