この環境はETロボコン用にraspberryPiとLEGO(R)のSPIKE Prime(R)を接続して動作させるためのものです。raspberry側のEV3RT互換環境と、SPIKE側の制御ソフトからなり、これらを総称して「RasPike」と呼びます。
EV3RTのベースとなるraspberry-Pi用aspシミュレータはMac OS X用のシミュレータをraspi用に修正したものとなっています。 https://www.toppers.jp/asp3-e-download.html
athrillのバージョンに合わせるため、3.2.0を使用しています。
また、linux用の変更やsetjmp/longjmpのmangleに関しては https://qiita.com/morioka/items/a186fff4db1eabb7e7de を参考にしています。
本SWはmaosxシミュレータの成果物および、athrillの成果物を多く使用しています。
Raspberry-PiとSPIKEの接続にはアフレルから販売されているSPIKE ETロボコンキットのSPIKE用ケーブルを使用します。 https://afrel.co.jp/product/et-set
接続の方法などはETロボコンの組み立て図を参照ください。SPIKEケーブルはSPIKEのDポートを利用します。また、Raspberry側でGPIOを使うための設定が必要になります。
対応しているRasPiのOSはRasBerry Pi OS(Bullseye)の32bit版になります。 https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-32-bit からwith Desktopバージョンを持ってきて、カードに焼いて立ち上げてください。
その後、必要なソフトとしてrubyなどがありますので、
sudo apt install ruby
sudo gem install shell
でインストールをしておいてください。
mac os x用のシミュレータはsetjmp/longjmpの仕組みを使ってコンテキストスイッチを行なっていますが、通常のsetjmp/longjmpで設定されるPC/SPはmangleされており、オリジナルのシミュレータのようにjmp_bufにポインタを簡単に設定することはできません。そのため、mangleを行わないsetjmp/longjmpを組み合わせることで実行できるようにしています。
mangleしないバージョンのsetjmp/longjmpは以下にあります。
https://github.com/ytoi/raspi_simple_setjmp.git
mkdir work
cd work
git clone https://github.com/ytoi/raspi_simple_setjmp.git
cd raspi_simple_setjmp
make
でlibssetjmp.soができます。 これをLD_PRELOAD環境変数を使うことで、libcよりも早く読み込ませて置き換えをおこないます。
(workに移動)
git clone https://github.com/ytoi/ev3rt_aspsim_raspi_linux.git ev3rtsim
cd ev3rtsim/sdk/workspace
make img=(アプリ名)
以下で接続してください。
アームモータ : A
右モータ : B
左モータ : E
カラーセンサー : C
超音波センサー : F
serial通信:D
上記接続に対し、EV3RTからは以下のようにマップされます。アプリ側はこれに合わせてコードを書いてください。
EV3RTでの見え方
ポートA:アームモータ
ポートB:右モータ
ポートC:左モータ
ポート1:タッチセンサ(実際はSPIKEの左ボタンが対応します)
ポート2:カラーセンサー
ポート3:超音波センサー
ポート4:ジャイロセンサ(これはまだ開発中)
SPIKEのプログラムはspikeディレクトリ以下にあります。 raspike_etrobo.py - ETロボコン用に最適化した制御プログラムです。 raspike_main.py - 汎用的なSPIKE制御用プログラムです
ETロボコン用にはraspike_etrobo.pyを利用してください。
SPIKEへの転送には以下の2つの方法があります。
(1) PCから直接SPIKEに入れる
(1-1) Visual Studio CodeのSPIKE用拡張を使うやり方
https://marketplace.visualstudio.com/items?itemName=PeterStaev.lego-spikeprime-mindstorms-vscode
raspike_etrobo.pyの先頭行に
# LEGO type:standard slot:2 autostart
とあるのは、この拡張機能のリロードボタンを押した時にSlot2に自動的にアップされ、実行されるための記述です。slot番号は2としていますが、自由に変えてください。
(1-2) PCのMu-Editorを使っていれる入れ方 PCにMu-Editorを入れます。この場合、SPIKEに指しているUSBをPC側に挿してください。 ファイル転送を選択して、raspike_etrobo.pyを右クリックして、「write as main.py」でSPIKEのmain.pyとして書き込みます。こうすることで、SPIKEは立ち上げるとRasPike用にRasPiからの信号待ちになります(一応ディスプレイに「ET」と表示しているので、きちんと動いているかはわかります) このやり方が一番パフォーマンス良いかと思います。RasPiのプログラムを動かす前にはSPIKEの再起動もするようにしましょう(メモリが使われて、GCが働くとパフォーマンスが悪くなるため)。
(2) Raspberry-PiからMu-Editorを使って入れる
アフレルさんの教材にあるのがこの方式ですが、作者はやったことがないので後で試したら記載します。
(3) PCから教材用SPIKEアプリを使って入れる
これはお勧めしません。SPIKEアプリはかなりパフォーマンスが悪いので、簡単な動作確認には良いですが、ETロボコンでは使わない方が良いでしょう。 (ただし、プログラムを入れるだけなら大丈夫かもしれません)
一度インストールしたら、そのあとはSPIKE側のUIからプログラムを選択して実行すれば良いです。再度のインストールは不要です。
注意として、SPIKEの電源を入れたまま何度もSPIKEのプログラムを実行しているとSPIKE側のpythonがどんどん重くなり、性能が悪くなることです。走行させるたびにSPIKEの電源を切るようにしてください。性能が10倍くらい違います。
(1) SPIKEのプログラムを先に実行させます
(2) Raspberry-Piのシェルからプログラムを実行します
make start
Raspberry-Pi上のプログラムでETロボコンシミュレータを動作させることができます。 ETロボコンシミュレータと繋ぐには、raspi側の設定と、ETロボコン側の設定が必要です。 raspi側はsdk/common/device_config_athrill.txtに相手側のIPアドレスを書く必要があります(TX)。
sdk/common/device_config.txtの以下を環境に合わせて変更してください
DEBUG_FUNC_VDEV_TX_IPADDR 192.168.11.4 --> PC側のIPアドレス
DEBUG_FUNC_VDEV_RX_IPADDR 192.168.11.12 --> RaspiのIPアドレス
また、ETロボコンシミュレータ側は「設定」からraspi側のIPアドレスを指定します(設定後は「リセット」ボタンを押して、ロボットが初期状態になるようにしてください)
make startsim
で実行できます。
gdbを使う場合は
gdb asp
gdb) set environment LD_PRELOAD=../../../raspi_simple_setjmp/libssetjmp.so
gdb) handle SIGUSR2 noprint nostop pass
gdb) r -d ../common/device_config.txt
で実行できます。シミュレータではSIGUSR2をプライオリティ変更のとりがとして利用しているので、SIGUSR2をgdbがトラップせずにaspアプリ側に渡す必要があります。 libssetjmp.soの置いている場所に合わせて変更してください。
.gdbinitに書いておく方法もあります。 .gdbinit
set environment LD_PRELOAD=../../../raspi_simple_setjmp/libssetjmp.so
handle SIGUSR2 noprint nostop pass
ただし、これを行う場合には~/.gdbinitの方にも以下の記述が必要です。
add-auto-load-safe-path /home/pi/etrobo/asp/sdk/workspace/.gdbinit
workspaceがある実際の場所に変更してください。
注意点
2022/1/14現在、app.cに__dso_handle=0の定義があると、多重定義になってしまうので、アプリでは定義せず、コメントアウトしてください。 Bluetooth/EV3のファイルシステム関数は未サポートとなっています。