ros2 从零开始19 使用 Node Interfaces 模板类(C++)
ros2 从零开始19 使用 Node Interfaces 模板类(C++)
前言
背景
并非所有ROS节点都一样! 就像类rclcpp::Node和类rclcpp_lifecycle::LifecycleNode不是来源同一个继承者,这意味着 ROS 开发者在编写一个以 ROS 节点指针为参数的函数时,可能会遇到类型的问题。 为解决这个问题,rclcpp包含应作为传统节点和生命周期节点传递函数的首选约定的模板类型rclcpp::NodeInterfaces<>。 这场ROS Con 2023闪电演讲简明扼要地总结了问题并解决了问题。 以下教程将教你如何将rclcpp::NodeInterfaces<>作为所有ROS节点类型提供可靠且紧凑的接口。
模板类rclcpp::NodeInterfaces<>为管理 ROS 2 中的节点接口提供了一种简洁高效的方式。 这在处理不同类型的 ,如rclcpp::Node和rclcpp_lifecycle::LifecycleNode,它们不共享同一继承树时尤其有用。
编者话,这个模板类将允许我们编写函数时,不用给不同的ROS节点入参编写不同的函数实现,即便它们的实现一样。
1. 利用SharedPtr访问节点信息
下面的例子,我们创建一个简单的节点SimpleNode和一个函数node_info,函数接收一个指针rclcpp::Node::SharedPtr作为入参,打印节点名称。
#include <memory> #include "rclcpp/rclcpp.hpp" void node_info(rclcpp::Node::SharedPtr node) { RCLCPP_INFO(node->get_logger(), "Node name: %s", node->get_name()); } class SimpleNode : public rclcpp::Node { public: SimpleNode(const std::string & node_name) : Node(node_name) { } }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node = std::make_shared<SimpleNode>("Simple_Node"); node_info(node); }输出:
[INFO][Simple_Node]: Node name: Simple_Node