【Q&A形式】ROSまとめ
過去にもROSについてザックリまとめた記事(以下)を書いたが,今回はROSについてより幅広くQ&A形式でまとめてみた.
ROS (Robot Operating System) について
これを書いた背景としては,人に自分の研究に関することを説明するときにより簡単に説明できるようになりたいと思ったからである.というか,これからその場面がある.この記事はそのための準備である.
Q&A リスト
- ROSとは?
- なぜROSを使う?
- OSとは違う?
- ROSのコアコンセプトは?
- 他のロボット開発用ミドルウェアと何が違う?
- ROS1とROS2の違いは?
- DDSとは?
- Filesystem Levelのコンセプトをもっと詳しく
- CMakeLists.txtとpackage.xmlの役割の違いは?
- Computation Graph Levelのコンセプトをもっと詳しく
- Nodesとは?Nodes間の通信方法・規格は?
- Masterの役割は?ROS2になったことによる変化は?
- Messagesとは?
- Topicsとは?
- Servicesとは?
- Actionsとは?
- Bagsとは?
- どうやってROSのプログラムはテストする?
- ROSシステムのデバッグ方法は?
- ユニットテスト方法は?
- ROSに関連したツールにはどういったものがある?
- Rvizとは?
- Gazeboとは?
- MoveIt!とは?
- ROSの用途は?
- ROSを使える具体的な製品は?
- 何にROSが使われている?
1. ROSとは?
ROSはRobot Operating Systemの略.ロボットアプリケーション開発を支援するツールキットである.また,ROSはOSSとして開発されている.
参考
1-a. なぜROSを使う?
以下のようなライブラリ,ツールを提供しており,自分たちがロボットアプリケーションにおいて最も注力したい箇所に集中できるため.
ツール:
- ナビゲーションツール
- 可視化ツール
- プロセス間のメッセージ通信
- デバイスドライバ
- パッケージ管理
- …
参考
1-b. OSとは違う?
ROSはOSではない.ロボットアプリケーションを開発するのに必要なパーツを提供してくれるSDK(Software Development Kit),フレームワークまたはメタ・オペレーティングシステムと表現される.
Robot Operating Systemという名前なのでロボット用の派生OSかのように最初は思うかもしれないが,そうではない.
ドキュメントに,
It provides the services you would expect from an operating system, including hardware abstraction, low-level device control, implementation of commonly-used functionality, message-passing between processes, and package management.
引用元:ROS/Introduction - ROS Wiki
とあるように,ロボット開発においてのOSのような機能を提供していることがROSという名前に繋がっていると思われる.
参考
1-c. ROSのコアコンセプトは?
ROSのコンセプトは以下3つのレベルに分けられる.
-
Filesystem Level
ファイルシステムレベルのROSリソース(Packages, Metapackages, Package Manifests, Repositories, Message types, Service types)
-
Computation Graph Level
ROSプロセスのP2Pネットワークレベルのコンセプト(nodes, Master, Parameter Server, messages, topics, services, bags)
-
Community Level
別々のコミュニティがソフトウェアや知見を交換するためのROSリソース(Distributions, Repositories, The ROS Wiki, Bug Ticket System, Mailing Lists, ROS Answers, Blog)
参考
1-d. 他のロボット開発用ミドルウェアと何が違う?
公式ドキュメントによると,比較対象によって異なってくるため単純な比較は難しいとしている.
書籍やユーザーによると,ユーザー数,提供ライブラリの種類と数,拡張性の高さ,開発の容易さが異なる(らしい).実際,ROSの情報量の多さは開発していても感じている.
参考
2. ROS1とROS2の違いは?
最も大きく異なるのは通信規格が独自プロトコルからDDSに変更された点.これにより,単一障害点がなくなった.
| Category | ROS1 | ROS2 |
|---|---|---|
| Network Transport | TCP/UDPベースの独自プロトコル | UDPベースのDDS |
| Network Architecture | 中心にネームサーバ(Master) | P2P |
| Platform Support | Linux | Linux, Windows, MacOS |
| Node vs. Process | 1プロセスに1ノード | 1プロセスで複数のノードを実行可能 |
| Embedded Systems | 最小限の実験的サポート(rosserial) | 商業的サポート(micro-ROS) |
| Licenses | BSD | Apache 2.0 |
他にもいろいろあるが,詳しくは以下を見てみるとよい.
参考
Robot Operating System 2: Design, Architecture, and Uses In The Wild
Changes between ROS 1 and ROS 2
2-a. DDSとは?
DDS(Data Distribution Service)は,OMG(Object Management Group)が策定した分散システム向けのデータ通信の標準規格である.Pub/Subモデルでデータを交換する.
特徴としては以下が挙げられる.
- データ中心(Data-Centric) トピックとデータ型を定義しておけば,データの配送はミドルウェアが担当する.
- 自動discovery 通信に参加するノード同士がお互いを自動的に発見するため,中央のブローカーやネームサーバが不要になる.ROS2でMasterがなくなったのはこの性質によるもの.
- QoS(Quality of Service) 信頼性(Reliable / Best effort),Durability,Deadline,Historyなど細かいポリシーを設定でき,用途に応じて通信の性質を変えられる.センサーの値のように取りこぼしてもよいものと,コマンドのように確実に届けたいものを書き分けられる.
- 実装が複数存在する ROS2はRMW(ROS Middleware Interface)という抽象レイヤを挟んでおり,Fast DDSやCyclone DDSといった実装を差し替えられる.
DDSの上でやりとりされるワイヤプロトコルはDDSI-RTPS(Real-Time Publish-Subscribe)で,これに準拠した実装同士は相互運用できることになっている.とはいえ実際にベンダーを跨ぐと素直に繋がらないこともあり,これで少しハマったことがある.
【ROS2】Galactic - Humble 間で通信しようとしたらうまくいかなかった時の解決策
ROS2が独自プロトコルをやめてDDSを採用した理由は “ROS on DDS” にまとめられている.実績のある既存規格に乗ることで,通信レイヤの実装と保守を自分たちで抱えずに済むのが大きい.
参考
About Quality of Service settings — ROS 2 Documentation: Humble documentation
About DDS Specification | Object Management Group
About DDSI-RTPS Specification | Object Management Group
3. Filesystem Levelのコンセプトをもっと詳しく
3-a. CMakeLists.txtとpackage.xmlの役割の違いは?
- CMakeLists.txt コードのビルド方法やインストール先が記述されている.
- package.xml パッケージに関する情報(package name, version numbers, authors, maintainers, dependencies)が記述されている.
つまり,CMakeLists.txtはどのようにビルドするかを記述したものであり,package.xmlはビルドする際に何が必要かを記述したものである.
また,package.xmlに含まれるメタデータはROS wikiで使用される.
参考
catkin/CMakeLists.txt - ROS Wiki
CMakeLists.txt vs package.xml - ROS Answers: Open Source Q&A Forum
4. Computation Graph Levelのコンセプトをもっと詳しく
4-a. Nodesとは?
1プログラムの実行単位で,ノード間での通信によりデータのやり取りを行う.
ROSネットワーク内で実行されるプロセスである.通常,ロボットのシステム内では複数のノードが立ち上げられ,1つのノードが1つの特定のタスクを担当する.
これにより,ノード間は疎結合となっており,障害耐性やプログラムの再利用性が高い.
参考
4-b. Masterの役割は?ROS2になったことによる変化は?
ROSネットワーク内における名前解決,ノード間通信の仲介,パラメータ管理の役割を持つ.
- 名前解決:ノード,トピック,サービスなどの名前を管理し,それらが互いに通信するための接続情報を提供する.
- ノードの登録と管理:新しいノードの起動時に,Masterと接続し,他のノードとの接続に必要な情報をMasterに提供する.
- パラメータサーバ:ノード間で共有されるパラメータを管理する.
ROS2ではMasterノードはなくなった.DDSを採用したことにより,各ノードが自動的に接続相手を検出し通信できるようになった.パラメータについては,各々のノードが管理することになった.
参考
Discovery — ROS 2 Documentation: Rolling documentation
4-c. Messagesとは?
ノード同士が通信する際に用いられるデータ構造.
参考
4-d. Topicsとは?
Pub/Subの通信モデルで使用される,ノード同士がメッセージを交換するための名前付きバスである.メッセージを発信する側(publisher)と受け取る側(subscriber)は通信相手のノードについて知っている必要はなく,トピック名を知っていればよい.
1つのトピックに対して複数のpublishersとsubscribersが存在できる(多対多の通信).
参考
4-e. Servicesとは?
多対多の通信であるPub/Subと異なり,Request/Reply型の通信で使用される.1つのサービス名に対してサーバーは1つだが,そのサーバーを複数のクライアントが呼び出すことができ,レスポンスはリクエストを送ったクライアントにのみ返る.サービスはリクエスト用のメッセージと返信用のメッセージの2つのメッセージで構成される.
クライアント側はサービス名とリクエスト用のメッセージを用いて,サーバーにリクエストを送信し,返信を待つ.サーバーはリクエストを受け取り,結果をクライアント側にリプライする.
参考
4-f. Actionsとは?
ROSが提供する通信モデルには,トピックとサービスの他にもう一つアクションがある.アクションはトピックとサービスを組み合わせたものである.サービスにおけるリクエストとレスポンスの送信に加えて,間の処理中の情報をサーバーからクライアントに対してトピックで送信している.
ロボットにある動作のリクエストを送信し,その途中経過によって処理を中断させるといったことができる.
参考
4-g. Bagsとは?
ROSネットワーク内でやりとりされているメッセージデータを保存するフォーマット(保存されたファイル)である.
bagファイルを再生して,保存した時の状況を再現することができる.
デバッグで非常に有用である.
参考
5. どうやってROSのプログラムはテストする?
5-a. ROSシステムのデバッグ方法は?
ROSにはデバッグに使える様々なツールやコマンドがある.
- Logging ログ出力.いわゆるprintデバッグ的なデバッグ方法.プログラム上で確認したい変数などを標準出力して確認できる.
- rqt_graph Computation graphを可視化してくれる.これにより,ノード間の繋がりやトピックをGUIで確認できる.rqt系にはこれだけでなく様々な便利ツールがある.
- rosbag 上でも説明した通り,トピックを保存,再生することができる.
- コマンド
- rostopic, rosnode, rosservice,,, これらのコマンドを使用することで,ノードが正常に立ち上がっているかや,トピックがpublishされているかなどの確認ができる
このようにROSに備わっているものだけでなく,GDBやValgrindといったスタンダードなデバッグツールも使うことができる.
参考
roscpp/Overview/Logging - ROS Wiki
ROS/CommandLineTools - ROS Wiki
5-b. ユニットテスト方法は?
ROSに依存しない普通のユニットテストと,ノードを立ち上げて行うテストの2種類を考えることになる.
前者については,ノードの中身のロジックをROSのAPIに依存しない関数やクラスに切り出しておけば,あとは言語標準のテストフレームワーク(Pythonならpytest,C++ならgtest)でそのまま書ける.テストしやすさを考えると,メッセージの受け渡しとロジックは分けておいたほうがよい.
後者については,ノードを実際に起動して,トピックやサービスの振る舞いを検証する.ROS2では launch_testing,ROS1では rostest がこの役割を担う.
テストの実行はROS2であれば colcon test にまとめられている.
colcon test --packages-select <package_name>
colcon test-result --verbose
参考
Testing — ROS 2 Documentation: Humble documentation
Running Tests in ROS 2 from the Command Line — ROS 2 Documentation: Humble documentation
6. ROSに関連したツールにはどういったものがある?
おそらくRvizが最もよく使用されるツールだろう.また,シミュレーション環境としてはGazebo,マニピュレーション用のプランニングフレームワークとしてMoveIt!がよく使われていると思う.
他にもいろいろあるが,割愛(参考資料を見てほしい).
参考
6-a. Rvizとは?
ROSのトピックを3次元空間に可視化するツール.また,単に可視化するだけでなく,点群のサイズを調整したりなどといったカスタマイズ可能.
参考
6-b. Gazeboとは?
3Dのシミュレーションソフトウェア.物理エンジンをサポートしており,また,センサーのシミュレーション機能も提供しているため,より現実に近い環境での検証が可能.
参考
6-c. MoveIt!とは?
マニピュレーション用として最も広く使用されているソフトウェア.
オブジェクトの把持などといったマニピュレーションタスクのモーションプランニングを行う.障害物があれば,それを避けるように計算する.
また,Rvizと連携することで,GUI上でマニピュレータを操作することが可能.
参考
MoveIt Motion Planning Framework
7. ROSの用途は?
ロボットに使用されるのは当然のこと,自動運転車やマイコンで使用される例もあり幅広い.
7-a. ROSを使える具体的な製品は?
マニピュレータ,ローバー,ドローン,LiDARセンサー,カメラなど様々ある.詳しくは参考資料を参照.
参考
7-b. 何にROSが使われている?
- 自動運転
- ファクトリオートメーション
- クラウドロボティクス
参考文献,有用資料まとめ
Robot Operating System 2: Design, Architecture, and Uses In The Wild