Navigation2 に関する所感 - myamazum/private-tips GitHub Wiki
公式ページの要約
Nav2 より引用
新しく追加された機能(Galacticで大きく変更された機能を太字で示す。)
- Build complicated robot behaviors using behavior trees (Nav2 Behavior Trees and BT Navigator)
- Follow sequential waypoints (Nav2 Waypoint Follower)
- Manage the lifecycle and watchdog for the servers (Nav2 Lifecycle Manager)
従来からある機能(Updateについては後述)
- load, serve, and store maps (Map Server)
- localize the robot on the map (AMCL)
- plan a path from A to B around obstacles (Nav2 Planner)
- control the robot as it follows the path (Nav2 Controller)
- convert sensor data into a costmap representation of the world (Nav2 Costmap 2D)
- Compute recovery behaviors in case of failure (Nav2 Recoveries)
smachの開発は closed になり、状態機械の候補として BT tree が上がっている。
It uses Behavior Trees to make it possible to have more complex state machines and to add in recovery behaviors as additional Action Servers. These behavior trees are configurable XMLs and we provide several starting examples.
BT treeは、厳密には状態機械ではなく、Behavior Tree というゲームのAIを記述するための記法である。 thinkit, 2016
ステート・マシンは状態の数が増えると膨大な数の状態遷移を定義しなければならず、蜘蛛の巣のように複雑さを増してしまいます。そこで、「ビヘイビア・ツリー(Behavior Tree)」が登場します。 ステート・マシンが循環的なグラフを構成するのに対し、ビヘイビア・ツリーは文字通り「非循環のツリー状」のグラフ、つまり一方向のツリーグラフを構成します。そして、階層的な層を形成しながら末端に向かいます。なお、ここで言う層とは「同じ階層のノードが集まったグループ」です。 シークエンスはアクティブ・ノードのみを対象にその層のノードを順番に実行し、プライオリティはアクティブ・ノード内で最も優先度の高いノードを実行します。
BTは、一方向のツリーであり、Hierarchical Paradigmを現代風に再設計したアーキテクチャと推察される。こちらは、Navigation 2のSubsumption Modelの階層の上位に適用することで、Hybrid Paradigmが構成される。 (なお、Subsumption ModelはReactive Paradigmを発展させたとする定義に従う[自律ロボット概論]。)
一方、Reactive Paradigmの特性を残した設計が必要な場合、純粋な状態機械の機能を残しているSmaccやPacML2を導入する必要がある。 Smaccは、ベンチャー起業が開発しているパッケージでソフトウェアは充実しているが、保守の継続性に課題がある。 PachMLは、ROS-Industrialにおける状態機械のパッケージ候補の一つで開発の進捗は不明である。github
2D Navigation の変更点
細かな変更はROS to ROS 2 Navigationを参照
Sample Program の実行
ROS1からの移植はTurtlebot3があるが、ROS2の新機能を試す場合は、Simple Commander Naviが良さそうである。
move_base から behavior treeへの変更
ROS1 のnavigationは move_baseで 認識(Costmap)と行動(Planner, Recovery)の役割を静的に定めて処理していた。 行動は、定常処理(Planner)と非定常処理(Recovery)が独立して動作し、2つの切分けは認識(Costmap)で処理している。 そのため、非定常処理は認識系の初回化あるいは特殊な指令値をControllerに送るなど簡易的な動作しかできなかった。
Behavior Treeは、定常処理と非定常処理を枝状に分岐させて定義できる。
推奨される構成を下記に示す。