WEB版ETロボコンシミュレータについて（解説編）

https://qiita.com/YoshitakaAtarashi/items/877d1a0cc5ba94a39755

こちらの続きです。

# WEB版ETロボコンシミュレータの位置づけ

ETロボコンシミュレータで検索すると色々な情報が引っ掛かりますので混乱する方もいらっしゃると思います。位置づけを簡単に整理すると下記の図のようになります。
![WEB版ETロボコンシミュレータの位置づけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1804036/a1a143fe-423b-55bc-7793-a702d50a50b8.png)

# WEB版ETロボコンシミュレータの画面説明

画面の説明は下図の通りです。API説明をクリックすると、本シミュレータで利用可能なAPIの説明とサンプルコードを見ることができます。本稿でも改めて説明します。
MiniScriptの仕様はMiniScriptから見ることができます。英語ですがとても簡単なので頑張って読んでみましょう。
シミュレータ操作はシミュレータ上にフォーカスが当たっているときに使える機能一覧です。ALTキーを押すとフォーカスを奪われる不具合が報告されていますので、予告なしに別のキーに変更される可能性があります。
AceエディタはMiniScriptの文法を理解し適切な色付けをしてくれます。実行結果はシミュレータ画面のDebug logをチェックするか、ブラウザのF12キーを押すことで確認できます。
スクリプト実行は Run Scriptボタンで行えます。この下にあるPauseボタンを押すとスクリプト実行を一時的に止めることができます。UninyのTimeScaleを0にすることで物理エンジンも止めています。もう一度Pauseボタンを押すと再開します。
スクリプト実行の横にあるLoad FileはローカルPCにあるファイルをAceエディタに読み込むことができます。Aceエディタのスクリプトを保存するには、Downloadボタンを押してください。ブラウザのダウンロード機能が働きます。Downloadボタンの左側にテキストを入力することで、ダウンロードファイル名を変更することができます。空の場合はランダムなファイル名になります。

![WEB版ETロボコンシミュレータの説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1804036/e1c07b73-194b-0daf-1945-315396ae2bc1.png)

# HackEV走行体のモータ制御について

HackEVは下図のような寸法となっており、右車輪、左車輪、アーム、しっぽをモータで動かすことができます。それぞれ、ev3_motor_set_power_left、ev3_motor_set_power_right、ev3_motor_set_power_arm、ev3_motor_set_power_tailという関数を用意しており、-100～100までの数値を取ることができます。また、ev3_motor_get_counts_left、ev3_motor_get_counts_right、ev3_motor_get_counts_arm、ev3_motor_get_counts_tailでモータの回転角度を取得できるため、HackEVの寸法と合わせて[推測航法(デッドレコニング)](https://www.ogis-ri.co.jp/otc/hiroba/technical/ETRoboconTokyoRengo/2011/ETRoboconTokyoRengo_1/index.html)を用いることで、走行体の走行距離や現在位置を算出することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1804036/e66245ac-dbfc-4c0f-e848-cdefceb49dc4.png)


# Hello, world

ETロボコンAPIを用いて簡単にロボット動かしてみたい人は、下記スクリプトを試してみてください。走行体がスタート地点から10秒間まっすぐ進みます。wait は MiniScriptの内蔵関数で、指定秒数スクリプトの実行を待ちます。このスクリプトを組み合わせることで、ロボットを好きな場所に簡単に移動させることができます。

```
ev3_motor_set_power_left 50
ev3_motor_set_power_right 50
wait 10
```

# MiniScriptの制御構文

MiniScriptはif、for、whileなど、基本的な制御構文を備えています。例えば下記のように記載することで、直進2秒、左旋回0.3秒の動作を11回繰り返します。end 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
```

# WEB版ETロボコンシミュレータ用API

現在サポートしている関数は下記です。取り得る値の範囲は[EV3 API](https://www.toppers.jp/ev3pf/EV3RT_C_API_Reference/)を参考にしてください。

|EV3制御 関数名|引数|機能|
|:-----------|:------------|:------------|
|ev3_motor_set_power_left|パワー|左モータのパワーを設定する|
|ev3_motor_set_power_right|パワー|右モータのパワーを設定する|
|ev3_motor_set_power_arm|パワー|アームモータのパワーを設定する|
|ev3_motor_set_power_tail</td><td>パワー|しっぽモータのパワーを設定する|
|ev3_motor_stop_left|モード|左モータの停止モードを設定する|
|ev3_motor_stop_right|モード|右モータの停止モードを設定する|
|ev3_motor_stop_arm|モード|アームモータの停止モードを設定する|
|ev3_motor_stop_tail|モード|しっぽモータの停止モードを設定する|
|ev3_led_set_color|カラー|LEDカラーを設定する|
|ev3_motor_get_counts_left||左モータの回転角（度）を取得する|
|ev3_motor_get_counts_right||右モータの回転角（度）を取得する|
|ev3_motor_get_counts_arm||アームモータの回転角（度）を取得する|
|ev3_motor_get_counts_tail||しっぽモータの回転角（度）を取得する|
|ev3_color_sensor_get_color||カラーセンサが認識した色を取得する|
|ev3_color_sensor_get_reflect||カラーセンサの反射光強度を取得する|
|ev3_color_sensor_get_r||カラーセンサのＲ成分（赤）を取得する|
|ev3_color_sensor_get_g||カラーセンサのＧ成分（緑）を取得する|
|ev3_color_sensor_get_b||カラーセンサのＢ成分（青）を取得する|
|ev3_ultrasonic_sensor_get_distance||超音波センサの測定距離を取得する|
|ev3_ultrasonic_sensor_listen||超音波センサのListen状態を取得する|
|ev3_gyro_sensor_get_angle||ジャイロセンサの角度を取得する|
|ev3_gyro_sensor_get_rate||ジャイロセンサの角速度を取得する|

# Unity制御用API

デフォルトでは60FPS、TimeScale1.0で動作します。FPSを大きくとカラーセンサの更新周期を上げることができるため、ライントレースが安定する方向になります。FPSを小さくすると表示は間に合うようになるものの、ライントレースに失敗しやすくなります。TimeScaleを低くすることで遅いPCでも走行体の制御を間に合わすことができるかもしれません。ゲーミングマシンをお使いの方は、TimeScaleを大きくすることでシミュレーション時間を短縮できるかもしれません。

|関数名|引数|機能|
|:-----------|:------------|:------------|
|FPS|Int|目標FPSを設定する|
|TimeScale|Float|TimeScaleを設定する|

# 最後に

本稿ではWEB版ETロボコンシミュレータがサポートしている機能を説明しました。インストールレスで気軽にETロボコン気分を味わえる本シミュレータをぜひお試しください。