はじめに
ROSには,ロボットの自律移動を実現するNavigation Stack という枠組みが存在します.
ROSのド素人である私がこれと出会ったとき,こう思いました.
「わっけわっかんねーw」
不束者の私は,経路探索,自己位置推定,地図生成などの機能に対して,種々のセンサが情報がどのように作用しているのか,中々全体像が把握できないまま何となく使わせてもらっていました.
このままではいかん!というわけで,Navigation Stack のソフトウェアの構成と,各モジュールがやりとりするメッセージの関係性がある程度分かるようになることを目標に,メモを書きます.
特に,自己位置推定と地図生成については,その原理を直感的に理解できるようにイラストを使った説明を試みます.これらの仕組みはS Thrunら, Probabilistic Roboticsを全面的に参考にさせて頂きました.当方の記事に認識の誤り,ご指摘がございましたら,ご指摘を頂けましたら幸いです.
目次
- 導入
- move_base (ナビゲーション)
- ROSで遊んでみる
- ソフトウェア構成をみる
- amcl (自己位置推定)
- ROSで遊んでみる
- ソフトウェア構成をみる
- 原理をみる (準備編)
- 原理をみる (応用編)
- gmapping (地図生成)
- ROSで遊んでみる
- ソフトウェア構成をみる
- 原理をみる(応用編)
- 原理をみる(準備編 その1)
- 原理をみる(準備編 その2)
-
Navigation Stack の中心要素である,ナビゲーション,自己位置推定,地図生成の各節について,ROSのパッケージで遊んでみる項,ソフトウェア構成をみる項,その原理をみる項に分けて記述します.
-
ナビゲーションについては,原, "ROSの活用による屋外の歩行者空間に適応した自律移動ロボットの開発", ロボット工学セミナー, 2015. という大変分かりやすい資料があり,現状における私の理解ではこの資料以上の情報を提供できないので,当該節について詳細な原理については書きません.
-
他の節についても,もちろん原先生の資料で素晴らしい解説がされているので,私のようなド素人がかけることは少ないのです.
-
そこで,ここでは私のような本当に無知な人間が挙動を直感的に理解するために必要となりそうな,もう少し細かいステップまで分解したイラストをを付与して説明することにフォーカスしました.他の資料と少しオーバラップしてしまう部分はありますが,説明のために必要な量にすることを心がけます.
使用するロボットモデル
ここでは,Husky という4輪ロボットのモデルをGazebo上で動かしながら理解を深めようと思います.husky_navigation のチュートリアルを参考に進めてゆきます.
Navigation Stack でやりたいこと
「ロボットの自動運転を実現したい」.これに尽きます.
実現されている技術で近い例として,カーナビが挙げられます.行きたい場所を入力すれば現在地からのルートを探索し,交差点での進行方向を示してくれます.これは,目標位置,車の現在位置,道路地図といった情報を利用することで実現されています.
ただし,アクセルを踏んでハンドルを回すのは人間です.これをも自動化してくれるのが「Navigation Stack」の仕組みです.ここをロボットにやらせるだけで気をつけなければならないことが色々あるのですが,基本的な機能はこの中で網羅されており,ROSで自動運転をやるならまずはコレ!というレベルの重要な要素となっているようです.
自律運転の実証実験プロジェクトであるつくばチャレンジでも,ベースとしてNavigation Stack を使っているチームが存在します.
昨今開発が盛んになっている自動運転技術の中核となる技術,何となくでも知っておきたいですね.
ROSの各パッケージの位置づけ
さて,ROSパッケージの位置づけについて確認します.これも,原, ROSの活用による屋外の歩行者空間に適応した自律移動ロボットの開発で詳細に解説されているのですが,ここではそれを参考にして,ド素人の私自身がとりあえず全体を把握することを目標にした記述をします.
最も本的な要素に分解すると,2つに大別されます.ナビゲーション関連のパッケージ一式を格納したnavigationメタパッケージと,地図生成を司るslam_gmappingメタパッケージです.
手順としては,次のように行うのが一般的です.
- gmapping で地図を作成してデータとして保存する
- move_base, amcl, map_server を使って精度の良いナビーションをする
ただし,上図は説明のために簡略化されています.こんなふうに描くと,まるでgmapping がnavigation と完全に独立した存在の様に見えてしまいますが,そうではありません.gmapping で地図を作成するときは自己位置推定もしており,この情報を使ってnavigation することができます.また,作成した地図はmap_server を使って保存します.したがって,地図生成時のソフトウェア構成は,もう少し正確に描くと,下図のようになります.
何となく図を眺めて,ふむそんなものかとなった(?)ところで,各パッケージの概要を以下に示します.
メタパッケージ:navigation
内部には更に複数のROSパッケージが含まれています.コアとなるのが,move_base(経路計画とナビゲーション),amcl(自己位置推定),map_server(地図管理)のパッケージです.特に親分的な役割を担うのがmove_base
です.
地図と自己位置推定の部分は実はオプションという位置づけなので好きな手法を当てはめてよいのですが,ここでは最も一般的なamcl
とmap_server
を挙げておきます.
パッケージ:move_base
目標位置と自己位置を元に,経路計画とナビゲーションを行ってくれます.これは,amcl
とmap_server
がなくても単独で動かすことはできます.親分ですから.ただし,それは人が目をつぶったままお出かけするような状態に相当し非常に危ないので,普通は地図と自己位置推定という子分を組み込んで,より正確なナビゲーションができるようにします.
パッケージ:amcl
地図,動作モデル,センサ情報を使って自己位置推定を行うパッケージです.パーティクルフィルタを活用した自己位置推定法で,環境の変化に強いという特長があります.
パッケージ:map_server
地図を管理するパッケージです.move_base
やamcl
といった他のノードから地図を参照できるように地図情報を提供してくれます.地図のデータは画像形式で提供されます.
メタパッケージ:slam_gmapping
ここまでの説明では,地図が天下りで登場していますが,当然地図だって作る必要があるわけです.そこで,SLAM (Simultaneous Localization And Mapping) という技術で地図を作成するのが,本メタパケージです.
パッケージ:gmapping
現状,slam_gmapping
の中には,gmapping
というパッケージのみ存在します.gmapping
では,動作モデルとセンサ情報を元に地図を作成します.ここでも中核をなす技術はパーティクルフィルタです.パーティクルフィタの特長については,MyEnigma-Particle Filterを使用した自己位置推定MATLABサンプルプログラム で簡潔に分かりやすくまとめられています.
SLAMのROSパッケージとして有名なものとして,hector_slamが挙げられます.この手法の特長は,gmapping
では必要だった動作モデルとオドメトリの情報は不要となり,センサ情報だけで地図を作成するということです.
この記事では,前者のgmapping
だけを扱います.gmapping
の方がamcl
からの類推が直接的で,更にパーティクルフィルタの理解に役立つからとも言えますし,当方がhector_slam
を使ったことが無いからというしょぼい理由がメインかもしれないですし.まぁ,いいです笑.
おわりに
以上が全体像です.ここまで認識した上で,もう一度冒頭の図を見てみると,少し分かった気になれます.
これから複数回に渡って,少しずつその中身を紐解いていこうと思います.小生のつたない文章にお付き合い頂ければ幸いです.
Next: 2.1 move_base: ROSで遊んでみる
参考文献
- S Thrun, et al., "Probabilistic Robotics", the MIT Press, 2005.
- 原, "ROSの活用による屋外の歩行者空間に適応した自律移動ロボットの開発", ロボット工学セミナー, 2015.
- Atsushi(ブログプロフィールより), "Particle Filterを使用した自己位置推定MATLABサンプルプログラム", MyEnigma, 2014.
- ROS Wiki.
- "ros-planning/navigation", github.
- "ros-perception/slam_gmapping", github.
- "tu-darmstadt-ros-pkg/hector_slam", github.
- "粒子フィルタ", Wikipedia.