【ライブラリ#1】 Nav2

共著：@erina_mori、@tainirigel、@ramuda25、@akira_hirota、@t-shioya

# はじめに
## 背景
本記事は、Space ROS Advent Calendar 2024の一つです。

https://qiita.com/advent-calendar/2024/space-ros

Space ROS Advent Calendar 2024の概要については、下記の記事をご参照ください。

https://qiita.com/YukiIkeda_robot/items/876fbfe976ab71c9a53e

Space ROSの説明については、Space ROS Advent Calendar 2024の記事で紹介されていますので、ご参照ください。
- [【概要#1】宇宙ロボットの背景を概観してみる](https://qiita.com/yuyuqq/items/ca7879b3c2df5244f836)
- [【概要#2】Space ROSの目的](https://qiita.com/yuyuqq/items/cbe07bfe8e8767c095f7)
- [【概要#3】Space ROSとROS 2の違い](https://qiita.com/YukiIkeda_robot/items/227380feca2e8c7e886d)
- [【概要#4】Space ROSのパッケージ構成](https://qiita.com/YukiIkeda_robot/items/a308615180a198979daa)
- [【概要#5】Space ROSのMars Roverデモ](https://qiita.com/YukiIkeda_robot/items/510e5073cfb66937eae5)

## 本記事の概要
ROSには自律移動に必要な機能が一通り実装されたNavigationパッケージというものが存在します。将来的に、このNavigationパッケージをSpace ROSに特化したNavigationパッケージ（SpaceNav）として実現できないか...と構想中です。
本記事ではその前編として、ROS2のNavigationパッケージであるNav2の概要およびパッケージ構成について、ROS1のNavigationパッケージとの比較を交えつつ紹介します。

# Nav2
## Navigation2 (Nav2)とは？
Navigation2 (Nav2)とは、自律移動に必要な機能が一通り実装されたROS2のパッケージ群​です。
ROS1の公式ナビゲーションパッケージであるNavigation StackをROS2用に再設計したものであり、以下のようなアップデートが入っています。

- BehaviorTree CPP V3を使ったビヘイビアツリー（BT）機能を標準搭載​
⇒状態管理機能がデフォルトで使える！​
- パッケージが多数追加され、アルゴリズムの選択肢が広がった​
⇒アプリケーションによって手法を選べる！​
- ROS2移行による恩恵（各ノードのLifecycleを管理できるようになった等）​
⇒研究用途から製品グレードに！

※概要を把握するには、YouTube【[The Marathon 2: A Navigation System (IROS 2020)](https://www.youtube.com/watch?v=QB7lOKp3ZDQ)】がおススメです。

## Nav2の機能＆特徴
Nav2には以下のような機能、特徴があります。ROS1 Nav Stackよりも機能が豊富な印象を受けます。
大きな特徴としては、動作手順が複雑なロボットもBehavior Treeで比較的簡単に動作シーケンスを組めるようになったことや、ROS2の恩恵を受けて各機能のライフサイクル管理がしやすくなったこと、などが挙げられます。


- マップのロード、管理、保存​
- 事前マップを用いた自己位置推定（マップ生成にSLAMを使うことが可能）
- 運動学的な実現性も考慮した経路生成が可能​
- 経路追従と障害物回避が可能な制御機能​
- パスの平滑化​
- センサデータを環境モデルに変換​
- **動作手順が複雑なロボットもBehavior Treeで実現​**
- **不慮の事象がおきたときのために事前定義した動作をさせることが可能​**
- シーケンシャルにWaypointに追従させる​ことが可能
- **各機能のライフサイクル管理＆サーバ監視（Watchdog Timer）​**
- 機能を動的に読み込むことが可能
- 生データのモニタリングが可能（人による監視）​
- Python3 APIあり
- 速度出力の平滑化機能

### 比較：ROS1 Navigation Stackの構造​
詳細は【[ROS1 Navigation公式](https://wiki.ros.org/navigation)】をご参照ください。
![ROS1 Navigation Stackの構造](https://wiki.ros.org/ja/navigation/Tutorials/RobotSetup?action=AttachFile&do=get&target=overview_tf_small.png)

### 比較：Nav2の構造
詳細は【[ROS2 Navigation公式](https://docs.nav2.org/)】をご参照ください。
![Nav2の構造](https://docs.nav2.org/_images/nav2_architecture.png)

#### Point 1: Behavior Tree(BT)標準搭載
第一のポイントとして、Nav2ではBehavior Treeが標準搭載されています。Nav2のBehavior Treeは有名どころのOSSであるBehaviorTreeCPP3を使って実装されています。
これにより、ロボットの動作シーケンス管理が一気に楽になりました。

これまでだと、ロボットの動作シーケンスはハードコーディングする必要がありました。結果、複雑な動作をさせたい場合にはすぐに条件分岐だらけになってしまい、バグの温床になりがち、という問題がありました。
一方Nav2では、Behavior Treeを使用することで動作シーケンスの管理効率を格段に向上させることが可能となります。


#### Point 2: 豊富なプラグイン
第二のポイントとして、プラグインがとても充実しています。
ControllerとPlannerだけでもこんなに種類があります。

##### Controller
| プラグイン名                  | 説明                                                                                                  |
|------------------------------|------------------------------------------------------------------------------------------------------|
| DWB Controller               | プラグインインターフェースを備えた高度に設定可能なDWA（動的ウィンドウアプローチ）の実装。                                                 |
| TEB Controller               | アッカーマン、差動、全方位ロボットに適したMPC（モデル予測制御）のようなコントローラ。                                                     |
| Regulated Pure Pursuit       | 適応機能を持つ純粋追従アルゴリズムのサービス/産業用ロボット向けバリエーション。                                                             |
| MPPI Controller              | モジュール化およびカスタムコスト関数を備え、さまざまなタスクを達成可能な予測MPCコントローラ。                                               |
| Rotation Shim Controller     | 経路追従前に経路の方向へ回転するための「シム」コントローラ。                                                                      |
| Graceful Controller          | スムーズな軌道を生成する姿勢追従制御則に基づいたコントローラ。                                                                        |
| Vector Pursuit Controller    | 高速かつ正確な経路追従に適したベクトル追従アルゴリズムに基づいたコントローラ。                                                          |

##### Planner
| プラグイン名                 | 説明                                                                                                                      |
|-----------------------------|--------------------------------------------------------------------------------------------------------------------------|
| NavFn Planner               | A*またはダイクストラ法を使用したナビゲーション関数で、2D全方位粒子を想定。                                                                                |
| SmacPlannerHybrid           | DubinまたはReeds-Shepp運動モデルを使用したSE2 Hybrid-A*の実装で、スムーズかつマルチ解像度クエリが可能。車両やアッカーマン車両に適応可能。                           |
| SmacPlanner2D               | 4または8方向接続の近傍を使用し、スムーズかつマルチ解像度クエリが可能な2D A*の実装。                                                                    |
| SmacPlannerLattice          | 事前生成された最小制御セットを使用する状態ラティスプランナーの実装で、アッカーマン車両、差動、全方位、脚付きロボットを含むさまざまな車両に対応可能。生成スクリプトを含む。        |
| ThetaStarPlanner            | 4または8方向接続の近傍を使用するTheta*の実装で、ロボットを2D全方位粒子として想定。                                                                            |

ROS1 Navigation Stackの場合、PlannerアルゴリズムはA*やDijkstraくらいしかなく、Controller (Local Planner)もDWAしかなかったので、とても充実していますね。

そのほか、ROS1とROS2のNavigationでは、以下のような違いもあるようです。
- 自律移動機能がサーバに分けて実装されている
- サーバ同士の通信はBT Navigator Serverを介して行われ、BTにステータス情報が集約される仕組み

# まとめ
本記事では、Space ROSの重要なライブラリの一つであるNav2の概要およびパッケージ構成についてまとめました。
Nav2は自律移動に必要な機能が一通り実装されたROS2のパッケージ群​であり、前身であるROS1 Navigation Stackと比較して、BehaviorTree機能の標準搭載やパッケージの充実、ROS2の恩恵によりこれまでの研究用途から製品用途への品質向上が見込めるなど、多くのメリットがあるパッケージとなっています。
将来的にはSpaceNavとしてSpace ROSでのNavigationが実現できると開発の幅も広がりますね！
SpaceNav構想については次回の記事【[【ライブラリ#2】 SpaceNav構想](https://qiita.com/tainirigel/items/f4126350e2170e34403b)】をご覧ください！