ROS Nodehandle(句柄总结)

launch文件解释

    <node pkg="a12_rename03_param" type="param_learn" name="node_learn" ns="node_namespace" output="screen" />

  • pkg:节点所在的功能包名称
  • type:节点的可执行文件名称,如对param_learn.cpp节点type="param_learn"
  • name:节点运行时名称,如在语句 ros::init(argc,argv,"node_learn");中 ,name="node_learn",如果在launch文件中将name设为其他名称"param_learn",那即便代码里写的是"node_learn",也会被覆盖为"param_learn"
  • output:运行信息输出位置,如输出至屏幕:output="screen"
  • ns =“ foo”(可选)。在指定命名空间 “ foo” 中启动节点。

Nodehandle-句柄学习

    <node pkg="a12_rename03_param" type="param_learn" name="node_name" ns="node_namespace" output="screen" />

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

ros::init(argc, argv, "node_name");

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

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

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

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

2、也可以指定全局名字,使用“/”(全局命名空间)

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

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

3、私有名字,使用“~”(私有命名空间)

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

ros::NodeHandle nh("~my_private_namespace");    //  /node_namespace/node_name/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    // /node_namespace/node_name

launch文件里ns="node_namespace",且 name = "node_name"与ros::init里的node_name一样

    <node pkg="a12_rename03_param" type="param_learn" name="node_learn" ns="node_namespace" output="screen" />
// 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

launch文件里没有ns

    <node pkg="a12_rename03_param" type="param_learn" name="node_name" output="screen" />
// launch 文件中没有 ns
ros::init(argc, argv, "node_name"); // node name
ros::NodeHandle n;              // n  命名空间为:  /
ros::NodeHandle n1("sub");      // n1 命名空间为:  /sub
ros::NodeHandle n2(n1,"sub2");  // n2 命名空间为:  /sub/sub2
ros::NodeHandle pn1("~");       // pn1 命名空间为: /node_name
ros::NodeHandle pn2("~sub");    // pn2 命名空间为: /node_name/sub
ros::NodeHandle pn3("~/sub");   // pn3 命名空间为: /node_name/sub
ros::NodeHandle gn("/global");  // gn  命名空间为: /global

launch文件里没有ns,且name = "node_learn",不是 node_name

    <node pkg="a12_rename03_param" type="param_learn" name="node_learn" output="screen" />
// launch 文件中没有 ns,且name = "node_learn",不是 node_name
ros::init(argc, argv, "node_name"); // node name
ros::NodeHandle n;              // n  命名空间为:  / 
ros::NodeHandle n1("sub");      // n1 命名空间为:  /sub
ros::NodeHandle n2(n1,"sub2");  // n2 命名空间为:  /sub/sub2
ros::NodeHandle pn1("~");       // pn1 命名空间为: /node_learn
ros::NodeHandle pn2("~sub");    // pn2 命名空间为: /node_learn/sub
ros::NodeHandle pn3("~/sub");   // pn3 命名空间为: /node_learn/sub
ros::NodeHandle gn("/global");  // gn  命名空间为: /global

节点句柄相关用法
 

ros::NodeHandle nh         // n  命名空间为:  /
ros::NodeHandle map_layer(nh, "static_layer");     // n2 命名空间为:  /static_layer

// 将节点句柄 nh 下名为 "unknown_cost_value" 的参数的值从原始的命名空间(可能是全局命名空间)移动到名为 map_layer 的节点句柄的命名空间下。
// 例如:原来是: /unknown_cost_value  变为  /static_layer/unknown_cost_value
move_parameter(nh, map_layer, "unknown_cost_value");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值