MATLAB/SimulinkでETロボコンに出場する:Unityと繋ぐ

今回のMATLAB/SimulinkでETロボコンの出場する、という課題で発掘したネタはたくさんあるんですが、面白いものの1つに、プラントモデルにUnityを採用するにはどうするか? です。 物理モデルを作るツールに、MATLABファミリーにはSimScapeというツールがあるのは知ってるんですが、これがまた高い!29.5万円なり。 オマケに、SimScapeって、厳密で部分的な物理シュミレーションをするにはいいんだろうけど、ETロボコンでコース走ります、という規模のシミュレーションに使えるのかどうかが不明。
そんな中、ETロボコン東京地区Unity部が、UnityでETロボコン競技会場を見事に再現しているのをみて、もしかして、これでバーチャルな大会できるんじゃね? だったら、検証するためにコース走るぐらいなんて、丁度いいでしょ。 Unityでプラントモデル作るわ。
まー、それにしても、みんなMATLABも初めてだけど、Unityも初めてでして。知らないこと一杯で、どれだけGoogle検索に頼ったことだか。MATLABを調べていると、M言語から.NETアセンブリを簡単に呼び出せることが判明。そしたら、もう、C#でUnityと繋ぐライブラリ「UdpRelay」を作って、UnityもC#でスクリプトを書くのは分かったから、繋げるのは簡単。UdpRelayはその名の通り、ネットのUDP接続でお互い対向する形で通信するライブラリです。Unityの最小最大のステップ幅を0.001秒=1ミリ秒に制限して、Simulinkのシミュレーション時間も1ミリ秒にして、Simulinkからパケットにモーター制御値を入れてUnityへ送り、Unityはそれを受け取ってモーター回して、ジャイロとカラーセンサー値を算出してパケットに詰め込んでSimulinkへ送り返す。これを延々と繰り返します。仕掛けは簡単。
Unity_4
ざっくり図解すると、こんな感じ。3次元座標で頭の中がグリグリ回って大変でしたわ。モーターを回すのも実物のモータートルクを使わないと立たないし。カラーセンサーのRGB値は、カラーセンサーの向いている方向にあるコース上の絵柄を読み取ったり、コースでない物体に当たったときは、その表面の色から算出したり。ソナーも似たような方法。もっとベクトルを勉強しておけばよかったと後悔しきり。 大きさは1を1m、重さは1を1kgとして作り込んでいくと、見事に立つんですねぇ。 あと、反発係数はバウンドさせてみて適当な値にして、摩擦はネットで調べた値を元に、なんとなくな値を設定。
このシミュレーターのお陰で、レプリカコースを広げなくても手軽に実験できるし、EV3セットがなくても全員が試せる。実際に開発現場で起きている、試作機がまだ出来上がってこないとか、試作機台数が少なくて順番待ちとか、そういう問題の解決に同じ手法が使えるという実証実験みたいなもんです。 そして、接続がIPということは、このシミュレーターが地球の裏にあっても、接続して動くということ。 もし相手がUnityでなくて、世界に1台しかない超スーパーコンピューターであったとしても、同じ方式で実現できる、という利点があります。まさかね。
ただ、1つ、現状に欠点がありまして。シミュレーションスピードが遅いんです。シミュレーション内の1秒間を進めるのに、実際には7-8秒掛かる。このまったりとした時間がもったいない。ゆっくり時間が進むので、観察が楽という面もありますが、失敗を何回も微調整して繰り返す場合、ちょっと時間がもったいないかな。 でも、実機でパラメータをイジって、コンパイルして、EV3へ転送して、アプリ起動して、走行体をもって場所に移動して、スタートする。 よりかぜんぜん楽ですが。 時間を短縮しようと、EV3側からプラントモデルにアクセスするのは4ms周期だから、Unity側も4ms周期で動かして同期すれば、速度は4倍になる。 なんて試してみましたけど、1ミリ秒刻みでないと立たないんですわ。 途中の経過が大事なんですね。
Next2018
シミュレーションが自由にできるとなると、再現が難しいことも楽々でして。例えば、タイヤを大きくした走行体が9mm厚の板を走るのは、どれぐらい簡単か、とか。 階段の板の厚みを12mmに変更したら、どれぐらい難しくなるか、とか。 コースの図面にしても、試しにレイアウトしてみて画像が得られたら、張り替えるだけでOK。 なんか凄いね、来年の検討なんて楽勝ですわ。

Unityでプラントモデルを作ってMATLABと接続して動かす