SWEST23 9/3(金) 11:30～12:40 セッションs3b
https://swest.toppers.jp/SWEST23/program/s3b.html#s3

ETロボコンシミュレータの開発
ETロボコン東京地区 実⾏委員⻑
新 吉⾼（あたらし よしたか）1

１.１ 講演者紹介• 2015年よりETロボコン実⾏委員会に東京地区実⾏委員として参加• 2017年東京地区実⾏副委員⻑を経て、2018年より東京地区実⾏委員⻑
• 2020年⼤会で⽤いられたETロボコンシミュレータ(Unity)の設計・実装を担当• 本業は某企業で組込みソフトからクラウド上でのデータ分析まで薄く広く対応するエンジニア兼マネージャ。
• 技術⼠(情報⼯学部⾨)ETロボコン実⾏委員会 2021

東京地区⼤会懇親会後の集合写真
2

１.２ ETロボコンとはEmbedded Technology Software Design Robot Contestの通称で、LEGO社のLEGO Mindstormsを使⽤した⾃律型ライント
レースロボットの設計とタイムを競うコンテストです。

総合部⾨モデル部⾨

システム分析、ソフトウェア設計モデル

ETロボコン実⾏委員会 2021

＋

競技部⾨

⾛⾏競技による性能

3

１.3 ETロボコン 2021 プロモーションビデオ
https://www.youtube.com/watch?v=W4U41Jk_b38

ETロボコン実⾏委員会 2021

4

2.1 コロナ禍でのシミュレータ開発の決断• 2020年3⽉まではリアル⼤会を実施するつもりで動いていた。
• コロナの状況が悪化したため、4/12の全国連絡会議で中⽌の連絡があるのだろうと思っていたが、シミュレータ⼤会を開催すると連絡があった。
• 救世主はTOPPERS/箱庭WGだった。
• 彼らは組込みCPUシミュレータAthrillを開発し、これと連携するUnity側の単体ロボットシミュレータを開発していた。たしかに、これが使い物になるならシミュレータ⼤会はできなくはない。

「でも、どう⾒積もっても10⼈⽉くらいかかるのだが…」ETロボコン実⾏委員会 2021

5

2.2 要求分析• 運営の要求︓ 学びの歩みを⽌めない︕– シミュレータ⼤会を実施すること。
– 箱庭WGの成果物を活⽤すること。
– ライントレースのみの簡易なものでも⼗分。
– 競技判定は⽬視でもよい。

• 箱庭WGの要求︓ 成果物を多くの参加者にアピールしたい︕– Athrillと単体ロボットシミュレータを⼤会で利⽤すること。
– 箱庭WGにHackEV⾛⾏体の3Dモデルを提供すること。
– ETロボコン⼤会のために⼗分な開発時間を⽤意することはできない。

• 新の狙い︓ リアル⼤会の雰囲気をシミュレータ⼤会でも再現したい︕– エントリー、プライマリー、アドバンストの3クラスをすべてサポートする。
– ⾳や画⾯以外のHackEV⾛⾏体の動作をすべてAPIで制御できるようにする。
– Unityの物理エンジンで作り切る。
– 競技判定はシミュレータが⾏う。
ETロボコン実⾏委員会 2021

6

2.3 要求分析（コンフリクトの理解と解消）• 運営の要求︓ 学びの歩みを⽌めない︕– シミュレータ⼤会を実施すること。 → OK
– 箱庭WGの成果物を活⽤すること。 → OK
– ライントレースのみの簡易なものでも⼗分。 → NG
– 競技判定は⽬視でもよい。 → NG

• 箱庭WGの要求︓ 成果物を多くの参加者にアピールしたい︕– Athrillと単体ロボットシミュレータを⼤会で利⽤すること。→ Athrillのみ– 箱庭WGにHackEV⾛⾏体の3Dモデルを提供すること。 → OK
– ⼗分な開発時間を⽤意することはできない。→ 最低限できることは何か︖• 新の狙い︓ リアル⼤会の雰囲気をシミュレータ⼤会でも再現したい︕– エントリー、プライマリー、アドバンストの3クラスをすべてサポートする。
– ⾳や画⾯以外のHackEV⾛⾏体の動作をすべてAPIで制御できるようにする。
– Unityの物理エンジンで作り切る。
– 競技判定はシミュレータが⾏う。
ETロボコン実⾏委員会 2021

7

2.4 箱庭との疎結合によるコンフリクトの解消• Athrillとシミュレータの間の通信仕様を1024バイトのUDP通信と決定し、ETロボコン実⾏委員会とTOPPERS/箱庭WGが独⽴で開発できる状態を維持することを合意した。
参加チーム開発 ⾛⾏体制御ソフトウェア
プログラミング⾔語︓C/C++

新が開発した部分
ETロボコンシミュレータ(参加者限定)棚橋先⽣の開発

etrobo環境
TOPPERSの成果物

EV3RT/ASP3

箱庭WGの成果物

単体ロボット向け
シミュレータ(⼀般公開)

エミュレータ向け移植版
箱庭WGの成果物＋⼟樋さんの改善

Athrill

CPU エミュレータ

同期・通信(UDPのみ)
ETロボコンの独⾃拡張あり

https://github.com/ETrobocon/etrobo
ETロボコン実⾏委員会 2021

同期・通信(UDP, ROS …)
箱庭WGの独⾃拡張あり
参照： https://toppers.github.io/hakoniwa/prototypes/single-robot/8

2.5 技術課題︓⾛⾏体調整• 本物のHackEVの重⼼は割と⾼い。
– そのためシミュレータ上で全⼒で⾛るとカーブを曲がれず転倒する。（下図）– 重⼼を低くすると安定するが、HackEVらしい挙動が再現できなくなる。（難所攻略の再現性が低くなる）• Unityのパラメータ調整だけでは解決できず、速度に応じて重⼼を下げるスクリプトで解決。

ETロボコン実⾏委員会 2021

9

2.6 技術課題︓アーム調整• ブロックを掴むときにはアームをばねで広げる必要がある。
– ばねが強すぎると掴めない。弱すぎると運べない。
– 摩擦が強すぎると動かない。弱すぎるとすっぽ抜ける。

• Unityのパラメータ調整だけでは解決できず、ブロック保持スクリプトで解決。

ブロック保持時のアームパラメータ調整で何とかしようとしていた頃の調整依頼書
ETロボコン実⾏委員会 202110

2.7 参加者へのv1.0リリース (4/27~7/6)• 3クラスの難所の実装完了• 三⾓柱（スポンサーロゴ）対応– 定期的にロゴが切り替わる仕組み• 使⽤許諾画⾯を実装• 7/6 無事、v1.0をリリース︕• ギリギリ技術教育に間に合った。

ETロボコン実⾏委員会 2021

11

2.8 試⾛会向けv2.0の開発(7/7~8/3)• ⽇本語フォントの⾒栄えを変更した。

• ⼩⽥島さんがAzure上での動作確認をした。
–Azure VM で ET ロボコン EV3/シミュレータ開発環境を構築しよう (準備編) – Qiita• ⾛⾏体の初期位置を変更できるようにした。
– 数値変更後に⾛⾏体をリスポーン– コース選択機能• 8/3 v2.0をリリースした︕

ETロボコン実⾏委員会 2021

12

2.9 技術課題︓ 画⾯キャプチャ機能• 4画⾯構成を決定。
– GPUを使わず、メインスレッドで画像を取り込んでいたため2分の⾛⾏をキャプチャするのに5分かかっていた。

• ⾼速化への道︓ 余計な処理をメインスレッドから追い出す。
– AsyncGPUReadbackを使って画⾯取り込み処理を並列化– PNG⽣成処理を並列化。これで、2フレーム遅延でのほぼリアルタイムキャプチャに成功。

ETロボコン実⾏委員会 2021

13

2.10 試⾛会向けv3.0の開発(8/3〜9/3)• 画⾯キャプチャ機能– 15〜60fpsで画⾯キャプチャしながら、競技結果をcsvに書き出す機能– これがなければ試⾛会も⼤会も成⽴しない︕• 計測モードを追加した。
– 計測準備︓ ⾛⾏準備ができたことをシミュレータに通知する。
– 計測開始︓ 3, 2, 1, GO! で⾃動的に⾛⾏体のタッチボタンが押される。⾛⾏体はタッチボタンを検知してスタートする。
– 計測終了︓ 2分間経過する前に強制的に計測を停⽌する。
– タッチボタン押下からゴールまでの時間計測• その他、夏休みを利⽤して膨⼤な不具合修正を⾏った。
– ジャイロセンサの調整とか、ブロック配置の読み込みミスとか…

• 9/3 v3.0をリリースした︕ 試⾛会1に間に合った。

ETロボコン実⾏委員会 2021

14

2.11 技術課題︓ スラローム板上の判定• Unityは凸多⾓形のコライダーのみサポートしている。
• スラローム板のコライダーは2つのボックス型コライダーの組み合わせで作られている。
• コライダーの境界において、２つの不具合が報告された。
– ⾛⾏体が１％程度の確率で⼩ジャンプする– ペットボトルの転倒判定を間違うことがある

コライダー境界コライダー境界ETロボコン実⾏委員会 202115

2.12 ⼤会向けv4.0の開発(9/4〜10/11)• ペットボトルの転倒判定の不具合を修正。
– 当初はz軸とペットボトルの軸の内積を取って判定していた。しかし、ペットボトルが⾛⾏体の擦りによって回転した場合も転倒と判定されてしまった。
– 検討の結果、ペットボトルの蓋とスラローム板との接触判定を⽤いることでほぼ解決した。

• ガレージ挑戦中に2分を超えた場合に判定を継続できるよう修正。

• 10/11 v4.0をリリースした︕
ETロボコン実⾏委員会 2021

16

2.13 CS⼤会
伝統的に社会⼈が強かったETロボコンだが、2020年は学⽣が活躍した︕

ETロボコン実⾏委員会 2021

17

3.1 ETロボコンシミュレータの課題と解決案
多くの制約の中で開発したため、様々な課題が残っている。
ETロボコンシミュレータの課題

解決案

複数OS対応によりインストーラが複雑化し、 WebGLによるOS⾮依存化、インバージョンアップ毎に不具合報告がある
ストールレス環境の実現（ruby、M1 Mac、WSL関係が多い)
参加者メリットの維持のため、シミュレータのソースコードを公開できないソースコードを公開可能なバージョンを別に開発する。

マイコンシミュレータAthrillとのUDP通信周 Athrillの代わりに軽量なスクリプト期を短くできず、倒⽴振⼦制御の実現が難 ⾔語を⽤いる（この場合、EV3⽤
しいコード⽣成のメリットは無くなる）
JSONファイルでコースをカスタマイズできるものの、難所の配置の⾃由度が低い
ETロボコン実⾏委員会 2021

スクリプト⾔語で⾃由に配置できるようする
18

3.2 WebGL版ETロボコンシミュレータの開発••

WebGLによるOS⾮依存化、インストールレス環境の実現
Athrillの代わりに軽量なスクリプト⾔語(MiniScript)を⽤いる⇒ SWEST23参加者向けに作ってみた。
https://webglsim.etrobo.jp

API⼀覧

MiniScript仕様

Aceエディタ
(MiniScript⽤)
シミュレータ操作
ETロボコン実⾏委員会 2021

スクリプト実⾏19

練習1: HackEV(ロボット）を動かそう① WebGL版ETロボコンシミュレータをブラウザで起動する。
② エディタに下記プログラムをコピペする。
ev3_motor_set_power_left 50
ev3_motor_set_power_right 50
wait 10③ シミュレータ部分をマウスでクリックし、Vキーを押す。
④ Run Scriptボタンを押す。

ETロボコン実⾏委員会 2021

20

ヒント1︓ FPSが20以下の場合(遅いPCの場合）① HackEV(Simple)を選択する。
② Resetを押す。

簡易モデルに切り替わります。

ETロボコン実⾏委員会 202121

実習1: HackEV(ロボット）を⾃由に動かそう① シミュレータ上のResetを押す。
② エディタ上でev3_motor_set_power_left、ev3_motor_set_power_right、 waitを使って、⾃由にプログラムを書く。for ⽂を使って動きを繰り返してみるもよし。
for i in range(0,10)
ev3_motor_set_power_left 50
ev3_motor_set_power_right 50
wait 2
ev3_motor_set_power_left -50
ev3_motor_set_power_right 50
wait 0.3
end for③ シミュレータ部分をマウスでクリックし、Vキーを押す。
④ Run Scriptボタンを押す。
この⽅法でゲート１と２を通過し、ゴールまで⾛らせてみよう。
ETロボコン実⾏委員会 2021

22

練習2: HackEV(ロボット）でライントレース① WebGL版ETロボコンシミュレータをブラウザで起動する。
② エディタに下記プログラムをコピペする。
// P制御で⾛る。
v=50 // まっすぐの時の速度指令値
for i in range(0,10000) // 10000周期分動かす。
ref=ev3_color_sensor_get_reflect // カラーセンサから反射光の強さを取得する。
p=(ref-18)*2 // ⽬標値18からの差分に係数2をかける。
ev3_motor_set_power_left (v-p) // 右エッジの場合、⽬標値より暗い場合は右に曲がるように制御する。
ev3_motor_set_power_right (v+p) // 右エッジの場合、⽬標値より暗い場合は右に曲がるように制御する。
yield // 次の制御周期(5ms)まで待つ
end for③ シミュレータ部分をマウスでクリックし、Vキーを押す。
④ Run Scriptボタンを押す。

⿊いラインの右側に沿って⾛っている。
ETロボコン実⾏委員会 2021

23

ヒント2︓ センサ値の確認⽅法① ブラウザでF12キーを押す② アプリケーション＞ストレージ＞セッションストレージの中のURLをクリックする。
③ スクリプト実⾏中は、MiniScriptのAPIによって取得可能な値を観測できる。

ETロボコン実⾏委員会 202124

実習2: HackEV(ロボット）で左エッジライントレース① WebGL版ETロボコンシミュレータをブラウザで起動する。
② 練習2のプログラムを改造して、左エッジをライントレースするように変更する。
③ シミュレータ部分をマウスでクリックし、Vキーを押す。
④ Run Scriptボタンを押す。

コース形状が複雑なので、途中でライントレースに失敗するかも。
こっちに⾏けば成功

ETロボコン実⾏委員会 2021

ゴールまで完⾛するにはどうすればよいか︖

25

練習3: EV3way(倒⽴振⼦ロボット）を動かす① 上のメニューでEV3Wayを選択し、リセットする。
② エディタに下記プログラムをコピペする。
speed=40 //前進速度
str=0 //旋回速度
balance_init // 倒⽴振⼦初期化
for i in range(0,3000)// 倒⽴振⼦制御
balance_control speed,str, ev3_gyro_sensor_get_rate,0,ev3_motor_get_counts_left,ev3_motor_get_counts_rightev3_motor_set_power_left balance_pwm_l
ev3_motor_set_power_right balance_pwm_ryieldend for③ シミュレータ部分をマウスでクリックし、Vキーを押す。
④ Run Scriptボタンを押す。

ETロボコン実⾏委員会 2021

26

ヒント３︓ 倒⽴振⼦とはETロボコンで⻑く愛されてきた倒⽴振⼦。
タイヤの回転数と回転速度、⾞体の⾓度と⾓速度を⼊⼒として、倒⽴を維持するようにモータの制御値を計算する。
今回は2017年のEV3Wayのモデル(塚本さん作)を利⽤し、下記APIを提供している。頑張ればMiniScriptを使って⾃分で実装することもできる。
• balance_init• balance_control• balance_pwm_l• balance_pwm_r
⼤本のロジック︓ NXTway-GS(2輪型倒⽴振⼦ロボット) C API
http://lejos-osek.sourceforge.net/jp/nxtway_gs.htm
参考にしたパラメータ︓ EV3way ETロボコンで使⽤している倒⽴振⼦APIパラメーターの再計算⼿順
https://qiita.com/pulmaster2/items/08edce1ab097539b2deb
ETロボコン実⾏委員会 202127

実習3: EV3way(倒⽴振⼦ロボット）でライントレース① 上のメニューでEV3Wayを選択し、リセットする。
② 練習3と、練習2or実習2のプログラム参考にして右or左エッジをライントレースするように変更する。
③ シミュレータ部分をマウスでクリックし、Vキーを押す。
④ Run Scriptボタンを押す。
ライントレースだけで、右エッジを30秒台、左エッジを40秒台でゴールまで⾛れればまぁまぁ速い。

ETロボコン実⾏委員会 2021

28

4. さいごに• 多くのETロボコン実⾏委員およびTOPPERS/箱庭WGの努⼒によって、2020年のリモートCS⼤会は無事終了した。リアル⼤会さながらの興奮を味わうことができたと、評判は上々であった。
• YoutubeのETロボコンチャネルにも⾊々と情報があるので、興味のある⽅はこちらも⾒ていただきたい。

新のシミュレータ解説動画

ETロボコン実⾏委員会 2021

29

終わり30