ROS 2 公式文書(英語) 日本語訳シリーズです。
本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。
※2019/05/06 現在のものです。
ROS は、異なる ROS プロセス間のメッセージ受け渡しを可能にする、匿名パブリッシュ/サブスクライブ機構に基づくミドルウェアです。
ROS 2 システムの心臓部はROS グラフです。 ROS グラフは、ROS システム内のノードのネットワークとそれらが通信するノード間の接続状態を表します。
グラフ概念の概要
- ノード:ノードとは、ROS を使用して他のノードと通信する実体です。
- メッセージ:トピックをパブリッシュまたはサブスクライブするときに使用されるROSデータ型。
- トピック:ノードはトピックにメッセージをパブリッシュしたり、トピックをサブスクライブしてメッセージを受信したりできます。
- ノード検出:ノードが互いにどのように相互通信するかを決定する自動プロセス。
ノード
ノードは ROS グラフの登場人物の一人です。 ROS ノードは ROS クライアントライブラリを使って他のノードと通信します。ノードはトピックをパブリッシュまたはサブスクライブすることができます。ノードはサービスを提供または使用することもできます。ノードに関連付けられている設定可能なパラメータがあります。ノード間の接続は、分散検出プロセスを通じて確立されます。ノードは、同じプロセス内、異なるプロセス内、または異なるマシン上に配置できます。これらの概念については、以降のセクションで詳しく説明します。
クライアントライブラリ
ROS クライアントライブラリは、異なるプログラミング言語で書かれたノード同士の通信を可能にします。様々な言語の ROS API に必要な共通の機能を実装するコア ROS クライアントライブラリ(RCL)があります。これにより、言語固有のクライアントライブラリの記述がより簡単になり、より一貫した動作が確保できます。
以下のクライアントライブラリは ROS 2 チームによって管理されています。
- rclcpp = C++ クライアントライブラリ
- rclpy = Python クライアントライブラリ
さらに、他のクライアントライブラリは ROS コミュニティによって開発されました。詳しくは ROS 2 クライアントライブラリの記事をご覧ください。
ノード検出
ノードの検出は、ROS 2 の基礎となるミドルウェアを介して自動的に行われます。これは、次のようにまとめることができます。
ノードが起動されると、同じ ROS ドメイン(ROS_DOMAIN_ID 環境変数で設定)を持つネットワーク上の他のノードにその存在を通知します。ノードはこの通知に対して自身に関する情報と共に応答することで、適切な接続を確立し、ノード同士が通信可能となります。
初期ノード検出期間の後であっても、ノードは定期的に自身の存在を通知して、新しく見つかった対象との接続を確立できるようにします。
ノードはオフラインになると、その状態を他のノードに通知します。
ノードは SoQ 設定について互換性のあるノードとの接続のみを確立します。
サンプル:talker-listener
ターミナルで、トピックに関するメッセージをパブリッシュするノード(C++)を起動します。
ros2 run demo_nodes_cpp talker
別のターミナル上で、同じトピックのメッセージをサブスクライブする2番目のノード(Python)を起動します。
ros2 run demo_nodes_py listener
これらのノードがお互いを自動的に発見し、メッセージを交換し始める様子が確認できます。