#概要
本記事は役目が終わりました.
今後は,以下のサイトで最新情報をお知らせしますので,よろしくお願いいたします!!
以下は,保存しておきますが,アップデート予定はございません.
===================================================
TOPPERS/箱庭WG(hakoniwa-wg)では,箱庭という仮想シミュレーション環境の構築を目指しています.その活動の一環として,ETロボコン向けシミュレータを作成し,ETロボコン開発者に向けた一般公開を1つの目標としています.
2019/11月時点で,EV3RTのAPIを使用してライントレースのシミュレーションは出来るようになりました.以下にその内容/利用方法/インストール手順等を公開しますので,ご意見/機能追加要望などありましたらぜひコメントください.
2020/3月時点で,開発環境のバリエーションを以下のように拡張しました.
OS | CPU | 安定性 | 補足 |
---|---|---|---|
Windows/WSL | v850 | ◯ | - |
Windows/WSL | ARM-cortexA9 | △ | 使い込みが少ないので落ちる可能性あります |
Linux | v850 | ◯ | 原理的には可能なはずですがまだ試してません |
Linux | ARM-cortexA9 | △ | 使い込みが少ないので落ちる可能性あります(動作確認済み) |
Mac | v850 | × | 未サポート.対応予定はありません |
Mac | ARM-cortexA9 | △ | 使い込みが少ないので落ちる可能性あります |
今後はARM版に力を入れていきたいと考えており,v850版の機能拡張は実施しないつもりです.ただ,現状のレベルとしてはv850の方が品質は安定していると思います.一方,ARM版は出来立てのホヤホヤなもので,品質レベルはまだ低いと思いますが,少しずつ改善を行う予定です.
2020/04時点で,以下の変更をしました.
- MMAP対応しました(後述)
- unityのバージョンを上げました(2018⇒2019.3.4f1)
- unityとathrill間のデフォルトUDP通信ポート番号を変更しました(400X⇒5400X)
以下,MMAP対応についてです.
athrillとUnityとの通信をMMAP経由でも行えるようにしました.
MMAPにすると嬉しい点としては以下が挙げられます.
- UDP のように通信ロストは発生しない(シミュレーション精度向上につながる)
- Unity と athrill 間のやりとりは共有メモリベースなので,高速になる(と思われる)
- 上記のとおり,精度向上と高速性を期待して試行してみましたが,精度は良くなりました(速度はあまり変化ないような?).
ただし,デメリットとして以下が挙げられます.
- 1マシン前提での構成を余儀なくされる
- UDPであれば,athrillを別PCに配置して負荷分散可能ですので.
2020/06/04 時点で,Unityの時間同期に関する改良内容を以下にまとめました.
#関連サイト
- ETロボコンシミュレータの拡張が以下でも実施されていますので,こちらも参照ください
#ETロボコン・シミュレータ構成
ETロボコンのシミュレータ構成としては,下図のように2つのシミュレータを連携させています.
##物理シミュレータ
ETロボコンの物理挙動再現環境としては,マルチプラットフォーム/フリーで利用できる Unity を使っています.
##マイコンシミュレータ
ロボコン制御アプリおよびEV3RTの実行環境としては,マルチプラットフォーム/フリーで利用でき,TOPPERS RTOS動作可能な athrill(※) を使っています.
(※) athrill の CPUは v850 ですが,EV3RTの機能再現だけであればCPUアーキは関係ないので,athrillで良いと判断しています.
##スタック構成
ETロボコンシミュレータの利用者は,TOPPERS/RTOSとEV3RTのAPIを使ってETロボコン制御アプリの開発者としています.
そのため,EV3RT API から下の階層の機能は,本番環境とは異なります.
- RTOS は HRP2 ではなくASP3(v850版)/ASP(ARM版) です.
- 基本的な RTOS の API は HRP2とASP3/ASPとで互換しているため特に問題ないと思っておりますが,不都合あればコメントください.
- 当初は HRP2 の移植を試みましたが,移植難易度が高いのと今後HRP3になっていくので,athrillで実績のある asp3/asp を採用したという経緯もあります.
- EV3RT のドライバ群は,UART/I2C等ありますが,これらの再現はしておりません.
- Unity 上のモータ操作やセンサ情報にアクセスすることに特化した専用の仮想デバイスを用意しました.
#登場物紹介
##EV3ロボコン
Unity上で正確な再現は時間がかかりそうだったので,単純化して以下のようなロボットにしました.
機能としては,ライントレースに必要な以下の2つのみ実装しています.
要望に応じて,順次機能追加していく予定です.
- カラーセンサ
- サーボモータ(L, R)
なお,寸法については,Unityの単位は,1m だったので,EV3ロボットは実物の10倍(※)にしました.
(※) 例:タイヤ幅は実物約3cmですが,30cmにしています.
##コース
走行コースは,下図のような単純なものにしています.
##照明
ETロボコン出場者の方々の経験談として,照明の違いによって,制御がうまくできないことがあるというお話をお聞きしておりましたので,スポットライトを自由に追加できるようにしました.
色々なパターンを定義可能ですが,現状は3つのライトを置いています.
#デモ
このETロボコンシミュレータを実際に動作させたときの動画は以下の通りです.
照明の影響の動作確認用に,全体照明を途中でON/OFFさせています.
#前提とする環境
今回のデモでは,以下の環境を前提としています.
##Windows版
環境/プログラム | バージョン |
---|---|
CPU | Core i7-6500U 2.50GHz |
メモリ | 8.00GB |
SSD | 512GB |
GPU | Intel(R) HD Graphics 520 4142MB |
表示メモリ(VRAM) | 128MB |
OS | Windows 10 |
WSL | Ubuntu 16.04.5 LTS |
Unity | Unity 2019.3.4f1 |
athrill2 | 最新ソース |
linux版64bit gccコンパイラ(ライブラリ含む) | v850-elf-gcc (GCC) 4.9-GNUV850_v14.01 |
athrillサンプルプログラム | 最新ソース |
ETロボコンデモ用のUnityパッケージ | 最新ソース |
- 2020/02/20
- まだ暫定ですが,ARM版のETロボコンシミュレータも用意し始めました.
- 出来たてのホヤホヤですので,落ちる可能性があります.その場合は,レポート頂けると嬉しいです.
- ARM版の athrill2 と athrillサンプルプログラムをご利用いただけます.
- ARM版の athrill2 のインストール手順
- ARM版の athrillサンプルプログラム配置場所(既存のサンプルと同じリポジトリ内にあります)
##Mac版
環境/プログラム | バージョン |
---|---|
CPU | 1.8 GHz デュアルコアIntel Core i5 |
メモリ | 4 GB 1600 MHz DDR3 |
SSD | 128GB |
GPU | Intel HD Graphics 4000 1536 MB |
OS | macOS 10.15.2(19C57) |
Unity | Unity 2019.3.4f1 |
athrill2 | 最新ソース |
Mac ARM版 gccコンパイラ(ライブラリ含む) | arm-none-eabi-gcc |
athrillサンプルプログラム | 最新ソース |
ETロボコンデモ用のUnityパッケージ | 最新ソース |
#インストール手順
##unityのインストール
Unityのインストール方法は色々なサイト・書籍で紹介されておりますので,インストールください.
以下のサイト等が参考になるかと思います.
##WSLのインストール
Windows版の場合はWSLをインストールいただく必要があります.
注意点として,現時点(2020/3月)時点では,WSL2はご利用いただけません(WSL2とUnity間でUDP通信できないため).
WSLのインストール方法は色々なサイトで紹介されておりますので,Ubuntu 16.04.5 LTSをインストールください.
以下のサイト等が参考になるかと思います.
##Rubyのインストール
v850版をご利用される場合は,RTOSがASP3になりますので,Rubyをインストールいただく必要があります.
※EV3ロボット制御アプリをビルドする際に必要となります.
$ sudo apt install ruby
##athrill2のインストール
v850版のathrillのインストール手順は以下のサイトを参照ください.
athrillのタイマを32bitタイマに変更したものをご利用いただく必要があるため,makeの実行方法は以下にしてください.
$ make timer32=true clean
$ make timer32=true
- 2020/02/20
- ARM版の athrill2 のインストール手順は以下の通りです.
##linux版64bit gccコンパイラ(ライブラリ含む)のインストール
ARM版のathrill2を利用される場合は,本インストールは不要です(arm-none-eabi-gcc がインストールされていれば,自動的にライブラリが含まれているはずです).
ただし,Mac環境でARM版をご利用される場合は,newlibを別途インストールいただく必要があります.
v850版のathrill2を利用される場合は,以下のサイトからコンパイラおよびライブラリ(athrill-gcc-package.tar.gz)をダウンロードください.
$ tar xzvf athrill-gcc.tar.gz
$ ls usr/local/athrill-gcc/
bin include lib libexec share v850-elf
解凍後,usr/local/athrill-gccを /usr/local 直下に移動してください.
$ sudo mv usr/local/athrill-gcc /usr/local
あとは,.bashrc に以下のパスを設定するだけです.
export PATH=/usr/local/athrill-gcc/bin/:${PATH}
export LD_LIBRARY_PATH=/usr/local/athrill-gcc:/usr/local/athrill-gcc/lib:${LD_LIBRARY_PATH}
設定後は,パスの有効化を忘れずに行ってください.
source ${HOME}/.bashrc
##箱庭用 EV3RT 開発環境のダウンロード
任意のフォルダ上で,athrillサンプル(athrill-sample)のプログラムを git clone してください.
なお,cloneする場所は,以下のように athrillと同じフォルダ階層で実施してください.
|---athril
|---athrill-target
└---athrill-sample
clone方法は以下の通りです.
$ git clone https://github.com/tmori/athrill-sample.git
開発環境一式は以下になります.
$ ls athrill-sample/ev3rt/ev3rt-beta7-release
$ $ ls
asp3 catkin_ws EV3RT_C_API_Reference hrp2.tar.xz sdcard webui
asp_arm Changelog.txt EV3RT_CPP_API_Reference ngki_spec-171.pdf unity
###EV3ロボット制御アプリ
現時点の制御アプリの開発フォルダは以下のフォルダで,制御アプリは app.c です.
※まだ暫定構成です.
v850版のathrill2を利用される場合は,以下のフォルダで作業してください.
$ ls athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/workspace
appdir arg_sakura.txt asp athrillsample deps fstest log.txt Makefile
ARM版のathrill2を利用される場合は,以下のフォルダで作業してください.
$ ls athrill-sample/ev3rt/ev3rt-beta7-release/asp_arm/sdk/OBJ1.0/
app.c app.cfg app.h arg_sakura.txt device_config.txt log.txt Makefile Makefile.inc memory.txt
現状は,app.c/main_task で直接制御を行っています.
コード断片は以下の通りです.
while(1) {
/**
* PID controller
*/
#define white 100
#define black 10
static float lasterror = 0, integral = 0;
static float midpoint = (white - black) / 2 + black;
{
float error = midpoint - ev3_color_sensor_get_reflect(EV3_PORT_1);
integral = error + integral * 0.5;
float steer = 0.07 * error + 0.3 * integral + 1 * (error - lasterror);
ev3_motor_steer(left_motor, right_motor, 10, steer);
lasterror = error;
}
tslp_tsk(100000); /* 100msec */
}
}
上記のアプリケーション実装時の注意点として,以下があります.
- ASP3(v850)版の場合
- double型のデータを使うと athrill がデコードエラーとなる可能性がありますので,float型を推奨します.
- ASP3は第三世代のカーネルなので,周期ハンドラ/APIのパラメータ単位がHRP(第二世代)とは違います.第三世代の単位はマイクロ秒ですが,第二世代の単位はミリ秒です.
- ASP(ARM)版の場合
- ASPは,第二世代カーネルなので,単位はミリ秒です.HRPと同じですね.
- ARM版のathrillは,利用実績が少ないので,命令セットのデコードエラーになる可能性が高いです.
- デコードエラーになった場合は,以下に issue を挙げていただければ対応します.
- https://github.com/tmori/athrill-target
- この際,調査用に頂きたい情報は以下になります.
-
- athrillが出力したエラーメッセージ
- 例.CPU(pc=<アドレス>) Exception!!
-
- エラー発生した箇所のアセンブラ命令コード(objdumpの結果)
- 例.arm-none-eabi-objdump -D asp | less
- objdumpの出力書式は以下の通りです.
- <アドレス>: <機械語(16進数) <アセンブラ命令> <オペランド>
- athrillのエラーメッセージ出力されたアドレスについて,上記箇所をレポート頂ければ上記命令の追加対応が可能になります.
###Unityパッケージ
今回のデモ用ののUnityパッケージ(ev3rt-demo.unitypackage)は,以下にあります.
ls athrill-sample/ev3rt/ev3rt-beta7-release/unity/
ev3rt-demo1.0-1.unitypackage ev3rt-demo1.0.unitypackage ev3rt-demo1.1.unitypackage
UDP通信対応版をご利用される場合は,「ev3rt-demo1.0.unitypackage」を使います.
MMAP通信対応版をご利用される場合は,「ev3rt-demo1.0-1.unitypackage」を使います.
#初期設定
これでインストールはすべて終了です.お疲れ様でした.
ここから実際にEV3ロボコンシミュレータを利用していただくために各種初期設定を行います.
##Unity 設定
###Unity 起動
まず,インストールしたUnityを起動してください.
無事起動すると以下のような画面が出ますので,右上の「新規作成」を選択し新規プロジェクト作成します.
次の選択画面で,「プロジェクト名」に適当なプロジェクト名を設定して,「作成」ボタンを押下してください.
成功すると,以下のようにUnityが起動します.
###Unityパッケージのインポート
Unity のメニューから,「Assets」⇒「Import Package」⇒「Custom Package...」と選択し,下図のように「ev3rt-demo1.0.unitypackage」を選択してください.
MMAP対応版をご利用される場合は,[ev3rt-demo1.0-1.unitypackage]を選択してください.
成功すると,下図の画面がポップアップされますので,素直に「Import」ボタンを押下してください.
成功するとProject/Scenes配下にRoboconSampleというシーンが追加されます(下図).
RoboconSampleをダブルクリックすると下図の画面が現れます.
次に,シミュレーションの時間精度を1msecに変更します.
Unityのメニューから「Edit」⇒「Project Settings」と選択し,下図のように「Fixed Timestep」を 「0.001」としてください.
なお,Fixed Timestepを0.001よりも大きい値にすることも可能です.シミュレーション精度は落ちますが,実行速度は速くなりますので,ご利用環境に応じて調整してください.
MMAP版の場合は,0.01くらいでよいと思われます.
これでインポート作業終了です.
#MMAP用パラメータ設定
MMAP版のパッケージ[ev3rt-demo1.0-1.unitypackage]をインストールされた場合は,MMAPの設定が必要になります.UDPの場合は本設定は不要ですので読み飛ばしてください.
設定する場所は,Unity の以下のスクリプト・パラメータ(Filepath)部分です.
インポート直後ですと,[EV3 Actuator] と [EV3 Sensor]の Filepath は空白です.
ここに設定する値としては,athrillとUnity間で通信するためのMMAPファイルの絶対パスを指定します.
MMAPファイル自体は,以下の2ファイルが含まれています.
$ ls athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/OBJ/*.bin
athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/OBJ/athrill_mmap.bin
athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/OBJ/unity_mmap.bin
athrill_mmap.bin の絶対ファイルパス(Windowsパス)を,[EV3 Actuator]のFilepathに設定してください(設定例:下図).
unity_mmap.bin の絶対ファイルパス(Windowsパス)を,[EV3 Sensor]のFilepathに設定してください(設定例:下図).
以上でMMAPの設定は終わりです.
#UDP用パラメータ設定
Unityとathrillをリモートで通信する場合は,以下のパラメータを設定する必要があります.
##説明する上でのIPアドレスの構成例
Unity側のIPアドレス:192.168.11.32
athrill側のIPアドレス:192.168.11.20
なお,IPアドレスの確認方法は以下のやり方でわかります.
###お使いのPCがLinux/WSLの場合
ターミナル上で ifconfig コマンドを叩いて,ethernetの inet addr の値を確認します.
$ ifconfig
eth0 Link encap:Ethernet HWaddr 54:ee:75:b4:3c:96
inet addr:192.168.11.32 Bcast:192.168.11.255 Mask:255.255.255.0
inet6 addr: fe80::cc6d:70d3:a934:a61b/64 Scope:Unknown
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
###お使いのPCがWindowsの場合
Windows PowerShell を開いて,ipconfigを叩きます.
> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
リンクローカル IPv6 アドレス. . . . .: fe80::cc6d:70d3:a934:a61b%24
IPv4 アドレス . . . . . . . . . . . .: 192.168.11.32
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.11.1
##athrillのパラメータ
athrillを実行するフォルダ配下に,athrill制御用のパラメータ設定ファイル device_config.txt があります.
そこに,以下のようにIPアドレスを定義してください.
DEBUG_FUNC_VDEV_TX_IPADDR 192.168.11.32
DEBUG_FUNC_VDEV_RX_IPADDR 192.168.11.20
DEBUG_FUNC_VDEV_TX_IPADDR には,Unity側のIPアドレスを設定します.
DEBUG_FUNC_VDEV_RX_IPADDR には,athrill側のIPアドレスを設定します.
##Unityのパラメータ
Unity側は,EV3 Sensor(Script)のHostにathrill側のIPアドレスを設定してください.
#EV3ロボコンシミュレータを動かしてみよう
##ETロボコン制御プログラムをビルドする
###v850版の場合
まず,WSLで,athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/workspace
に移動して,ETロボコン制御プログラムをビルドしましょう.
ビルドするには,以下のコマンドを実行してください.
$ make img=athrillsample clean
$ make img=athrillsample
ビルド成功すると,asp というバイナリができます.
$ ls asp
asp
###ARM版の場合
ターミナル上で,athrill-sample/ev3rt/ev3rt-beta7-release/asp_arm/sdk/OBJ
に移動して,ETロボコン制御プログラムをビルドしましょう.
ビルドするには,以下のコマンドを実行してください.
make clean;make
ビルド成功すると,asp というバイナリができます.
$ ls asp
asp
なお,初回のみ,お使いの環境に応じて,環境変数設定およびcfgファイルを配置していただく必要があります.
- Mac版の場合
Mac版の場合,gccインストールフォルダの環境変数の設定が必要になります.
export GCC_PATH=<gccインストールフォルダ>/gcc-arm-none-eabi-9-2019-q4-major
cfg ファイルの配置
$ pwd
<インストールフォルダ>/athrill-sample/ev3rt/ev3rt-beta7-release/asp_arm
$ cp cfg/cfg-mac cfg/cfg/cfg
$ chmod +x cfg/cfg/cfg
- WSL/Linux版の場合
環境変数の設定は不要です.
$ pwd
<インストールフォルダ>/athrill-sample/ev3rt/ev3rt-beta7-release/asp_arm
$ cp cfg/cfg-linux-64 cfg/cfg/cfg
$ chmod +x cfg/cfg/cfg
##Unityのシミュレーションを開始する
次に,Unityをシミュレーションモードにします.
Unityの画面上で ボタンを押下してください.
成功すると,下図のような画面に切り替わります.
##athrillを起動する
最後に,athrillを起動しましょう.
###V850版の場合
WSLで,athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/workspace
に移動して,以下のコマンドを実行してください.
$ make start
###ARM版の場合
WSLで,athrill-sample/ev3rt/ev3rt-beta7-release/asp_arm/sdk/OBJ
に移動して,以下のコマンドを実行してください.
- unityとの通信が UDP の場合
$ athrill2 -c1 -m memory.txt -d device_config.txt -t -1 asp
- unityとの通信が MMAPの場合
$ bash simstart.bash
成功すると,以下のログが出力され,Unity上のEV3ロボットが動き始めます.
core id num=1
ROM : START=0x0 SIZE=512
RAM : START=0x5ff7000 SIZE=10240
Elf loading was succeeded:0x0 - 0xfd68 : 63.360 KB
ELF SYMBOL SECTION LOADED:index=22
ELF SYMBOL SECTION LOADED:sym_num=964
ELF STRING TABLE SECTION LOADED:index=23
athrill_device_func_call=0x60f7444
TOPPERS/ASP3 Kernel Release 3.2.0 for V850-ESFK3 (Nov 6 2019, 10:56:14)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2017 by Embedded and Real-Time Systems Laboratory
Graduate School of Information Science, Nagoya Univ., JAPAN
brick_dri initialized.
_____ ______ ___ ______
/ __/ | / /_ // _ \/_ __/
/ _/ | |/ //_ </ , _/ / /
/___/ |___/____/_/|_| /_/
Powered by TOPPERS/HRP2 RTOS
Initialization is completed..
System logging task is started.
#EV3のパラメータについて
今回のシミュレーション環境(Unity側)にはいくつかパラメータがありますので,その説明を行います.
まず,パラメータを参照するには,Hierachyビューで,「EV3」を選択してください(下図).
すると,InspectorビューにEV3のパラメータが表示されます.
以下,変更可能なパラメータを説明します(説明されていないものは変更しないでください).
※これらのパラメータは,シミュレーション実行時に動的に変更も可能なものもあります.
##EV3 Actuator(Script)
Port(動的変更不可)
Unity側のUDP受信ポート番号です.デフォルトでは54001です.
この値を変更する場合は,athrill側のパラメータ定義ファイル(device_config.txt)の以下も変更してください.
DEBUG_FUNC_VDEV_TX_PORTNO 54001
device_config.txt は,athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/OBJ
直下にあります.
##EV3 Sensor(Script)
Host(動的変更不可)
Athrillの配置マシンのIPアドレスです.
Unityと同じマシン上に配置する場合は,デフォルト値のままで良いです.
マシン負荷が高く,athrillとUnityを別マシンで動かす場合は,このIPアドレスを変更して対応ください.
Port(動的変更不可)
Athrill側のUDP受信ポート番号です.デフォルトでは54002です.
この値を変更する場合は,athrill側のパラメータ定義ファイル(device_config.txt)の以下も変更してください.
DEBUG_FUNC_VDEV_RX_PORTNO 54002
device_config.txt は,athrill-sample/ev3rt/ev3rt-beta7-release/asp3/sdk/OBJ
直下にあります.
##EV3 Monitor(Script)
Power Const(動的変更可)
EV3のモータのパワーです.デフォルトで40としていますが,値を変更できます.
ただ,あまり大きい値を設定しすぎるとUnity側の問題か,物理的にありえないのかよくわかりませんが,EVロボットが吹っ飛びますので,ご注意ください...
#照明のON/OFFについて
先述の通り,今回のデモでは,照明を3個用意しています.
- 全体照明1個
- Directional Light
- スポットライト2個
- Spot Light1
- Spot Light2
それぞれの照明はシミュレーション実行時にON/OFFできます.
ON/OFFのさせ方は単純で,HierachyビューでON/OFFしたいライトを選択します.
すると,Inspectorビューに下図のように「Light」のチェックボックスが見えます.
このチェックボックスを外せばOFFになります.
##カラーセンサの状態
パラメータではないですが,カラーセンサの認識している状態を知りたくなることがあるかと思います.
そのため,カラーセンサの認識している値をUnityのパラメータ表示機能を利用して可視化しています.
参照するには,下図のようにHierachyビューでColorSensorを選択してください.
そうすると,Inspectorビューに下図のように認識値(Rgb)が表示されます.
Rgbは,現在認識している色をそのまま表示しています.
Rgb_r,g,b には,カラーセンサで取得できる数値を表示しています.