はじめに
私はETロボコン実行委員の一員として、2020年にUnityによるETロボコンシミュレータを開発しました。どんなものかはETロボコン 2021 プロモーションビデオを見ていただけると雰囲気がわかると思います。Youtubeには私の技術的な解説動画も公開されています。
ETロボコンシミュレータの課題
ETロボコン環境は参加者の間口を広げるために、WindowsだけでなくMacやLinuxにも対応しています。これは棚橋先生の凄まじい努力によるものですが、一方で、環境構築のための時間がかかる問題や、不具合発生時の問題切り分けが非常に難しい問題を抱えることになりました。(売っぱらう予定だったiMac2014がデバッグ用に大活躍しています...)
また、TOPPERS/箱庭WGが開発した組込みCPUシミュレータAthrillとの連携も良い面と悪い面がありました。良い面は、実機向けのビルド環境と共通化できることです。シミュレータである程度確認したソフトウェアをロボットで動かそうと思えば動かせる、と言うところが素晴らしいです。悪い面は、Athrillの性能不足及び、UnityとAthrill間のUDP通信の遅さです。ゲーミングマシンであれば60fps以上で快適に動くものの、廉価PCでの動作はかなり厳しいものがあります。
その他にも、参加料を払っていただいている参加者の方々以外にはETロボコンシミュレータを提供することができず、教育用途で使ってみたいという方々からのご要望に応えることができませんでした。
WebGLによるETロボコンシミュレータのビルド
気まぐれでUnityのWebGLビルドをやってみたところ、ETロボコンシミュレータが意外に動きそうな感触を得ました。そこで、プロモーションや2022年大会での利用をめざして、WEB版ETロボコンシミュレータを開発することにしました。
UnityのWebGLでの開発は通常の開発よりも大変で、C#のソースコードを変更するとビルドに数分かかるような状況です。しかも、Unityエディタ上で動いたとしても、ちょっとしたことでブラウザ上で動かなくなるので、githubに少しづつコミットしながら動作確認をする必要がありました。
ロボット制御用スクリプト MiniScript
Unity部分の目処が立ち、次の課題はロボット制御のスクリプトをどうするかでした。個人的にはPythonでやりたかったのですがいいソリューションが見つからず。Unityの中で軽量に動くスクリプト言語を探したところ、MiniScriptが良さそうだと思いました。Unityとのマイグレーション方法が明確であり、言語仕様がシンプルなので、初心者でも簡単にロボットを制御できそうです。
WEBエディタAce
MiniScriptをどこで記述するかが問題になりました。最初はUnityのInputFieldを用いてエディタを実装したのですが、マウスをクリックするとテキストが全選択される問題や、WebGLのInputFieldがコピペに対応していない問題が発覚し、この解決にとても時間がかかった挙句、出来上がった機能(Script Panel)のあまりの使いづらさに、自分用のデバッグ機能として将来は闇に葬ることにしました。
MiniScript関係の情報を漁っていると、Aceを用いてUnityを制御する例を発見しました。と言うことで、これを参考にして作りました。
WEB版ETロボコンシミュレータの公開
最初は自分のアカウントのAzureStaticAppsに置いていたのですが、勤め先の環境ではプロキシさんが邪魔をして動かないことが判明しました。そこで、ETロボコンのサブドメインを設定していただき、無事公開となりました。ETロボコンのホームページのAboutの一番下からも行けますし、下記URLからでも行けます。
スマートフォンでは動作せず、PCの最近のWEBブラウザで動きます。
遊び方
WEB版ETロボコンシミュレータのAPIのページを見ると、サンプルコードやAPIが見れます。とりあえず走らせてみたい場合は下記コードをRun Scriptボタンで実行してください。Debug logをオンにすると実行ログが見れます。ブラウザのデバッグ機能(F12)でもみれます。GPU非搭載のPCの場合は、HackEVをHackEV(Simple)に変えると良いでしょう。
// 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 // 次の制御周期まで待つ
end for
最後に
本稿ではWEB版ETロボコンシミュレータの開発経緯について説明しました。次回以降は、二輪倒立ロボット(EV3way)による倒立振子制御など、このシミュレータでできることを説明したいと思います。
おまけ
投稿しようと思ったら、タグは0より大きい値にしてください、と言うエラーが出て焦りました。初投稿あるあるなんでしょうか。