4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-10

概要

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

ETロボコン2020 - 公式サイト

プログラム解説

LCD

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

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対応
EV3RT C API Reference: ファイルシステム

Bluetooth受信(PC)

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

$ btcat

Bluetooth送信(PC)

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

$ btecho 送信データ

受信(EV3RT)

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

//  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関数を使用します。

//  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関数を使用します。

//  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対応

保存方法(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出力を利用します。

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で走行を開始します。

おすすめの開発画面

実行画面

実行画面

コーディング画面

コーディング画面1

他の記事

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?