Skip to content

sim_ev3_src_change

I-am-one-2018 edited this page Sep 15, 2020 · 10 revisions

ETロボコンシミュレータにおける実機とシミュレータの切り分け方

はじめに

シミュレータについては、完全に実機をシミュレーションしたものではありません。それにより以下の差異が生じます。

  • シミュレータと実機とのパラメータや個体差
  • シミュレータと実機とのAPI(ログ出力等)

それぞれでソースを分けることも実装の一つですが、シミュレータと実機をビルド時に切り替えることで、ソースコードを共有することが可能です。
その方法として、以下の方法があります。

  • プリプロセッサを使用し、実機またはシミュレーションのターゲットを切り分ける。

また、APIの差異については、以下を確認してください。

切替方法などについては、実行委員より提供している、「sample_c4」をもとに説明します。  

サンプルプログラムの構成

sample_c4の構成】

項番 ファイル名 内容 備考
app.c サンプルプログラム 説明対象
app.h サンプルプログラムのヘッダーファイル
app.cfg コンフィグファイル

実装例

差異によるソースコードの切り分けの実装例は以下の通りです。

1.シミュレーターと実機とのパラメータや個体差の切り分け方について

 34 /**
 35  * シミュレータかどうかの定数を定義します
 36  */
 37 #if defined(MAKE_SIM)
 38     static const int _SIM = 1;
 39 #elif defined(MAKE_EV3)
 40     static const int _SIM = 0;
 41 #else
 42     static const int _SIM = 0;
 43 #endif

解説
38行目にて、シミュレータの場合、シミュレータか否かを判別フラグ(_SIM)に有効(1)が設定される。
40行目にて、実機の場合、判別フラグ(_SIM)に無効(0)が設定される。
なお、42行目については、シミュレータの動作と同様となります。
それにより、下記ソースコード(132~133行目)でスタート時のアクションの切り分け方が行えます。

129     ev3_led_set_color(LED_ORANGE); /* 初期化完了通知 */
130 
131     _log("Go to the start, ready?");
132     if (_SIM)   _log("Hit SPACE bar to start");
133     else        _log("Tap Touch Sensor to start");

解説

  • シミュレータの場合
    リモート接続しているコンソールに、Hit SPACE bar to startが表示され、スペースキーの押下で走行体のライントレースが開始  
  • 実機の場合
    EV3のコンソールに、Tap Touch Sensor to startが表示され、タッチセンサーの押下で走行体のライントレースが開始

シミュレータ/実機を切り替えるには、以下のビルド方法になります。
【ビルド方法】

区分 コマンド
シミュレーター make app=sample_c4 sim
実機 make app=sample_c4

2.シミュレータと実機とのAPI(ログ出力等)の切り分け方について

完全な実機のシミュレーションではないため、使用するAPIによって実機との差異があります。
そのひとつに、ログ出力に差異があります。

区分 API 補足
シミュレーター syslog シミュレーションを起動したコンソール上に出力
実機 ev3_lcd_draw_string 実機のLCDに出力
282 static void _syslog(int level, char* text){
283     static int _log_line = 0;
284     if (_SIM)
285     {
286         syslog(level, text);
287     }
288     else
289     {
290         ev3_lcd_draw_string(text, 0, CALIB_FONT_HEIGHT*_log_line++);
291     }
292 }

解説
「1.シミュレータと実機とのパラメータや個体差の切り分け方について」にて実装例で示した、判別フラグ(_SIM)を使用して実機とシミュレーションでのAPIの差異を切り分けすること可能となります。