在ROS(Robot Operating System)中,节点句柄(ros::NodeHandle
)是与ROS系统进行交互的主要途径,用于创建发布者、订阅者、服务等。区分私有节点句柄和普通(非私有)节点句柄主要在于它们如何处理命名空间,这直接影响参数服务器的使用和主题名称的解析。
ros::NodeHandle nh("~");
假设节点名称为 my_node
,并且您使用私有节点句柄创建了一个名为 param
的参数和一个名为 topic
的发布者。
ros::NodeHandle private_nh("~");
private_nh.getParam("param", value); // 实际上访问的是 /my_node/param
private_nh.advertise<std_msgs::String>("topic", 1000); // 实际上发布到 /my_node/topic
在这种情况下,参数和主题名都会自动加上节点的名称作为命名空间前缀。
ros::NodeHandle nh;
假设您使用非私有节点句柄创建了一个名为 param
的参数和一个名为 topic
的发布者。
ros::NodeHandle nh;
nh.getParam("param", value); // 访问的是 /param
nh.advertise<std_msgs::String>("topic", 1000); // 发布到 /topic
在这种情况下,参数和主题名是全局的,不会加上节点的名称作为前缀。
私有节点句柄和非私有节点句柄的主要区别在于它们如何处理命名空间。私有节点句柄用于访问和设置与当前节点相关的私有参数,并且会自动将节点名称作为前缀添加到参数和主题名称中。而非私有节点句柄则用于全局参数和主题,不会自动添加任何前缀。这个选择取决于您的具体需求,比如是否需要隔离节点的参数和主题以避免与其他节点的冲突。
#include <ros/ros.h>
ros::init用途用法
ros::NodeHandle用途用法
ROS中私有节点句柄(Private Node Handle)和非私有节点句柄(Global Node Handle)辨析
一个ros可执行程序可以定义几个节点?
ROS中如何让一个节点一直运行?
ros::init ros::NodeHandle ros::Subscriber ros::Publisher他们之间是如何联系和工作的?