ROS Nodehandle句柄

本文详细介绍了ROS中命名空间的概念及使用方法,包括句柄构造函数指定命名空间、全局名字的指定方式及其不推荐的原因,以及如何使用私有名字创建新的句柄等。通过具体的代码示例,帮助读者更好地理解不同命名空间的应用场景。
部署运行你感兴趣的模型镜像

1、句柄可以让你通过构造函数指定命名空间

ros::NodeHandle nh("my_namespace");

这使得使用该句柄的任何相对名字都是相对<node_namespace>/my_namespace,而不是只相对<node_namespace>

你也可以指定一个父句柄和追加的命名空间

ros::NodeHandle nh1("ns1");

ros::NodeHandle nh2(nh1,"ns2");

这将把nh2放入到<node_namespace>/ns1/ns2命名空间

2、也可以指定全局名字

ros::NodeHandle nh("/my_global_namespace");

这种做法并不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。

3、私有名字

使用私有名字比直接调用有私有名的句柄方法更有技巧,你可以在一个私有命名空间中直接创建一个新的句柄。

ros::NodeHandle nh("~my_private_namespace");

ros::Subscriber sub = nh.subscribe("my_private_topic",....);

以上例子会订阅<node_name>/my_private_namespace/my_private_topic

注意:理解的重点上文中红色标注的部分,node_namespacenode_name是两回事!

node_name = node_namespace + nodename

补充demo

// launch 文件中 ns=="node_namespace"

ros::init(argc, argv, "node_name"); // node name

ros::NodeHandle n; //n 命名空间为/node_namespace

ros::NodeHandle n1("sub"); // n1命名空间为/node_namespace/sub

ros::NodeHandle n2(n1,"sub2");// n2命名空间为/node_namespace/sub/sub2

ros::NodeHandle pn1("~"); //pn1 命名空间为/node_namespace/node_name

ros::NodeHandle pn2("~sub"); //pn2 命名空间为/node_namespace/node_name/sub

ros::NodeHandle pn3("~/sub"); //pn3 命名空间为/node_namespace/node_name/sub

ros::NodeHandle gn("/global"); // gn 命名空间为/global
 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

由于提供的代码仅为 `#include "ros/ros.h"` 和 `return 0;`,不包含 ROS 参数新增和修改功能的具体代码,下面给出一个包含 ROS 参数新增和修改功能的示例代码,并进行逐行分析。 ### 示例代码 ```cpp #include "ros/ros.h" int main(int argc, char *argv[]) { // 初始化 ROS 节点节点名为 "param_example" ros::init(argc, argv, "param_example"); // 创建 ROS 节点句柄,用于与 ROS 系统进行通信 ros::NodeHandle nh; // 新增一个名为 "new_param" 的参数,值为 10 nh.setParam("new_param", 10); ROS_INFO("New parameter 'new_param' has been added with value 10."); // 检查参数 "new_param" 是否存在 bool param_exists; param_exists = nh.hasParam("new_param"); if (param_exists) { ROS_INFO("Parameter 'new_param' exists."); } else { ROS_INFO("Parameter 'new_param' does not exist."); } // 修改名为 "new_param" 的参数的值为 20 nh.setParam("new_param", 20); ROS_INFO("Parameter 'new_param' has been updated to 20."); // 获取参数 "new_param" 的值 int param_value; nh.getParam("new_param", param_value); ROS_INFO("The current value of 'new_param' is %d.", param_value); return 0; } ``` ### 代码逐行分析 1. `#include "ros/ros.h"`:包含 ROS 核心头文件,该文件定义了 ROS 程序中最常用的 API 函数和类,是编写 ROS 节点的基础 [^3]。 2. `ros::init(argc, argv, "param_example");`:初始化 ROS 节点节点名为 `"param_example"`。`argc` 和 `argv` 用于传递命令行参数。 3. `ros::NodeHandle nh;`:创建一个 ROS 节点句柄 `nh`,用于与 ROS 系统进行通信。节点句柄提供了访问 ROS 系统的各种接口。 4. `nh.setParam("new_param", 10);`:使用节点句柄的 `setParam` 方法新增一个名为 `"new_param"` 的参数,其值为 10。 5. `ROS_INFO("New parameter 'new_param' has been added with value 10.");`:使用 `ROS_INFO` 宏输出日志信息,表示新参数已成功添加。 6. `bool param_exists;`:定义一个布尔变量 `param_exists`,用于存储参数是否存在的信息。 7. `param_exists = nh.hasParam("new_param");`:使用节点句柄的 `hasParam` 方法检查名为 `"new_param"` 的参数是否存在,并将结果存储在 `param_exists` 中。 8. 通过 `if - else` 语句判断参数是否存在,并输出相应的日志信息。 9. `nh.setParam("new_param", 20);`:再次使用 `setParam` 方法将名为 `"new_param"` 的参数的值修改为 20。 10. `ROS_INFO("Parameter 'new_param' has been updated to 20.");`:输出日志信息,表示参数已成功更新。 11. `int param_value;`:定义一个整数变量 `param_value`,用于存储参数的值。 12. `nh.getParam("new_param", param_value);`:使用节点句柄的 `getParam` 方法获取名为 `"new_param"` 的参数的值,并将其存储在 `param_value` 中。 13. `ROS_INFO("The current value of 'new_param' is %d.", param_value);`:输出日志信息,显示参数的当前值。 14. `return 0;`:程序正常结束,返回值为 0。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值