ros基础必看之namespace详解心得

160 篇文章 13 订阅

转载自:https://blog.csdn.net/ahelloyou/article/details/105596163

ros基础必看之namespace详解心得

黑猫爱小鹿 2020-04-18 11:54:13 272 收藏 3

分类专栏: ros

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ahelloyou/article/details/105596163

版权

ros::init(argc,argv,“node_name”)

  • argc argv是命令行或者是launch文件的输入的参数,第三个参数是定义的node_name可以被launch文件覆盖。

命名空间

名称分类

全局名称

/rosout前面的反斜杠“/”表明该节点名称属于全局命名空间。之所以叫做全局名称因为它们在任何地方(包括代码、命令行工具、图形界面工具等的任何地方)都可以使用。无论这些名称用作众多命令行工具的参数还是用在节点内部,它们都有明确的含义。这些名称从来不会产生二义性,也无需额外的上下文信息来决定名称指的哪个资源

相对名称

开头没有“/” ROS会为相对名称提供一个默认的命名空间(默认为“/”),但你可以为每个节点设置默认命名空间。
(1)rosrun turtlesim turtlesim_node __ns:=/my
(2)在launch文件中设置命名空间用到的属性是ns (ns设置的是默认命名空间)
这两个设置的是node_namespace相对于全局“/”还是自己设置的

ex:

<node pkg=“homework_1” type=“tursim2” name=“turtle3” output=“screen” ns=“li”/>

<node pkg=“turtlesim” type=“turtlesim_node” name=“turtle1” ns=“ll”/>

在这里插入图片描述
/ll/node_name/topic

私有名称

私有名称以一个波浪字符(“~”)开头
私有名称也不能够完全确定它们自身所在的命名空间,和相对名称的区别是 私有名称使用的不是默认命名空间,而是用它们的节点名称作为命名空间
每个节点内部都有一些资源,这些资源只与本节点相关,不会与其他节点打交道,这时候为了安全我们使用私有名称。

实例

句柄可以让你通过构造函数指定命名空间。
ros::NodeHandle nh(“my_namespace”);
这使得使用该句柄的任何相对名字都是相对<node_namespace>/my_namespace,而不是只相对<node_namespace>

ros::init(argc, argv, “name”);
ros::NodeHandle nh("~"); //创造句柄的时候指明了其命名空间为私有命名空间
ros::Subscriber sub = nh.subscribe(“topic”, …); //订阅的话题是 name/topic
ros::Publisher pub = nh.advertise(“topic”, …); //发布的话题是 nmae/topic

总结

ros在某个命名空间里生成的服务,他的名称都是相对于他的命名空间,,也就是心里要转化成全局的名字看看是否一致。或者如果是全局的干脆 /全局名称。

ns不会影响nodehandle 生成变量的的命名空间。但会影响其他方式生成变量的命名空间

节点相对名称(默认)全局名称私有名称
/node1bar->/bar/bar->/bar~bar->/node1/bar
/wg/node1bar->/wg/node1/bar->/bar~bar->/wg/node/bar
/wg/node3foo/bar->/wg/foo/bar/foo/bar->/foo/bar~foo/bar->/wg/node3/bar

上面的wg是用户自己设置的默认命名空间

参考写的很好
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

也就是说一切都在node_namespace之下再考虑别的东西


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_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

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值