api_ev3rt_on_athrill - ETrobocon/etrobo GitHub Wiki

ETロボコンシミュレータにおけるEV3RTのAPI対応

Summary

2024/4/1 時点でのETロボコンシミュレータにおけるEV3RTのAPIサポートは以下のようになっています。
mrubyのAPI対応状況はこちらをご確認ください。(この先、軽量mrubyフォーラム管理ドキュメントになります。)

機能 サブ機能 対応状況 備考
EV3本体機能 バッテリ 常に固定の値が返されます。
本体ボタン シミュレータ上の本体ボタンクリックに対応しています。
LEDライト シミュレータ上の本体のLEDの色が変わります。
スピーカー 呼んでも機能せず、ただE_OKを返します。
ファイルシステム 仮想のファイルシステムにアクセスできます。ファイルシステムに関する説明を参照してください。
LCD 呼んでも機能せず、ただE_OKを返します。
シリアル BT Bluetooth(R)での通信は対応していませんが、PIPEを使用したやりとりが可能です。詳細はBluetooth通信を参照してください。
モーター - ○ * ev3_motor_rotate()は機能しません(E_OKは返る)。ev3_motor_steer()の挙動も異なるため、使用は推奨されません。
センサ 超音波センサ
タッチセンサ 通信接続時にSpaceキーがタッチセンサーの代わりとなります。
ジャイロセンサ シミュレータ(Unity)から得られたパラメータに基づいた値が取得出来ます。
カラーセンサ reflectとget_rgb_rawのみ対応しています。('20/9/23追記)
Clock - Clockクラスに仕様上の差異があります。Clockクラスに関する説明を参照してください 。

バッテリ

シミュレータ上の走行体は電池の消耗という概念がないため、常に同じ値を返します。

関数 対応状況 備考
ev3_battery_current_mA() -
ev3_battery_voltage_mV() -

本体ボタン

画面で表示されるロボットの本体ボタンをマウスでクリックすることで反応します。

関数 対応状況 備考
ev3_button_is_pressed() -
ev3_button_set_on_clicked() -

LCD

APIとしては存在しますが、機能的には未実装です。常にE_OKを返します。

関数 対応状況 備考
ev3_font_get_size() -
ev3_image_free() -
ev3_image_load() -
ev3_lcd_draw_image() -
ev3_lcd_draw_line() -
ev3_lcd_draw_string() -
ev3_lcd_fill_rect() -
ev3_lcd_set_font() -

LED

シミュレータ上のロボットの色が変わります。

関数 対応状況 備考
ev3_led_set_color() -

スピーカ

APIとしては存在しますが、機能的には未実装です。常にE_OKを返します。

関数 対応状況 備考
ev3_speaker_play_file() -
ev3_speaker_play_tone() -
ev3_speaker_set_volume() -
ev3_speaker_stop() -

ファイルシステム

EV3のファイルシステムはSDカードへの書き込みを提供しています。 シミュレータ環境ではホスト環境での仮想のファイルシステムを提供しています。

関数 対応状況 備考
ev3_bluetooth_is_connected() 常にtrueを返します。
ev3_memfile_load() 仮想ファイルシステムへのアクセスを行います
ev3_memfile_free() -
ev3_sdcard_opendir() 仮想ファイルシステムのディレクトリのオープンを行います。
ev3_sdcard_readdir() -
ev3_sdcard_closedir() -
ev3_serial_open_file() Bluetoothの章を参照してください。
ev3_spp_master_connect() × 対応していません。
ev3_spp_master_is_connected() × 対応していません。
ev3_spp_master_reset() × 対応していません。

アプリケーションプログラムからfopen("test.txt","rw")とした場合、実機でSDカードのトップディレクトリに書き込まれますが、シミュレータの仮想システムではプログラムを実行したディレクトリに__ev3rtfsというディレクトリを作成し、そのディレクトリをトップディレクトリとしたファイルを作成します。つまり、__ev3rtfs/test.txtというファイルができることになります。 逆に__ev3rtfsの下にファイルを置くことで、EV3RTのプログラムからアクセスさせることもできます。 __ev3rtfsという名前はsdk/common/device_config.txtDEVICE_CONFIG_VIRTFS_TOPに指定している値で変更できます。ただし、試走会や大会では標準の値(__ev3rtfs)を使用するため、変更しない方が良いでしょう。

libc(実際はnewlib)で提供しているopen,read,write,closescanf,およびfopen,fread,fwrite,fclose,fprintf,fscanfなども対応しています。

Bluetooth

シミュレータ環境ではBluetooth自体の対応はしていませんが、API上Bluetooth APIを通じてホストコンピュータ側との通信が可能です。 ev3_serial_open_file()でBluetoothを指定した場合、その後のfread(),fwrite()はホスト側への仮想通信路として2つのPIPEを使用します。 __ev3rt_bt_outが出力用、__ev3rt_bt_inが入力用となります。

EV3RTのプログラム側で

  FILE *bt = ev3_serial_open_file(EV3_SERIAL_BT);
  int c;
  while(1) {
    c = fgetc(bt);
    tslp_tsk(1000000);
    fprintf(bt, "Input was=%d\n",c);
  }

のようにすると、実行したディレクトリで以下のように__ev3rt_bt_inPIPEに書き込みを行うとfgetc()などで読み込みを行うことができます。

echo "test" > __ev3rt_bt_in

etrobo環境では、以下のようにも呼び出せます。

btecho "test"

逆に、出力に関しては

cat __ev3rt_bt_out

とするとfwrite()などで書き込んだデータが出力できます。 aspを起動した後で別なコマンドウィンドウから cat __ev3rt_bt_out & とすると、出力を常に出すことができます。

etrobo環境では、以下のようにも呼び出せます。

btcat

毎回上記のコマンドを実行するのが面倒な場合はプロジェクトのMakefile.inc内のADDITIONAL_PRE_APPLに記述したコマンドを自動的に実行させることができます。 ADDITIONAL_PRE_APPL=cat __ev3rt_bt_out & と書くと、make sim upなどで実行するとアプリケーションを起動する前にcatコマンドがバックグラウンドで実行されます。 この仕組みはログなどをとるために使用することを想定しています。 大会・試走会では実行委員会側でcatコマンドでのログをとることだけを想定していますので、事前のコマンドを実行することを前提とした走行にならない要注意してください。

モーター

注釈のないものは対応しています。
なお、シミュレータにおいては各モータが以下のポートに割り当てられています。

ポート 接続モータ 備考
EV3_PORT_A アームモーター -
EV3_PORT_B 右モーター -
EV3_PORT_C 右モーター -
EV3_PORT_D しっぽモーター -

C API

関数 対応状況 備考
ev3_motor_config() -
ev3_motor_get_counts() -
ev3_motor_get_power() -
ev3_motor_get_type() ev3_motor_config()で設定したものが取得できます。
ev3_motor_reset_counts() -
ev3_motor_rotate() × 対応していません。使用しないでください。
ev3_motor_set_power() -
ev3_motor_steer() 対応はしていますが、実機との実現方法が異なるのと、細かい制御ができないため、使用しない方が良いでしょう。
ev3_motor_stop() -

C++ API

クラス 操作 対応状況 備考
Motor Motor() -
Motor ~Motor() -
Motor getCount() -
Motor getPWM() -
Motor getPort() Motor()で設定したものが取得できます。
Motor getBrake() Motor()で設定したものが取得できます。
Motor reset() -
Motor setPWM() -
Steering Steering() ev3_motor_steer()と同様です。
Steering setPower() ev3_motor_steer()と同様です。
Motor stop() -
Motor setBrake() -

センサ

使用する前に設定を行う必要があります(実機と同じ)
なお、シミュレータにおいては各センサーが以下のポートに割り当てられています。

ポート 接続センサー 備考
EV3_PORT_1 タッチセンサー -
EV3_PORT_2 カラーセンサー -
EV3_PORT_3 超音波センサー -
EV3_PORT_4 ジャイロセンサー -

センサの設定

センサの設定には対応しています。

C API

関数 対応状況 備考
ev3_sensor_config() -
ev3_sensor_get_type() ev3_sensor_config()で設定したものが取得できます。

C++ API

クラス 操作 対応状況 備考
Sensor Sensor() -
Sensor ~Sensor() -
Sensor getPort() Sensor()で設定したものが取得できます。

カラーセンサ

カラーセンサはシミュレータではUnity上のカメラを使用して取得した画像から返す値を判定しています。そのため、画像切り替えの解像度(fps)が低い場合には精度が低くなります。そのため、ETロボコンの正式な動作環境は60fps固定モード(つまりシミュレータ時間に対して実時間が長くなる)を使用し、大会や試走会も60fps固定で走行させます。fps可変モードではCPUの性能によってカラーセンサの性能が大きく異なる場合がありますので、注意してください。

C API

関数 対応状況 備考
ev3_color_sensor_get_ambient() 取得できる値の保証が困難なため、実験用以外での利用は非推奨です。
ev3_color_sensor_get_color() 取得できる値の保証が困難なため、実験用以外での利用は非推奨です。色判定は get_rgb_raw を用いて自分で判定してください。
ev3_color_sensor_get_reflect() -
ev3_color_sensor_get_rgb_raw() -

C++ API

クラス 操作 対応状況 備考
ColorSensor ColorSensor() -
ColorSensor ~ColorSensor() -
ColorSensor getAmbient() 取得できる値の保証が困難なため、実験用以外での利用は非推奨です。
ColorSensor getColorNumber() 取得できる値の保証が困難なため、実験用以外での利用は非推奨です。色判定は getRawColor を用いて自分で判定してください。
ColorSensor getBrightness() -
ColorSensor getRawColor() -

注釈のないものは対応しています。

ジャイロセンサ

ジャイロのAPIには対応しています。

C API

関数 対応状況 備考
ev3_gyro_sensor_get_angle() -
ev3_gyro_sensor_get_rate() -
ev3_gyro_sensor_reset() -

C++ API

クラス 操作 対応状況 備考
GyroSensor GyroSensor() -
GyroSensor ~GyroSensor() -
GyroSensor getAngle() -
GyroSensor getAnglerVelocity() -
GyroSensor reset() -
GyroSensor setOffset() -

赤外線センサ

ETロボコンでは使用しないため、赤外線センサには対応していません

関数 対応状況 備考
ev3_infrared_sensor_get_distance() × 非対応
ev3_infrared_sensor_get_remote() × 非対応
ev3_infrared_sensor_seek() × 非対応

タッチセンサ

タッチセンサに対応しています。キーボードのenterキーを押すことで、反応します。

C API

関数 対応状況 備考
ev3_touch_sensor_is_pressed() -

C++ API

クラス 操作 対応状況 備考
TouchSensor TouchSensor() -
TouchSensor ~TouchSensor() -
TouchSensor isPressed() -

超音波センサ

C API

関数 対応状況 備考
ev3_ultrasonic_sensor_get_distance() -
ev3_ultrasonic_sensor_listen() × 対応していません。

C++ API

クラス 操作 対応状況 備考
SonarSensor SonarSensor() -
SonarSensor ~SonarSensor() -
SonarSensor getDistance() -
SonarSensor listen() × 対応していません。

その他センサ

ETロボコンでは使用しないため、下記のAPIには対応していません

関数 対応状況 備考
ht_nxt_accel_sensor_measure() × 非対応
ht_nxt_color_sensor_measure_color() × 非対応
ht_nxt_color_sensor_measure_rgb() × 非対応
nxt_temp_sensor_measure() × 非対応

Clockクラス

操作 対応状況 備考
reset -
now -
wait シミュレーション時間であることに注意してください
sleep シミュレーション時間であることに注意してください