ロボカップシミュレータ部門について

蒲池 正幸 (kamachi@globalgear.co.jp)



ロボカップの歴史

参考:
公式ホームページの歴史では「1992年 RoboCup発足」に...

preRoboCup 96

1996/11/5〜7

RoboCup 97

1997/8/23-29 名古屋

Humboldt大学優勝
周りでずっと蹴ってると、どんどん加速していき、
誰も止められないボールになった。
当時の実装ではボールの速度の最大値が設定できなかった。

1998年〜


2002年の結果

トーナメント表
  1. 精華大学 Tsinghuaeolus
  2. 北京大学 Everest
  3. BrainStormers
2002年の決勝の様子

インストール

  1. ソースパッケージを取得
    http://sourceforge.net/projects/sserver/
    rcsoccersim-9.2.0.tar.bz2を使ってみている。
    rcsoccersim-9.2.3.tar.bz2がいいのか?
  2. export SED=`which sed`する。
  3. ./configureしてmake。

使い方

  1. サーバーとモニターを起動する。
    rcsoccersim を実行する。
    rcssserverとrcssmonitor起動
  2. 選手の人数分、クライアントを起動する。
  3. モニタで「kick off」を押す。
クライアントのアーカイブ http://medialab.di.unipi.it/Project/Robocup/pub/

サーバー、クライアント

  1. 1選手1クライアント
    UDPでサーバーと通信する。
  2. 6000サイクルで1試合
    1/10秒を1サイクル。
  3. サーバーから情報の取得
    (他のプレイヤー、ランドマーク、ボールの方向、距離)
    1.5サイクルに1回。
  4. コマンドを送る。
    1サイクルに1回。
    dash、kickなど。
  5. クライアント間でのコミュニケーション
    sayコマンド
  6. コーチ機能

サーバーからの情報

  1. 視覚情報
    前方90°に見えるもの。
    情報は正確ではない。コマンドで頻度と精度が変化。
    (see 3000 ((flag c) 30.9 0 0 0) ((flag c t) 55.1 -33)
     ((flag r t) 92.8 -4) ((flag r b) 83.1 40) ((flag g r b) 80.6 21) 
    ((goal r) 81.5 16) ((flag g r t) 83.1 11)
    ((flag p r b) 64.1 31) ((flag p r c) 65.4 13) ((flag p r t) 72.2 -2)
     ((ball) 30 0) ((player test) 30 -17) ((player test) 22.2 7) 
    ((line r) 89.1 -64))
    
  2. 聴覚情報
     (hear 3000 referee kick_off_r)
    
  3. 感覚情報
    スタミナ、現在の速度

主要コマンド

  1. 参加する。
    (init チーム名)
  2. 走る
    (dash 100)
    (dash 強さ(-100〜100))
  3. 方向転換
    (turn 20)
    (turn 角度(-180°〜180°))
  4. 首を回す (turn_neck 20)
    (turn_neck 角度(-90°〜90°))
  5. ボールを蹴る
    (kick 90 0)
    (kick 強さ(〜90)、角度(-180°〜180°))

Rubyで作ってみました。

#!/usr/local/bin/ruby

require "socket"

# サーバーからの情報取得
def get_info
  info = $sock.recvfrom(512)[0].chop
  $log.print info, "\n"  if $log && info.length > 0
  return info
end

# サーバーへコマンドを送る
def send_cmd(cmd)
  $sock.send("(#{cmd})\n", 0 , "localhost", 6000)  
  $log.print "=== #{cmd}\n" if $log
end

$team = ARGV[0]
$sock = UDPSocket.open

# 参加
send_cmd("init #{$team}")
info = get_info

# 番号や状態の取得
if /\(init ([^\)]+)\)/ =~ info
  $myside, $mynum, $game_stat = $1.split(" ")
end

$log = File.open("log/play-#{$myside}-#{$mynum}.log", "w"); $log.sync
print "No.#{$mynum} of #{$team}\n"

# 中心へ移動のつもり。うまくいってないかも。
send_cmd("move 0 0")

while true
  cur_info = get_info
  if /\(\(ball\) ([^\)]+)\)/ =~ cur_info
    distance, degree  = $1.split(" ")
    $log.print "distance=#{distance}, degree=#{degree}\n"

    # ボールの方を向く
    if degree.to_i != 0
      send_cmd("turn #{degree.to_i}")
    end
    # ボール近くにあればキック
    if distance.to_f.abs < 1.0
      dir = 0
      send_cmd("kick 50 #{dir}") 
    else
      # 近くないならボールの方へ走る
      send_cmd("dash 90")
    end
  else 
    # ボールを探して回る
    send_cmd("turn 20")
  end
end

開発リソース

チュートリアル
ライブラリ

次回: RoboCup

http://www.robocup2003.org/
Padua, Italy, July 2-11th, 2003

日本オープン

http://www.carc.aist.go.jp/RoboCup/jp2003/
RoboCup JapanOpen 2003:新潟 会期:2003年5月1日-5日 会場:朱鷺メッセ
(申し込みは1月31日までだった)

参加者リスト