ROS Nodehandle句柄的理解

NodeHandle的作用

自动启动关闭ros节点。
创建自己的命名空间。

自动启动关闭ros节点

具体细节参考: Ros node启动与关闭

命名空间

ros中的节点、话题和参数的名称必须是唯一的,但是在项目中一定会有相同的名字,为了区分这两个相同的名字,就使用命名空间和重映射这两种办法。
命名空间和重映射的理解

创建自己的命名空间

1.ros基本组件分为nodes、Parameters、Topics和Services。每个组件都带有一个命名空间。

2.Ros命名空间规则如下:
在这里插入图片描述

组件名格式是:第一级名字/第二级名字/第三级名字/第四级名字。对于一个具体的Parameters、Topics和Services可以没有第二和第三级名字。

3.通常使用~时,其一般作为本节点内部使用,但是不是强制的,外部只要按照组件名格式还是可以使用组件的。

NodleHandle的构造函数的命名空间

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命名空间

指定全局名字
使用/(全局命名空间)

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

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

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

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

.launch 文件中 ns==“node_namespace”

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

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

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

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

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

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

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

参考连接

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值