ドキュメント

rcgファイル分析

rcgファイルとは

RoboCup Gameログファイルを意味する. rcssserverで試合を実行すると保存される拡張子がrcgのファイルを指す. rcgファイル中には,フィールド上の全物体の位置速度情報のような,ログプレイヤで試合を再生するために必要な情報が記録されている. デフォルト設定では,"タイムスタンプ-左チーム名_左チーム特点-vs-右チーム名_右チーム得点.rcg"というファイルが生成される.

rcgパーサライブラリ

rcgパーサライブラリはrcsslogplayerが提供するものとlibrcscが提供するものの2種類が存在する. ここではlibrcsc付属のライブラリについて説明する.

rcsslogplayer(rcssmonitor),librcscのいずれのパーサもSAXパーサに似た設計となっている. パース処理自体はライブラリが全て実行し,情報のタイプごとにハンドラメソッドが自動的に呼び出されるようになっている. ライブラリユーザが自分で用意しなければならないのは,各ハンドラメソッド内部の実装である.

rcgパーサの実装例

librcsc-x.x.x/src ディレクトリ以下に存在する rcgreverse.cpp を参照してもらいたい.

librcscをインストールすると,rcgreverse というコマンドが同時にインストールされる.rcgreverseは,ログファイル中の右サイドと左サイドを入れ替えて新しいログファイルとして保存するプログラムである.rcgreverse.cppはこのプログラムのソースファイルである.

rcgreverse.cpp内にはReverserというクラスが宣言されている. Reverserはrcsc::rcg::Handlerを継承したクラスである.

#include <rcsc/gz.h>
#include <rcsc/rcg.h>

class Reverser
    : public rcsc::rcg::Handler {
private:

Reverserクラスのpublicなメソッドとして,bool値を返り値とするhandleXXXX()というメソッドがいくつか宣言されている. これらがパーサのハンドラメソッドである.

// v4 or later
bool handleShow( const int time,
                            const rcsc::rcg::ShowInfoT & show );
bool handleMsg( const int time,
                          const int board,
                          const std::string & msg );
bool handlePlayMode( const int time,
                                   const rcsc::PlayMode pm );
bool handleTeam( const int time,
                             const rcsc::rcg::TeamT & team_l,
                             const rcsc::rcg::TeamT & team_r );
bool handleServerParam( const std::string & msg );
bool handlePlayerParam( const std::string & msg );
bool handlePlayerType( const std::string & msg );

パーサがrcgファイルを読み込んでいる際に,それぞれのメソッドは自動的に呼び出される. 例えば,handlePlayMode()は試合のプレイモードが変更されたときに呼び出されるメソッドである. プレイモードの変更を検出する必要がある場合は,このメソッド中で何らかの処理を行う必要がある. 同様に,各サイクルの物体の位置情報を参照したい場合は,handleShow()メソッド内で何らかの処理を行う.

注意点

過去のログファイルフォーマットへの対応のためにインタフェースが冗長なものになってしまっている. 今後の整理に伴い,ライブラリのAPIが変更される可能性があることに注意されたい. rcssserverバージョン12以降を使用する場合は,rcgreverse.cppの"v4 or later"とコメントされたインタフェースのみを実装すればよい.

rcgreverseは単独のコマンドとして利用する実装例であるため,クラスの宣言をソースファイル中に記述している.クラスライブラリとして再利用する場合は,ヘッダとソースを分けて実装した方が良い.

独自ハンドラの追加とコンパイル

独自の分析ツールを単独のコマンドとして開発する場合は,agent2dのソースツリー内で実装するのが簡単だろう. rcganalyzerというコマンドを開発する場合の手順例を以下に記す.

  1. ソースファイルの用意 rcganalyzer.cppというファイルを追加
  2. クラスの実装
    #include <rcsc/gz.h>
    #include <rcsc/rcg.h>
    
    class RCGAnalyzer
        : public rcsc::rcg::Handler {
    private:
    
    ...
  3. Makefile.amの編集
    srcディレクトリ以下のMakefile.amに以下の設定を追加
    noinst_PROGRAMS = sample_player sample_coach sample_trainer \
     							 rcganalyzer
    
    rcganalyzer_SOURCES = rcganalyzer.cpp
    rcganalyzer_CXXFLAGS = -W -Wall
    rcganalyzer_LDFLAGS =
    rcganalyzer_LDADD =
  4. bootstrap,configure,makeの再実行
    $ ./bootstrap
    $ ./configure
    $ make
  5. デバッグ->makeの繰り返し

注意点

分析ツールのコンパイルをagent2dとは独立に行う場合は,librcsc_rcg, librcsc_gzとのリンクが必要である.(インクルードパス,ライブラリパスの設定ももちろん必要)

 $ g++ rcganalyzer.cpp -lrcsc_rcg -lrcsc_gz

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-03-14 (月) 14:51:37 (1283d)
SourceForge.JP
Creative Commons License
RoboCup tools by Hidehisa Akiyama is licensed under a Creative Commons 表示-非営利 2.1 日本 License.