二足歩行ロボット研修二足歩行ロボット研修(kora編)

二足歩行ロボット研修(kora編)[24] Behavior Treeを使ったロボットの行動計画について

こんにちは。koraです。

今回は、ロボットの行動計画について書きたいと思います。

ロボットの行動計画

この二足研修のゴールは、Humanoid Autonomous Challenge(通称 HAC)に出場して完走することです。この競技では、ロボットはボールを探したり、フィールドから落ちないように歩行したり、スタート地点に戻ったり、といったタスクをこなすことになります。

これらのタスクを達成するためには、どういった行動を選択すればいいのか自律的に判断する仕組みが必要です。

ステートマシン

自律ロボットの行動計画にはいくつかの手法があります。ステートマシンはその代表的なもので、状態遷移によってタスクの切り替えを実現できます。

ステートマシンは直感的で分かりやすく、実装しやすい(if文やswitch文でもできる)という利点があります。例えば、ボールに触れてスタート地点に戻るというロボットの行動計画を状態遷移図で表すと次の様になります。

しかし、状態の数が増えると状態同士の依存関係が増えるため、規模の大きいシステムでは状態の管理が難しくなるという問題もあります。さきほどの状態遷移図に、フィールドから落ちないようにする状態を追加するだけでも目に見えて複雑になります。

なお、そんな従来のステートマシンの欠点を補う手法として、階層型ステートマシンというものもあります。適切に状態を階層化すれば、状態遷移の複雑さを抑えながらシステムを開発することができます。

HAC の競技はそこまで複雑ではないので、上記の手法で行動計画を実装できると思います。ですがせっかくの研修ですので、今回はより新しい手法の Behavior Tree を使ってみたいと思います。

Behavior Tree

Behavior Tree は、もともとゲーム内のノンプレイヤーキャラクターの行動をコントロールする用途で発展した技術*1ですが、ロボット分野にも利用されています*2。

さきほどの状態遷移図を Behavior Tree で書き直すと、次のようになります。

Behavior Tree はその名の通り、行動をツリーで表します。枝の先端のノード (Execution node/Task node/Leaf node) が行動や条件を記述し、枝の分かれ目のノード (Control flow node/Composite node) が行動の切り替えを担います。

Behavior Tree の特徴のひとつは、tick と呼ばれる更新処理が周期的に走ることです。tick は木の根元(Root node)からスタートし、Control flow node の仕組みに従って順に子ノードに伝わります。tick が届いた Execution node は条件を評価したり具体的な行動を実行したりして、その結果が成功であれば Success、失敗であれば Failure、実行途中であれば Running を親ノードに返します。

Control flow node で基本となるのは Sequence (上図の「→」) と Fallback/Selector (上図の「?」) です。これらは子ノードの返す Success/Failure/Running によって挙動が変わります。

  • Fallback 「?」 は子ノードのうちひとつを実行します。左から評価し、子ノードのうちひとつでも Success を返した場合は Success を、Running を返した場合は Running を親ノードに返します。全ての子ノードが Failure を返した場合は Failure を親ノードに返します。
  • Sequence 「→」は子ノードを順番に実行します。左から評価し、子ノードのうちひとつでも Running を返した場合は Running を、ひとつでも Failure を返した場合は Failure を親ノードに返します。全ての子ノードが Success を返した場合は Success を親ノードに返します。

他にも、繰り返しや成否の反転などを担う Decorator と呼ばれるノードや、並列処理を可能にする Parallel と呼ばれるノードもあります。もっとも、世の中の Behavior Tree の実装が全てここで述べたようになっているわけではなく、一部の機能が省略されていたり、あるいはもっと便利な機能が追加されていたりします。

ROS から利用できるオープンソースのライブラリには BehaviorTree.CPP があります。次回は、これを使って実際に Behavior Tree を作ってみたいと思います。

参考文献

タイトルとURLをコピーしました