ETロボコン - シミュレーション環境のプログラム解説

# 概要

ETロボコンのシミュレーション環境のプログラム解説です。
主に、ログ出力のためのBluetoothとファイルシステムを解説していきます。
`ETロボコンは、学生の技術向上のための教育事業となってます。本記事では、機能単位の解説としますので、各自が走行プログラムに実装できるよう技術向上に励んでください！！`

[ETロボコン2020 - 公式サイト](https://www.etrobo.jp/)


# プログラム解説

## LCD

シミュレーション環境では、EV3RT本体に内蔵されているLCD画面はターミナルに出力されます。

```c
float x=30.0, y=10.0

//  LCDに出力する文字列
char msg[30];
//  LCDに出力する文字列を作成する
sprintf(msg, "(%f,%f)\n", x, y);
//  LCDに文字列を出力する
_log(msg);
```

sprintf関数を使用する際は、事前に用意した文字列のサイズを超えないように注意する必要があります。
任意の文字列(書式文字列)を作成する際には、データ型に対応した変換指定子を指定する必要があります。

## Bluetooth

実機では、Bluetooth通信で遠隔スタートが行えます。
ただし、シミュレーション環境ではBluetooth通信は対応していません。
そこで、仮想通信(擬似Bluetooth通信)でシミュレーション環境とホストPCの通信を行います。

[ETロボコンシミュレータにおけるEV3RTのAPI対応](https://github.com/ETrobocon/etrobo/wiki/api_ev3rt_on_athrill)
[EV3RT C API Reference: ファイルシステム](https://www.toppers.jp/ev3pf/EV3RT_C_API_Reference/group__ev3api-fs.html)

### Bluetooth受信(PC)

`Visual Studio Code`の`ターミナル`から、Bluetooth通信のデータを受信します。
走行プログラムから受信するデータがある場合は、走行開始前にコマンドを実行します。

```
$ btcat
```

### Bluetooth送信(PC)

`Visual Studio Code`の`ターミナル`から、Blueooth通信のデータを送信します。
走行プログラムがビルド・アップロードされてから、コマンドを実行します。

```
$ btecho 送信データ
```

### 受信(EV3RT)

EV3RTでBluetoothの送信データを1Byte受信する場合は、C言語の`fgetc関数`を使用します。

```c
//  Bluetooth通信の接続
FILE *bt = ev3_serial_open_file(EV3_SERIAL_BT);
//  1Byteのデータを受信する
unsigned char c = fgetc(bt);
//  Bluetooth通信の切断
fclose(bt);
```

### 送信(EV3RT)

Bluetooth通信で、EV3RTからPCに1Byteのデータを送信する場合は、C言語の`fputc関数`を使用します。

```c
//  Bluetooth通信の接続
FILE *bt = ev3_serial_open_file(EV3_SERIAL_BT);
//  1Byteのデータを送信する
unsigned char c = 'A';
fputc(c,bt);
//  Bluetooth通信の切断
fclose(bt);
```

Bluetooth通信で、EV3RTからPCに任意のデータを送信する場合は、C言語の`sprintf関数`と`fprintf関数`を使用します。

```c
//  Bluetooth通信の接続
FILE *bt = ev3_serial_open_file(EV3_SERIAL_BT);
//  最大30Byteのデータを送信する
char s[30];
sprintf(s,"%d\n",100);
fprintf(bt,s);
//  Bluetooth通信の切断
fclose(bt);
```

## ファイルシステム

ファイルシステムは、走行情報をファイルに読み書きする機能になります。
コーディング方法は、実機とシミュレーション環境は同じです。
**保存場所は、実機と実機とシミュレーション環境では違います。**(下記の保存先を参照してください)

[ETロボコンシミュレータにおけるEV3RTのAPI対応](https://github.com/ETrobocon/etrobo/wiki/api_ev3rt_on_athrill)

### 保存方法(Mac)

```tmp.c
char msg[30];  //  出力用の文字列
FILE *log_fp;  //  ファイルポインタ

//  ①ファイルを開く
log_fp = fopen("reflect_log.txt", "w+");
//  ファイルに書き込む文字列を作成する
sprintf(msg, "reflect: %3d\n", 40);
//  ②ファイルに書き込む
fprintf(log_fp, msg);
//  ③ファイルを閉じる
fclose(log_fp);
```

走行ログは、`etrobo/ev3rt-athrill-v850e2m/sdk/workspace/__ev3rtfs`ディレクトリ内に保存されます。
保存先のファイル名は、プロジェクトごとに異なるファイル名を指定しましょう。
（複数のプロジェクトで、同名のファイル(保存先)を指定した場合は、ファイル内容の書き換えが行われるためです）

ファイル関連の処理を実装すると、FPSとTimeScaleが大きく変動します。
ログの出力関係を実装する場合は、処理を実装してもFPSとTimeScaleが変動しない周期を設定します。

### 保存方法(Win)

Windows10(WSL)では、ファイルに直接保存ができないみたいです。そこで、Unixコマンドを使用して、**LCD画面に出力するデータを、LCD(ターミナル)とファイルの両方に出力していきます**。なので、Win環境でファイル保存する場合は、LCD出力を利用します。

```bash
make app=xxx sim up | tee log.csv
```

プロジェクト名(xxx)とログファイル名(log.csv)の箇所を適当なものに修正しましょう。
保存先は、`etrobo`ディレクトリ内に保存されます。その際、コンパイル時の出力データも保存されるので、グラフ等で利用する場合は不必要なデータは削除しましょう。


## キャリブレーション

キャリブレーション(閾値)とは、走行に必要な目標値のことです。
ETロボコンでは、走行に必要な路面の黒色と白色を事前に確認して、その値を目標に走行制御をしていきます。
ここでは、その確認方法の一例を紹介します。

近日公開予定（部分コードの掲載）

```tmp.c
```

# 開発手順

コンパイル時に大会用コースを起動するには、設定が必要です。
**近日公開予定**

下記の手順は、上記の設定をしていない方の手順です。

(0) `Start ETrobo`または`Visual Studio Code`から開発環境を起動します。

(1) `Visual Studio Code`で走行プログラムをコーディングします。

作業用のディレクトリ(workspace)は、`etrobo/hrp3/sdk/workspace/`です。

学習用の走行プログラムには、`sample_c4`をコピーしたものを使用することをおすすめします。

```
cp -r dist/sample_c4/ hrp3/sdk/workspace/sim_template
```

(2) プログラムのビルド・アップロード前に、`etrobo-master/dist/etrobosim2020_0.992_win/ETロボコンシミュレータ`を起動します。

シミュレーション環境を長く使用しないときは終了するようにして、走行プログラムを実行する都度、起動するようにしましょう。

(3) `Visual Studio Code`の`ターミナル`から、プログラムのビルド・アップロードするコマンドを実行します。


作業用のディレクトリは`etrobo/hrp3/sdk/workspace/`ですが、コマンドは`etrobo`ディレクトリ直下で実行します。

```
make app=プロジェクト名 sim up
```

(4) シミュレーション環境で、ETロボコンの走行を開始します。

手動スタートの場合は、ETロボコンのボタンを押して走行を開始します。
リモートスタートの場合は、もう一つ`ターミナル`を起動して、`btecho 1`で走行を開始します。


## おすすめの開発画面

実行画面

<img width="" alt="実行画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658941/c1061b1d-f2e7-6300-2ace-cc208ad776a6.png">

コーディング画面

<img width="" alt="コーディング画面１" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658941/2f0b1103-0154-f436-15e9-afcb7c7c9b02.png">


# 他の記事

- [ETロボコンのシミュレーション環境のテンプレートファイル - GitHub](https://github.com/freezeeyes/etrobo_sim_templates)

- [ETロボコン - シミュレーション環境構築](https://qiita.com/freezeeyes/items/b1c74bbeb3d733416ef2)