[Robot] VS-RC003(HV)による自律動作の考え方

先日の神戸で開催されたROBO-ONEにて、初めてAUTOが行われたワケなんだけど、たぶんアレ見て「自分も」って思ってる人は少なくないと思う。けど、今AUTOに参戦されてる方って結構ハイエンドな方が多いみたいで、早々真似できるってワケでもないと思う。

でも、実はもともと関西にはロボチャレンジという大会があり、もう何年も前から自律競技である「さがしてポン」が行われてきた。相手は単なるスチロールの球だけど、センサで相手を探して移動し、叩き落とすのは考え方としてはAUTOとそう変わらない。自律動作に関しては、実はすでにある程度のノウハウが存在するわけだ。

なので、ココでは既存のロボット用マイコン基板であるVS-RC003(HV)…以下、VSRC…とRobovieMaker 2…以下RM2…を使った自律の考え方について少しメモを残しておくコトにする。どなたかの参考になれば幸いである。なお、それぞれの基本的な使い方についてはすでに習得しているものとして記述するので、基本的な部分に関しては別途学習をお願いしたい。

●VSRCとRM2を使って自律を行うのに重要なポイント

VSRCとRM2にはちょっと独特な機能があって、これが自律を行うのに重要な意味を持つので、まずそれらを列挙してみる。

  • 変数…VSRCには変数の概念が存在する。初心者はあまり馴染みがないかもしれないが、ちょっと使い込むとすぐにこの概念が重要になってくる。実は自律を実装する上でも、この概念が非常に重要になる。なお、変数の一覧表はココにある。
  • アイドリングモーション…このモーションは「何もしない時に発動される」という仕掛けなのだが、これも自律を実装する上では非常に重要な存在になっている。
  • 操作マップV2…元々コントローラのボタンを押してモーションを発動することを前提としたV1に対し、V2ではモーションの発動条件がかなり多彩になっており、その中に「変数の値に一致すれば発動」という恐ろしく強力な仕組みが入っている。また、V2はリスト形式になっており、上から順番に発動条件を評価するようになっている。
  • 変数番号251…この変数は、元は読み出し専用だったのだが、実は書き込めるコトが判明し、今は資料にも書き込みOKになっている。この変数に1を書き込むと、全てのサーボがフリーから作動開始するようになっている。また、0で脱力するようになっている。

さて、RM2のマニュアルを見ると「オートデモ」という機能があるコトに気づく。電源を投入すると自動的に動作を開始する機能なのだが、実は自律競技をやる場合には、以下の三点の問題があり、お勧めできない。

  • 単一モーションファイルに全てを記述しなければならない
  • 電源投入後すぐに動作するので、試合開始のタイミングを取るのが難しい
  • 電源を切るまで動作してしまうので、一旦荒ぶってしまうと止めようがなくなる

なので、自律競技を実装する場合、操作マップV2を使って通常のバトルと同じようにリストにモーションを登録するという形をお勧めする。

●基本的な自律動作の考え方

この競技では、基本的にはセンサの値によって行動を決めるというのが基本的な流れになる。当然、その行動を決めるアルゴリズムをどこかに記述するコトになるのだが、これをアイドリングモーションの中に全て記述する。ただし、実際に機体を動かすコトは、このモーションでは一切行わない。単に立っているだけのポーズを一つ指定しておくだけである。

そして、ユーザが任意に使える汎用変数の一つ(例えば80番とか)を「行動指示変数」と考え、ここに、センサの値に基づいて判断した次の動作(前進とかターンとか)を指示する値を代入してアイドリングモーションを抜けるように記述しておく。もちろん、この値の意味づけは各自の自由だが、後述の操作マップV2の設定と合わせておく必要がある。また、0は後述する理由のために、空けておく。

操作マップV2は、先にも書いたがコンントローラのボタンの代わりに変数の値に沿って起動するモーションを決定するコトができる。ここで必要なモーションを登録する時に、上記の「行動指示変数」の値との一致で発動するようにセットしておくと、アイドリングモーションで決定されたモーションが発動するコトになる。

ただし、そのままではそのモーションが終わった時にまた操作マップV2のリストの最初から評価され、再度同じモーションが発動してしまうので、各モーションの最後で「行動指示変数」に0を代入してクリアしておく必要がある。そうすることで、またアイドリングモーションに戻ってくるワケである。指示値で0を使わないようにするのは、このためである。

センサの値をいつ読むかという問題に関しては、アイドリングモーションの中で読んでも良いし、何らかのモーションの途中で読んだ値を任意の汎用変数(「行動指示変数」以外のどれか)に代入しておいて、後でアイドリングモーションでその汎用変数を読み出して確認してもよい。

これを繰り返すコトで、ある時はセンサの値を元に移動方向を決め、ある時はリングから落ちないように回避し、ある時は相手がいないので移動し、ある時はパンチなり攻撃を繰り出すという動作を行うコトが可能になる。転倒した場合も、アイドリングモーションの冒頭で加速度センサの値等を確認するコトでそれを検知し、起き上がりモーションを発動する指示を「行動指示変数」に書き込めばイイわけだ。無論、操作マップV2にはそれに対応する起き上がりモーションが登録されており、当該設定値で発動するようにセットされている必要があるが。

また、すでにお気づきかと思うが、実際に動作させるモーションは通常のバトル等で使っているファイルをそのまま流用できる。末尾に「行動指示変数」クリアのための記述を一つ追加するだけだ。なので、動作のソレゾレに関しては別々のファイルだし、独立して調整できるし、バトル用と共用にできるので、作業に無駄がなくなる。1ファイルに全てを記述しなければならないシステムでは、こうはいかない。

●さらに追加としていくつか…あと危険回避の方法も

上記の実装を行い、ロボットの電源を入れても、実はそのままでは動作しない。なぜなら、当然ではあるがセレクト=スタートしてないので、脱力したままだからである。かといって、任意のタイミングでセレクト=スタートを行うと、内部的に自律動作してる途中で動作を開始してしまうコトになる。これは危ない。

かといって、アイドリングモーションの冒頭で変数251に1を代入してしまうと、今度は荒ぶった時にいくらセレクト=スタートしても、またアイドリングモーションで作動開始してしまい、いつまでたっても止めることができなくなる。

この問題を回避するためには、マップ移行機能を使うのがお勧めだ。

もともと4つのマップが実装できるようになっていて、デフォルトで起動するのは<00>のマップなので、そのマップはアイドリングモーションとして普通に立っているだけのモーションを設定しておく。で、例えば<01>のマップに上記の自律を実装しておく。

そうすれば、起動時には立っているだけのモーションなので、この段階でセレクト=スタートを行い、リングの上に立たせるコトができる。ついで、ファイトのコールでマップ切り替え操作を行えば、後は勝手に自律で動作を開始するというワケだ。

また、汎用変数の値が起動時に不定である可能性も考え、<00>のマップのアイドリングモーションにおいて、「行動指示変数」に0を代入してクリアしておくこともお勧めする。

無論、操作マップV2では任意の操作でマップ切り替えが可能なので、そこをどう設定しておくのかは各自の設定に依存する。重要なのは、自律のマップをデフォルトにしないコトだ。

なお、危険回避のため非常時に停止させるために、コントローラの何らかの操作で変数251番に0を書き込み、脱力させる仕掛けを仕込んでおくことも重要だと思う。

取り急ぎ、ざっくりと書いてみた。なにか追加すべきコトがあれば、おいおい追記していこうと思う。

Zak について

基本的にヲタクです。いや、別に萌えとかいうのではなく、ハマるとトコトン進めようとする癖があるので、自制が必要だという…。
カテゴリー: なんか作る, ロボット パーマリンク