ROS中私有节点句柄(Private Node Handle)和非私有节点句柄(Global Node Handle)辨析

发布时间:2024年01月11日

在ROS(Robot Operating System)中,节点句柄(ros::NodeHandle)是与ROS系统进行交互的主要途径,用于创建发布者、订阅者、服务等。区分私有节点句柄和普通(非私有)节点句柄主要在于它们如何处理命名空间,这直接影响参数服务器的使用和主题名称的解析。

私有节点句柄(Private Node Handle)

  • 创建方式: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

在这种情况下,参数和主题名都会自动加上节点的名称作为命名空间前缀。

非私有节点句柄(Global Node Handle)

  • 创建方式: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他们之间是如何联系和工作的?

文章来源:https://blog.csdn.net/qq_21950671/article/details/135519364
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。