MATLAB/SimulinkでETロボコンに出場する:拡張性が高いアーキテクチャ

ETロボコンって、設計して実装してテストすると、大概、途中で機能が足りないことが分かるもんです。このA方式より、こんなB方式のほうがいいんじゃね? なんてね。 なので、途中の機能アップの拡張性がないと、あとでグチャグチャに。 そこで、どこの段階が一番手が入るかというと、コースを区間に区切って、条件によって制御を切り替えて、次の区間に移って、の部分の条件(ジャッジ)と制御(アクション)  これについては、むかしむかしJudge & Actionアーキテクチャで解決したことがあるので、いまでもそれを流用してます。
Jaarch
図解するとこうなります。
1. 茶色のシナリオ管理は「この条件が成立したら、この制御をやる」という1つのシナリオを取り出して、 青いジャッジグループに「こんな条件は成立したか?」 と発信します。誰となく指名することなしに。
2. そうすると、青いジャッジAからジャッジCの全員が、そのメッセージを受け取るわけですが、自分の知らない条件を判定しろと言われても無理。 そういうときは無視します。
3. ところが、ジャッジBは「この判定なら俺の役目だから判定してやろう」 と違う動きをして、もし、判定結果がOKなら、ジャッジグループに1個だけある、条件成立の旗を立てます。1個しかないですからね。
4. シナリオ管理は、条件成立の旗を見てて、なにも立たなければ、次のタイミングでもう一度同じことを繰り返します。 もし条件成立の旗が立っていたら、それを下ろしておいて、今度はアクショングループに「こんな制御して」と発信します。
5. アクションDからアクションFは、それぞれ同じメッセージを受け取るわけですが、「おれ、そんなこと言われても知らない」という人もいれば、「それできるわ、やるね!」という人もいます。 普通、それは一人だけ。
6. そして制御が実行され、また次のタイミングになって、シナリオ管理は次のシナリオを取り出して、同じことを続けるわけです。
さて、ここで新しく条件判定を追加したいとします。ジャッジGはその他のジャッジと同じ形をしているんですが、誰も判定してくれない新しい条件判定ができます。 これをジャッジグループに追加します。 あとは何も構造を変更することなしに機能拡張が完了。 これがジャッジ & アクションアーキテクチャです。 水中ロボットのハコフグちゃんにも、ETロボコンで作った仕組みそのままを移植して、水中ロボット用のジャッジとアクションに入れ替えました。 また、シナリオを図で作成できる仕組みも、中身を入れ替えて再利用。 意外と、いろんな場面で使える仕組みです。
それで、今回の巨匠チームにも、もちろん、このアーキテクチャを使いました。それをSimulinkで作るにはどうするか?ということです。 しかし、もともと、BricRoboで作るように考えた構造なので、Simulinkでも特に難しくもなく。
Ja2
前回も出てきた心臓部の部分、ここに3色で囲んだ部分が、説明のシナリオ管理、ジャッジグループ、アクショングループに相当します。
Judge
ジャッジグループの中身はこんな感じになってます。1つの線が分かれて複数につながる、という書き方はデーターフロー的な設計の良いところです。BricRoboも同じですけどね。シミュレーションができないだけで。
Action
アクショングループもこんな感じになってます。ただ、ここでは実際の制御をするわけでなく、シャシー側に用意されている制御ブロックに対して、さらに制御命令を出す、という構造になってますが、アーキテクチャ的には一緒です。
いつも、テキスト言語を先に書き出して、大きな構造を見つけられなくて、困っている人も多いんじゃないですかね。図形言語は形が綺麗だと、大抵、筋がいいので、慣れると楽です。