コールバックグラフについて#
ROS のアプリケーションは一般的にノードのグラフで記述され、それに伴いノード単位のレイテンシ(ノードレイテンシ)を把握したいケースが生じます。 しかしながら、一つのノードにコールバックが複数存在するケースでは、ノードレイテンシを考えた際に不都合が生じます。
上図は、 /lidar と /camera トピックをサブスクライブし、その2つの情報を統合したメッセージを /fusion にパブリッシュする TargetNode を例として示しています。 /lidar のコールバックでは、メンバ変数にメッセージを格納し、/camera コールバック内で統合させています。 ※ CARET では 、変数を経由したコールバック間のメッセージ渡しを Variable Passing と呼び、アーキテクチャファイルへ記述させています。
この時、 TargetNode のレイテンシは次の2つが考えられます。
- コールバック C → コールバック D(/lidar トピック → /fusion トピックのパス)
- コールバック D(/camera トピック → /fusion トピックのパス)
このような一つのノードに複数コールバックが存在ケースでは、指定するパス毎にノードレイテンシを構成するコールバックが異なります。 そのため、 CARET では ROS のアプリケーションをコールバックグラフとして記述しています。
ノード・コールバックの整理
A node is an executable that uses ROS to communicate with other nodes.
(http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes より引用)と言われているように、ノードは実行可能な単位です。
一方で、コールバックはスケジューリングされるタスクの単位として捉えることができます。
特に ROS 2 の場合、SingleThreadedExecutor を始めとするエグゼキュータが複数存在し、
スレッド数の違いだけでなく、コールバックの実行順序が異なります。
性能を評価する上では、何のノードが何のエグゼキュータで実行されていたかも重要な観点です。