【ライブラリ#2】 SpaceNav構想

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

# はじめに
前の記事で紹介した通り、Nav2は地上のロボット、特に地上移動型ロボットへの適用に主眼を置いて設計されたナビゲーション統合パッケージです。
ROS1でもROS Navigation Stackと呼ばれる公式ナビゲーションパッケージが提供されていましたが、Nav2はこのパッケージをさらにROS2用に再設計したものとなっています。加えて、ざっくり以下のようなアップデートが施されています。

1. [BehaviorTree.CPP](https://www.behaviortree.dev/)を使ったビヘイビアツリー（BT）機能を標準搭載
2. パッケージを多数追加。アルゴリズムがいろいろ選べるようになった。
3. ROS2移行による恩恵（各ノードのLifecycleを管理できるようになった、等々）

もっと細かく知りたい方はぜひこちらの記事をご参照ください。

https://qiita.com/erina_mori/items/65c137670c6ed3ab8e41

本編では、Nav2の機能・設計思想を踏まえた上で、宇宙用のナビゲーションパッケージを実現するとしたらどんなものになるのかを考えた結果をまとめてみたいと思います。

## ちょっと用語の確認：ナビゲーションって？
ロボティクス界隈でナビゲーションと言えば、大抵はロボットをとある状態からとある状態まで遷移させるための機能、すなわち動作計画・経路計画 （Planning）や制御（Control）あたりの機能を指すことが多いだろう、と個人的には思います。
もちろん障害物の存在する環境では、動的に経路計画を行う目的で障害物検知を行う必要があるでしょうし、そうなるとSLAMによるMappingもナビゲーションに含まれるのでは？など境界はまちまちです。
とはいえ前述したように、基本的にはPlanning&Controlを指してナビゲーションと言っているのだと思います。

一方で、宇宙業界においてナビゲーションとは「航法」と訳されます。つまりロボティクスで言うところの、自己位置推定 (Localization)や環境認識 (Perception)に近いニュアンスですので、だいぶ意味が変わってきます。
それなら宇宙ロボットはどうなのか・・・宇宙業界側の定義を使う人が多い気がしますが、ぜひ注意しながら会話してみてください笑

> 宇宙分野ではこの手の話をするときに、航法（Navigation）・誘導（Guidance）・制御（Control）という用語を使います。Guidanceがロボット界隈でのPlanningと同じような意味です。

ここではNav2の宇宙版という話をしたいので、以降では地上ロボット界隈の意味合いでナビゲーションという用語を用います。

![nav_definition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365030/842049c5-e902-827d-f94b-48f6a6657e07.png)


# Space Navに求められること
そもそもSpace ROSの特徴としては以下のようなものがありました。

1. **宇宙品質を保証するためのコード解析ツール**
    - 宇宙品質とは具体的に？
        - NASA Software Engineering Requirements (NPR 7150.2)
        - 航空機搭載ソフトウェアの開発ガイドライン (DO-178C)
    - CobraやIKOSといった静的解析ツール （developed by NASA）をサポート．これらツールを使ったコード検証を行いやすくしている
1. **要求仕様の管理ツール**
    - 宇宙用コンポーネントはHardware/Software問わずI/Fがとても多く，I/Fごとに設定される要求仕様も膨大になりがち
    ➡これを適切に管理するためのツールが整備されている
1. **宇宙ミッション固有の機能**
    - 宇宙用RTOS上で動作する環境の整備
    - シミュレーションアセット（宇宙ローバ，ペリフェラル，etc…）
    - 宇宙機用Flight software framework（cFS: core Flight System）のROS 2対応


まず、ROS2自体がネットワーク品質を高めたり、リアルタイム対応を目指したりなど、実製品への適用ができるように現在進行形で開発が進められています。
そのため、通信部などの基本機能についてはROS2側の発展に期待して、Space ROS側で独自の改修を行ってはいません。その代わり、**機能を追加して積み上げていくというアプローチ**をとっています。

さて、このような背景を考えると、宇宙用のNav2（Space Nav）としてはやはりSpace ROSの思想を引き継いで、次のような機能が必要になると思います。

### 1. コード解析ツールのサポート
ちょっとお堅い話になってしまいますが、Space ROS本体と同様、CobraやIKOSといった静的解析ツールをサポートする必要性は出てくるかなと思います。
過酷な宇宙環境で動作させる、一発勝負のミッション（さらに莫大な費用・・！）であることを考えれば、この手の作りこみは必須になります。

### 2. 要求仕様管理ツールのサポート
こちらもSpace ROSと同様です。要求仕様の達成/未達成を判別するツールをサポートする必要があります。
加えて要求仕様というのはナビゲーション単体で設定されているもの以外にも、他のシステムと相互的に生じるものがあります。
したがって、Space Nav以外のROSパッケージと統合して判定できるように、インターフェースを標準化しておくなどが必要になりそうです。

### 3. 宇宙ミッション固有の機能を追加
これまでと比べて楽しい話です笑
宇宙ミッション版の機能ということで、ざっと考えてみると以下のような機能追加があると便利ではないかと思いました。

#### 宇宙用組み込みシステムへの対応
自律移動システムのナビゲーション機能はリッチな計算資源をフル活用して動作するような、高級なものが多いと思います。
一方で宇宙システムに使われるオンボードコンピュータは、地上品と比べてパフォーマンスがはるかに低いため、軽量なナビゲーション機能をプリセットとして提供されていると嬉しいのではないでしょうか。

#### 宇宙機/宇宙ロボット特有のナビゲーション機能
ここでは宇宙用のナビゲーションプラグインとしてざっくり構想を書いてみようと思います。
[Nav2公式サイトのプラグイン一覧](https://docs.nav2.org/plugins/index.html)を見てみると、例えばプランナは以下が実装されているようでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365030/59d4e16a-0112-922b-a233-671be7b24f60.png)

パッと見る感じだとA*やState Lattice Plannerの派生がメインのようですね。
Ground vehicleを想定しているためでしょう、2D用しか今はないようです。
そもそもNav2は自分たち独自のPluginを組み込んでいってね、という設計思想だと思うので、ドローン用のプランナが欲しいとなったら自分で開発するのがよいでしょう。
ただSpace ROSの適用先として人工衛星だったり、[Int-Ball2](https://humans-in-space.jaxa.jp/biz-lab/case/detail/004150.html)のようなFree Flying型ロボットを想定するならば、Space Navでは3Dのプランナを提供する必要があると思います。

続いて制御のプラグインを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365030/d460430a-3d6a-5cc2-367f-72fd7ce12a56.png)

DWA、MPC、Pure pursuit等、有名どころのアルゴリズムの名前が見られますね。
プランナの時と議論は大体同じだと思います。

Behavior関連のプラグインはいっぱいありすぎるので一部だけ抜粋して載せておきます。
Behavior Treeのような動作を規定するツールは宇宙ロボットにおいても大変有用だと思います。
宇宙システムはメンテナンスできない一発勝負という事もあって詳細に作りこむので、動作が複雑になりがちです。

似たような概念として、ほとんどの宇宙システムにはFDIR (Fault Detection, Isolation and Recovery)と呼ばれる、異常発生時に検知・診断・復帰といった一連動作を自動で実行する仕組みが組み込まれています。
このような宇宙分野でよく使われている自律機能もBehaviorとして組み込めればいいのではないかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365030/be384665-067a-05dd-7aaf-06ddea2151fe.png)


#### 宇宙用データフォーマットへの変換機能
ナビゲーションというよりはSpace ROS本体の話に近いかもしれませんが、rosbag（あるいは直接ROSトピックを）を宇宙用データフォーマットに変換するというのも有用だと思います。

例えば宇宙科学データを管理するための標準的なファイル形式として、[SPICEカーネル](https://naif.jpl.nasa.gov/naif/data.html)と呼ばれるものがあります。
SPICEカーネルを解析するツールは大量に存在するので、こういった資源も活用できるとイチからROS対応させる必要がなくて良いと思います。

# まとめ
ROS2公式が提供しているNav2と、Space ROSの構想をもとにして、宇宙用ナビゲーションパッケージとしてどんな検討が必要になりそうかをアイデア出ししてみました。
皆さんも何かアイデアあれば、ぜひ一緒に議論していきましょう！