#はじめに
本記事はETロボコン Unofficial Advent Calendarの12日の記事です。
はじめまして。Team ASaGiのチームリーダー兼アーキテクト担当です。個人としては、ETロボコンに今年初めて参加しました。
Team ASaGiの競技成績として、南関東地区大会とチャンピオンシップ大会の両方で、ボーナス図形である五角形を構築できました。
今年の活動中、過去のAdvent Calendarを読んで参考にさせて頂いたので、Team ASaGiもブロック並べの攻略を中心に、得られた知見やノウハウを公開したいと思います。
#アーキテクチャと攻略手順の話
Team ASaGiのブロック並べ攻略のポイントは、走行体とは別の外部ツール(以下、モニタツール)を用いたことです。
モニタツールにて、初期位置コードの入力から解法の算出を行い、競技中は走行体の各種情報を常時モニタリングすることで、様々なメリットを得ることができました。これらの内容について書きたいと思います。
まず、走行体とモニタツール、システム全体のアーキテクチャは以下の通りです。
- 走行体とモニタツールはBluetooth※で通信
- 走行体のプラットフォームはEV3RT/TOPPERS
- 走行体では走行制御タスク/電文受信タスク/電文送信タスク/音声再生タスクが動作
- モニタツールのプラットフォームはノートPC
- モニタツールはWPFで開発
公開されているライブラリ以外は、過去の資産等は使用せず、全て今年のメンバーで開発しました。
※「Bluetooth®」は、Bluetooth SIG, Inc. USAの商標または登録商標です。
次に、ブロック並べの攻略手順は以下の通りです。
- 人間が初期位置コードをモニタツールに入力
- モニタツールはブロックの運搬ルールを算出
- 人間はモニタツールの画面上に表示される運搬ルールを確認して、送信操作を行う
- モニタツールは運搬ルールをシリアライズして、走行体に電文を送信
- 走行体は受信した電文をデシリアライズして、運搬ルールを展開
- 走行体はブロック並べにおいて、運搬ルールに従って走行
Team ASaGiでは、運搬経路全体を運搬ルールと定義しています。運搬ルールは、複数の運搬コマンドで構成されており、運搬コマンドは運搬元・運搬先のブロック置き場とそれぞれのブロック置き場への移動経路で構成されます。
この攻略手順の強みは、『走行体が何をしようとする(した)のか』を人間が明確に判断できることです。
理解があると、ブロック並べに失敗したとき、問題の切り分け難易度が大幅に下がります。
#モニタツールの話
ブロック並べの攻略を中心に、モニタツールの主な機能について書きます。
##ブロック運搬ルールの算出
先述の通り、初期位置コードからブロック運搬ルールを算出します。
五角形は他のボーナス図形と異なり、完成図形がほぼ1種類しか存在しません。(赤・黒の配置違いのみ)従って、運搬経路を含む運搬コマンド算出のロジックはシンプルです。
- 運搬先が空いているブロックのうち、走行体に最も近いものを運搬対象とする
- 五角形を構成するブロック置き場のうち、運搬対象と同色のものを運搬先とする
- 運搬元と運搬先の間の最短経路を、ダイクストラ法で算出する
以上の手順で運搬コマンドが生成されます。この手順を繰り返して、五角形を構築する運搬ルールを算出します。
算出が完了すると、運搬コマンドが一手ずつ画面に表示されます。
紫の線が運搬元ブロック置き場への経路、オレンジの線が運搬先ブロック置き場への経路を示しています。
##入出力値モニタリング + ログ保存
以下の情報を表示すると同時に、ログとしてCSVファイルに保存します。
- 走行体のセンサ及びモータの入出力状態
- 定周期動作の処理時間
- 色判別の結果
- 推定した自己位置座標
ブロック並べ攻略のデバッグは、自己位置座標のログ無しでは厳しかったと思います。
##PIDパラメータの動的変更
走行体は、難所を含む全区間において、個別のPIDパラメータを使用します。これらのパラメータは、運搬ルールと同様に、モニタツールで設定した値が走行体に送信されます。
異なるブロックで五角形が埋まっている場合など、特定の初期位置コードでは、制限時間内にブロック並べを攻略するのは難しいことがわかりました。
厳しい初期配置でも制限時間内に五角形を構築できるように、ブロックを確保した後は高速に走行する処理を実装しました。
しかし、速過ぎるとブロックを置き去りにするので、トライ&エラーで値を調整しています。
後編では電文送受信と、自己位置補正について書きたいと思います。
#【備考】モニタツールで使用したOSS一覧
- Prism MVVM基盤として採用
- ReactiveProperty 快適にリアクティブプログラミングを実現するため採用
- Live Charts トレンドグラフの表示に採用。バインディングで値更新しても軽くて○
- Material Design In XAML Toolkit UIデザインの根幹に採用
- MahApps.Metro タイトルウィンドウの色を変更するために採用
- NLog 起動毎、一定回数分のログを保存するために採用