OUXT Polaris：ROS2を活用した自作自律航行船NavigationSystem概要⛵🌊

# OUXT Polaris：ROS2を活用した自作自律航行船NavigationSystem概要⛵🌊

### 御礼
皆様、ROS2のアドカレにご興味をお持ち頂きありがとうございます！
誠に恐縮ながら、2022/12/1の投稿をさせて頂きます！
楽しんで頂けると幸いです！
投稿者：Twitter: https://twitter.com/MeRTcooking 


## 本記事のあらすじ
学生主体のロボコンチームである[OUXT Polaris](https://www.ouxt.jp/)が挑戦している[Maritime RobotX Challenge](https://robotx.org/programs/robotx-challenge-2022/)について説明し、
その後、ROS2を活用した自律航行船Navigation Systemの概要について説明します。
ソフトウェアだけ気になる方は、読み飛ばしてください！
### 目次
- [OUXT Polaris](https://www.ouxt.jp/)とは？
- [Maritime RobotX Challenge](https://robotx.org/programs/robotx-challenge-2022/)とは？
- [OUXT Polaris](https://www.ouxt.jp/) ：ROS2を活用した自律航行船Navigation Systemの概要
## [OUXT Polaris](https://www.ouxt.jp/)とは？
### 学生主体の日本唯一のチーム
[OUXT Polaris](https://www.ouxt.jp/)は国際的な自律航行船のロボットコンテストである[Maritime RobotX Challenge](https://robotx.org/programs/robotx-challenge-2022/)へむけて結成された、学生と社会人混合の学生主体のロボコンチームです。
[OUXT Polaris](https://www.ouxt.jp/)では大会初開催の2014年から毎回出場している日本で唯一のチームです。
それぞれのチームは制御機器、制御系、センサー、さらにそのアルゴリズム等を開発し、それらを WAM-Vという普通自動車くらいの大きさの船体に搭載して大会に出場します。

### WAM-V 
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/e3ed1fd6-f6e6-c4ab-acb2-fe5e759ed47f.png">

### メンバー内訳
- 学生　（全国各地の大学生や高専生の有志があつまり結成。起源は関西の大阪。）
- 社会人 （ハードウェアやソフトウエアの豊富な知見や経験を持ったエンジニア・研究者が学生をサポート）

↓メンバー生息地

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/53e6c139-4d42-df34-ec7c-2c5dcfdbc120.png">

## [Maritime RobotX Challenge](https://robotx.org/programs/robotx-challenge-2022/)とは？

### 概要
- WAM-V(ボートサイズの船舶)をカスタムした自律船と自律ドローンを用いて各種タスクの達成度合いを競う国際ロボコンです。
- 競技は完全自律で行われ、競技開始遠隔操作は緊急停止のみ許可されます。
- 実機動作に加えてプレゼンテーション、論文審査なども行われます。

### OUXT Polaris もMaritime RobotX Challenge2022@オーストラリアにいってきました！

感染症の影響で開発ができなかったり、金銭面が乏しく、、、全メンバーは現地参加できませんでしたが、、、
2022年大会では、実際に学生でありリーダーである岡本君が、
オーストラリアでプレゼンテーション＆タスク成功を達成しました！

☆成果
- タスク達成（HartBeats Task）
- RobotX Fearless Award 受賞

以下は岡本君が現地参加している様子です。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We are OUXT-Polaris <a href="https://t.co/iyLG45U5Dx">pic.twitter.com/iyLG45U5Dx</a></p>&mdash; 岡太 (@kntokmt23) <a href="https://twitter.com/kntokmt23/status/1594693553061756929?ref_src=twsrc%5Etfw">November 21, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


↑の黄色い人服の達は[EMBRY-RIDDLE AERONAUTICAL UNIVERSITY'S TEAM のメンバー](http://www.eraurobotx.org/)で、2022年度優勝したチームです！以下動画も良ければご覧ください！ ERAU Team Minionと楽しそうなチームです！

<iframe width="560" height="315" src="https://www.youtube.com/embed/Jva8IJn-pUs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



### 大会のタスク紹介
簡単にですが図でタスクを紹介します。詳細はリンクをご覧ください！
### ☆Entrance and Exit Gates


<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/00004002-2128-17ba-8551-c796fc47b546.png">

出典：RoboNation, 2022 Maritime RobotX Challenge Task Ideas, https://robonation.org/app/uploads/sites/2/2021/02/2022-RobotX-Task-Ideas.pdf

### ☆ Follow the Path
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/5f15d46e-2352-765e-f627-27ea6bf03a75.png">

出典：RoboNation, 2022 Maritime RobotX Challenge Task Ideas, https://robonation.org/app/uploads/sites/2/2021/02/2022-RobotX-Task-Ideas.pdf

### ☆Wildlife Encounter and Avoid
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/8f631011-8d42-855c-41d4-29161a2ca94b.png">

出典：RoboNation, 2022 Maritime RobotX Challenge Task Ideas, https://robonation.org/app/uploads/sites/2/2021/02/2022-RobotX-Task-Ideas.pdf

### ☆ Scan the Code
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/aa954b82-d6d7-2784-a54d-df8e85044dba.png">


出典：RoboNation, 2022 Maritime RobotX Challenge Task Ideas, https://robonation.org/app/uploads/sites/2/2021/02/2022-RobotX-Task-Ideas.pdf

### ☆ Dock and Deliver
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/757ee1e5-15ec-7226-cca0-1b31b31160be.png">

出典：RoboNation, 2022 Maritime RobotX Challenge Task Ideas, https://robonation.org/app/uploads/sites/2/2021/02/2022-RobotX-Task-Ideas.pdf

### ☆UAV Task
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/bdce5a49-ef3e-55e1-976b-06a8e7503fdf.png">


出典：RoboNation, 2022 Maritime RobotX Challenge Task Ideas, https://robonation.org/app/uploads/sites/2/2021/02/2022-RobotX-Task-Ideas.pdf

### ☆ Obstacle Avoidance
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/f893e855-373d-5dd5-c235-6960618e196b.png">



出典：RoboNation, 2022 Maritime RobotX Challenge Task Ideas, https://robonation.org/app/uploads/sites/2/2021/02/2022-RobotX-Task-Ideas.pdf

## ROS2を活用した自律航行船Navigation Systemの概要
さて本題です！！！おまたせしました！
ROS2を活用した自律航行船Navigation Systemの概要について説明していきます。

 **!!!!!!百聞は一見にしかずということで...!!!!!!**
こんな感じで動作している自律航行船Navigation Systemについてお話します！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【OUXT:自律航行船デモ🚢】<br>実際に動かしてみた。これはすごい。。。<a href="https://twitter.com/hashtag/MeRT%E3%81%AE%E9%80%B2%E6%8D%97%E9%80%B2%E6%8D%97?src=hash&amp;ref_src=twsrc%5Etfw">#MeRTの進捗進捗</a> <a href="https://twitter.com/hashtag/ROS?src=hash&amp;ref_src=twsrc%5Etfw">#ROS</a> <a href="https://t.co/NPoFODhhMO">pic.twitter.com/NPoFODhhMO</a></p>&mdash; るっと🐨 Ph.D. 🤖 (@MeRTcooking) <a href="https://twitter.com/MeRTcooking/status/1573930376099426304?ref_src=twsrc%5Etfw">September 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## アーキテクチャ
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/90e7eb7c-8aa9-e14a-04c6-76709cd4d98a.png">

図のように、Navigation SystemはROS2を採用しています！
本アーキテクチャの特徴を以下に記載します。

- ROS2を活用した分散型モジュール。
- 汎用的なシステム設計
    - 陸上、車輪型ロボットでも動作実績あり。
    - チームメンバーには他のロボット競技に出場している人たちが多数在籍しているので、他のロボット競技にも部品取りや転用が可能なソフトウェア基盤を目指して開発しています。
- 認識：カメラとLidarによるLate Fusion方式に基づいた認識技術。
- 自己位置推定 ：拡張カルマンフィルタ(Extended Kalman Filter)による自己位置推定。
- 行動計画：behavior tree による行動表現。
- 経路計画：複数のplannerによる安全性を意識した経路計画。
- 制御：ros2_controlを採用。
- CI/CD：ソフトウェアのテスト  github action等。

## ROS2
OUXT PolarisでがROS2を活用したNavigation Systemを開発しています。
ROS2(Robot Operating System)はロボット・アプリケーション作成を支援するライブラリやツールを提供しています。
- 可視化ツールRviz
- メッセージ通信
- ハードウェア抽象化
- デバイスドライバ

これらはオープンソースのApache 2.0ライセンスとなっています。

## 汎用的なシステム設計
アーキテクチャの図のように、開発しているNavigation Systemは自律航行船に向けて作成していますが、、、陸上で動作する車輪型ロボットにおいてもシステムを少し変更するだけで、適用可能としています。
様々な環境下でシステムを運用していくことで、知見や経験をチーム内で共有可能となります。

実際に中之島チャレンジにおいても採用されております。

![Screenshot from 2022-11-30 16-25-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/666937c5-cc99-d3ba-ffd1-11c4250b685a.png)

- 動画はこちらへ

https://youtube.com/shorts/4zY9PdAzHHo?feature=share

## 認識
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/ee586139-09ec-fc90-477c-4cdf6377ba04.png">

認識技術ではカメラとLidarを採用したLate Fusion方式を採用しています。

これら認識した情報を経路計画部で使用するコストマップへの反映や物体認識に使用しています。

カメラで何が写り込んでいるかを認識し、Lidarでどこに障害物があるかの情報を取得、2つの情報を統合してどこに何があるのかを明らかにする仕組みです。
発見された物体は行動計画システムや経路計画システムに送られます。

動作例はこちらをご覧ください！

- [認識技術 動作例](https://youtu.be/_w1zxa2iw-8)
<iframe width="560" height="315" src="https://www.youtube.com/embed/_w1zxa2iw-8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 行動計画
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/84ab5444-8ac5-3d14-c61e-9adec6936b6a.png">


行動計画ではbehavior tree を採用しています。
behavior tree を用いることで、
- 行動遷移を視覚化＆簡易な遷移確認
- 作成したツリーの再利用
が可能となります。

これにより、様々なタスクが要求されるRobotXにも対応可能としています。

## 自己位置推定
GNSSとIMUデータに基づく、拡張カルマンフィルタ(Extended Kalman Filter, EKF)を活用した6自由度自己位置推定を行っています。
拡張カルマンフィルタは非線形な状態＆観測方程式を動作点において線形化することにより、自己位置推定の計算を行います。
自己位置推定システムのソースコードは[こちら](https://github.com/OUXT-Polaris/robotx_ekf)で公開しています。

## 経路計画
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/d294b7a4-ff14-f736-7fef-9db3920639a7.png">

経路計画では安全面（ここでは障害物との衝突回避）を意識した設計となっており、３つのplannerが並列で動作しています。

- stop planner:終端で停止する計画
- obstacle planner:障害物手前で停止する計画
- curve planner:ある閾値以上旋回速度を出さないように抑制する計画
となっております。

現在はプランナーは３つですが、今後の機能拡張により8個までは増やすことが可能な設計になっており、様々な環境下で動作可能なプランナーを目指しています。

### 緊急時
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/d09a5e8e-d95d-fb75-30f8-46b4da3a59a4.png">

仮に船の前方に障害物が多々あった場合には、
上図のような経路計画を行うことで障害物回避を可能とします。

## 制御
制御ではros2_controlを採用しています。
ros2_controlの説明はRTさんのブログがとてもわかりやすいので是非！以下、内容も参考にさせて頂いております！
- [ros2_controlを使ってみた](https://rt-net.jp/humanoid/archives/3571)

ros2_controlを用いる際にユーザが意識する所は主にHardware ComponentsとControllersです。
- Hardware Components:センサーやアクチュエータ等
- Controllers：制御（JointTrajectory, Positon,Velocity,・・・）

実装の流れは...
1. Hardware Componentsをプラグインとして実装する。
2. URDFにros2_controlタグを追加する。
3. Controller Manegerのパラメータを設定する。
4. launch fileからControllerManegerを呼び出す。

なんだか実装できそうになってきましたね！

参考：[ros2_controlを使ってみた](https://rt-net.jp/humanoid/archives/3571)

## CI/CD
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351913/23e9938c-6045-829a-d201-795ddac0bcdb.png">

CI/CDとは「Continuous Integration（継続的インテグレーション）/ Continuous Delivery（継続的デリバリー）」の略称です。
我々OUXT Polarisでは、ソフトウェアの変更を常にテストすることで、バグの早期発見や安定したシステム運用を行っております。
CI/CDシステム基盤にはGithub Actiosを採用しており、一日数十件程度のJobが走っています。
自動テストを最低限で終わらせる、部品性をより高めると言った観点からOUXT Polarisのソフトウェアは200程度の分散したリポジトリで管理されており、CI/CD結果を確認して回るのは非常に大変です。
そのため監視システムも開発を行い、現在はSlackへの通知とDashboardによる日々の監視ができるようになっています。

https://ouxt-polaris.github.io/ouxt_automation/packages/

また、実機にデプロイするさいにはansibleとgithub actionsを組み合わせ人が作業することによるミスを最低限にする仕組みの構築を目指しています。

## オープンソース
OUXT Polarisは非常に高いRobotX Challngeおよび屋外自律移動ロボット開発の参入障壁を下げるべくオープンソース活動を重視しており、開発成果物はプライバシーに関わるものや、認証情報以外すべてオープンソースにしております。
以下リンクを覗いて見てください！
- [OUXT Polaris ](https://github.com/OUXT-Polaris)

## OUXT Polarisにご興味ある学生の方/スポンサー様

自律航行船のロボコンやってみたい！という学生さんはお気軽にお声がけください！
今回はソフトウェアについての紹介が多かったですが、
ハードウェア・ソフトウェアどちらも常時募集しています！

また、スポンサー様も募集しております！
もしもOUXT Polarisにご興味ありましたら、以下リンクからお申し出くださると幸いです。

### [お問い合わせ先：ホームページ](https://www.ouxt.jp/#contact) 

### [お問い合わせ先：Twitter DM](https://twitter.com/OUXT_Polaris)

----

### 最後までお読み頂きありがとうございました！
投稿者
- [Twitter](https://twitter.com/MeRTcooking)
- [OUXT Polaris 自己紹介](https://www.ouxt.jp/author/%E5%B0%8F%E6%9E%97-%E8%81%96%E4%BA%BA/)

協力者
- OUXT-Polaris member（特に片岡さん、岡本くん、永田くん、ありがとうございました！）