MATLAB/SimulinkでETロボコンに出場する:シナリオで振る舞う心臓部

大体ですねぇ、ETロボコンに出場するシステムを見ていると、多かれ少なかれ、走るコースを区間に分けたり、難所を渡っていくシーンを分割したりして、分割した1つの区間について、どのようなアクションを実施したり、どんなジャッジが成立したら、次の区間へ遷移するか、という仕組みが入っているわけです。 そりゃモデルシート見ると明らか。 昔、水中ロボコンに出場したハコフグちゃんにも、2010年あたりにETロボコン用に開発した仕組みが移植され、それでシナリオ通りにロボットを動かしていました。
Driver
もちろん、この巨匠チームのMATLAB/Simulinkモデルにも、その部分があります。 いろんなことができるのは、この心臓部があるからでして。それが、ここです。 大きく4つの部分に分かれています。 左下の肌色の部分、これがステートマシン図です。 はい、図そのもの。 MATLAB/Simulinkとこれまで言ってますが、Stateflowという状態遷移のブロックが作れるアドインも一緒に使ってます。 Simulinkは四角いブロックの左からデータが入ってきて、ブロックの中で演算して、右側から出ていく、というデータフロー的な設計しかできません。 状態を表すところはStateflowのChartというブロックを使って設計します。中にはステートマシン図が入っていて、Chartの外から入ってきた信号を値として参照したりイベントとして扱ったりし、それによってい状態遷移を起こしたり演算したりして、その過程でデータが変化したりイベントが発生したりして、Chartの外に信号として出ていきます。 この入出力の信号とSimulinkのブロックを繋げて、Simulinkブロックの振る舞いを変えていくという方式。 なるほどねぇ。 みんなステートマシン図って書くことはあるけど、 その振る舞いをどうやって他と結びつけるか、まではあまり考えていないと思うんですよ。 いい勉強になるわ。
Chart
このChartを開くと、さらに2つのChartが入ってます。左側がロボット全体の状態を制御します。右側は実行するシナリオを1つ1つ駆動します。 この2つのChartが同時に並列動作していて、左側で人間がボタン操作すると走行を開始したり止めたり、シナリををBluetoothで受信したり、いろいろ操作します。 その状態遷移の過程でイベントが発生し、右側のChartに伝えられ、シナリオ実行を開始したり止めたりします。 このステートマシン図、そのまま動くのがStateflowのいいところ。 シミュレーション中に開くと、現在アクティブな状態は青線で囲まれて、遷移している様子が見れます。 すげー。 ステートマシン図って、書いたことはあっても、実際に動いている様子って、見たことある人は少ないでしょ。 見たことないと、このステートマシン図みても、タダの図であって、実際に動くようにするには、C言語のSwitch文とかで実装してやらないとダメとか思ってるでしょ。 ざんね~ん。このまま動きます。

じゃ、シミュレーション中に動いているのを録画してみましょう。分かりやすくするために、Chartのアニメーション速度は低速にしてあります。左側はステートマシン図、右上はUnity、右下はダッシュボード。シミュレーションを開始すると左側に青い囲みが現れて、状態遷移が起こっているのがわかります。シナリオが進むと右上のEV3の尻尾が降りてきます。 ここで動かないようにロックしているのをほどいて(尻尾が降りてくるまで手で抑えることができないので) タッチセンサーのボタンを押すと、尻尾が上がり始めて走行体が走り始めます。 すぐに中止(BACK)ボタンを押して止めます。 LEFTボタンを押すと動的シナリオモードになり、そのときDOWNボタンを押すとBluetoothからの受信待ちになります。 ENTERは受信したのをすぐにスタートするわけですが、なにも受信してないので動きません。RIGHTボタンを押すと、静的シナリオモードになり、コンパイル時に取り込まれたシナリオを実行するモードになります。 なんか、MATLABって凄いわ。
あと、最初の図にもどりますが、真ん中のScenarioCtlGrpが静的シナリオを保持していたり、受信した動的シナリオをバッファに溜めたりして、1回駆動するたびに、シナリオを1行、送り出します。 右上のJudgeCtlは、センサーから入ってきた情報を元に、条件を判定して、成立したかどうかを教えてくれます。 右下のActionCtrlはシナリオの1行で実施するアクション=処理を分類して、操作する内容を送り出します。 この4つ全体でDriverというブロックなのは、人間が自動車のインパネを見ながら、判断して、ハンドルとアクセルを操作する、というモデルに似せています。 実際に自動車を走らせる部分は、DriverのとなりにあるChassisブロックが担当。
こんな具合に、このモデルは動いているわけで、心臓部なわけです。 そういや、久々のモデル審査で、ステートマシン図で書け! というお題に、「それ、アクティビティ図でいいんじゃね?」的なモデルシートがたくさんありましたよねぇ。無理矢理感満載(笑)