🐈

rclcpp code reading 2 (NodeInterface概要)

2023/11/19に公開

はじめに

rclcppのコードリーディングをしています。
基本的にはardent branchのものを読んでいます。(コード量が少ないのと、把握してから変更点を追いかける方針)
なんちゃってロボットエンジニアなので間違っていれば教えてください。
コードは下記から引用しております。
https://github.com/ros2/rclcpp
https://github.com/ros2/rcl
https://github.com/ros2/rcutils
https://github.com/ros2/tutorials

NodeInterface

Nodeクラスには様々なpublic関数がありますが実装を見るとメンバ変数から同じ名称の関数を
呼び直してるだけのようです。

https://github.com/ros2/rclcpp/blob/bea1a52e24eaea0ad141a4d13dfa4606fcf190e7/rclcpp/src/rclcpp/node.cpp#L109-L113

そして、メンバ変数を見ると、NodeXXXInterfaceへのポインタのようです。

https://github.com/ros2/rclcpp/blob/bea1a52e24eaea0ad141a4d13dfa4606fcf190e7/rclcpp/include/rclcpp/node.hpp#L420-L427

コンストラクタを見るとNodeXXXクラスをnewしてます。
https://github.com/ros2/rclcpp/blob/bea1a52e24eaea0ad141a4d13dfa4606fcf190e7/rclcpp/src/rclcpp/node.cpp#L49-L60

NodeXXXクラスはNodeXXXInterfaceを継承するクラスですね。
https://github.com/ros2/rclcpp/blob/bea1a52e24eaea0ad141a4d13dfa4606fcf190e7/rclcpp/include/rclcpp/node_interfaces/node_base.hpp#L33

Interfaceは
node_base,clock,graph,parameter...などなど機能別に分かれているようです。

また、基本的にはinterfaceに処理を委譲してますが、
node_impl.hppにはrclcpp namespce下の関数をコールする実装が存在します。

https://github.com/ros2/rclcpp/blob/bea1a52e24eaea0ad141a4d13dfa4606fcf190e7/rclcpp/include/rclcpp/node_impl.hpp#L67-L82

Nodeクラス自体は、ポインタをまとめてるだけで、ほぼほぼnode_interfaceに処理を委譲している作りになっていますね。facadeになっているようです。
次は、interfaceクラスの実装を眺めてみます。

Discussion