ROS中NodeHandle句柄 理解 您所在的位置:网站首页 ros的节点node是什么 ROS中NodeHandle句柄 理解

ROS中NodeHandle句柄 理解

2024-07-05 01:06| 来源: 网络整理| 查看: 265

写在前面

本文转载自 ROS中NodeHandle问题 https://blog.csdn.net/u012700322/article/details/52244329

ROS Nodehandle句柄 https://blog.csdn.net/jack_20/article/details/70746736

一、ROS中NodeHandle问题 - 原文

今天想把写的坐标转换package,改写成在launch文件中传入参数。中间遇到了一个小问题,特此记录一下。

ros::init(argc, argv, "sub"); ros::NodeHandle n; ros::NodeHandle pn("~"); double x; pn.param("/x",p_x, 0.3); ros::init(argc, argv, "sub"); ros::NodeHandle n; //ros::NodeHandle pn("~"); double x; n.param("x",p_x, 0.3);

以上两种写法都是正确的。

ros::init(argc, argv, "sub"); ros::NodeHandle n; ros::NodeHandle pn("~"); double x; pn.param("x",p_x, 0.3);

但是这种写法是错误的。 这是为什么呢?

这就涉及到NodeHandle的参数范围问题。如下:

ros::init(argc, argv, "my_node_name"); ros::NodeHandle nh1("~"); ros::NodeHandle nh2("~foo");

nh1的命名空间(namespace)是 /my_node_name,而nh2的namespace是 /my_node_name/foo

这里只是一个例子,一个ros的node只有一个NodeHandle,它提供这个node的对于topic的收发功能.

在这里插入图片描述

注:

在ROS中NodeHandle可以参考:

http://wiki.ros.org/roscpp_tutorials/Tutorials/AccessingPrivateNamesWithNodeHandle

http://wiki.ros.org/roscpp_tutorials/Tutorials/Parameters

二、ROS Nodehandle句柄 - 原文

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

ros::NodeHandle nh("my_namespace");

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

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

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

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

2、也可以指定全局名字

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

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

3、私有名字

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

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

以上例子会订阅/my_private_namespace/my_private_topic

注意:理解的重点上文中红色标注的部分,node_namespace和node_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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有