25
25

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.

TOPPERS/箱庭デモ ETロボコンシミュレータ

Last updated at Posted at 2019-11-06

#概要
本記事は役目が終わりました.
今後は,以下のサイトで最新情報をお知らせしますので,よろしくお願いいたします!!

以下は,保存しておきますが,アップデート予定はございません.

===================================================

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ロボコンのシミュレータ構成としては,下図のように2つのシミュレータを連携させています.

image.png

##物理シミュレータ
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上で正確な再現は時間がかかりそうだったので,単純化して以下のようなロボットにしました.

image.png

機能としては,ライントレースに必要な以下の2つのみ実装しています.
要望に応じて,順次機能追加していく予定です.

  • カラーセンサ
  • サーボモータ(L, R)

なお,寸法については,Unityの単位は,1m だったので,EV3ロボットは実物の10倍(※)にしました.
(※) 例:タイヤ幅は実物約3cmですが,30cmにしています.

##コース
走行コースは,下図のような単純なものにしています.

image.png

##照明
ETロボコン出場者の方々の経験談として,照明の違いによって,制御がうまくできないことがあるというお話をお聞きしておりましたので,スポットライトを自由に追加できるようにしました.

色々なパターンを定義可能ですが,現状は3つのライトを置いています.

  • 全体照明1個

  • image.png

  • スポットライト2個

  • image.png

#デモ
このETロボコンシミュレータを実際に動作させたときの動画は以下の通りです.
照明の影響の動作確認用に,全体照明を途中でON/OFFさせています.

ev3_trace4.gif

#前提とする環境
今回のデモでは,以下の環境を前提としています.

##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パッケージ 最新ソース

##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

##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
      • この際,調査用に頂きたい情報は以下になります.
        1. athrillが出力したエラーメッセージ
      • 例.CPU(pc=<アドレス>) Exception!!
        1. エラー発生した箇所のアセンブラ命令コード(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を起動してください.
無事起動すると以下のような画面が出ますので,右上の「新規作成」を選択し新規プロジェクト作成します.

image.png

次の選択画面で,「プロジェクト名」に適当なプロジェクト名を設定して,「作成」ボタンを押下してください.

image.png

成功すると,以下のようにUnityが起動します.

image.png

###Unityパッケージのインポート
Unity のメニューから,「Assets」⇒「Import Package」⇒「Custom Package...」と選択し,下図のように「ev3rt-demo1.0.unitypackage」を選択してください.

MMAP対応版をご利用される場合は,[ev3rt-demo1.0-1.unitypackage]を選択してください.

image.png

成功すると,下図の画面がポップアップされますので,素直に「Import」ボタンを押下してください.

image.png

成功するとProject/Scenes配下にRoboconSampleというシーンが追加されます(下図).

image.png

RoboconSampleをダブルクリックすると下図の画面が現れます.

image.png

次に,シミュレーションの時間精度を1msecに変更します.
Unityのメニューから「Edit」⇒「Project Settings」と選択し,下図のように「Fixed Timestep」を 「0.001」としてください.

image.png

なお,Fixed Timestepを0.001よりも大きい値にすることも可能です.シミュレーション精度は落ちますが,実行速度は速くなりますので,ご利用環境に応じて調整してください.
MMAP版の場合は,0.01くらいでよいと思われます.

これでインポート作業終了です.

#MMAP用パラメータ設定
MMAP版のパッケージ[ev3rt-demo1.0-1.unitypackage]をインストールされた場合は,MMAPの設定が必要になります.UDPの場合は本設定は不要ですので読み飛ばしてください.

設定する場所は,Unity の以下のスクリプト・パラメータ(Filepath)部分です.

image.png

インポート直後ですと,[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に設定してください(設定例:下図).

image.png

unity_mmap.bin の絶対ファイルパス(Windowsパス)を,[EV3 Sensor]のFilepathに設定してください(設定例:下図).

image.png

以上で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アドレスを設定してください.

image.png

#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の画面上でimage.png ボタンを押下してください.

成功すると,下図のような画面に切り替わります.

image.png

##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」を選択してください(下図).

image.png

すると,InspectorビューにEV3のパラメータが表示されます.

image.png

以下,変更可能なパラメータを説明します(説明されていないものは変更しないでください).
※これらのパラメータは,シミュレーション実行時に動的に変更も可能なものもあります.

##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になります.

image.png

##カラーセンサの状態
パラメータではないですが,カラーセンサの認識している状態を知りたくなることがあるかと思います.
そのため,カラーセンサの認識している値をUnityのパラメータ表示機能を利用して可視化しています.

参照するには,下図のようにHierachyビューでColorSensorを選択してください.

image.png

そうすると,Inspectorビューに下図のように認識値(Rgb)が表示されます.

image.png

Rgbは,現在認識している色をそのまま表示しています.
Rgb_r,g,b には,カラーセンサで取得できる数値を表示しています.

25
25
40

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
25
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?