ROS NodeHandle命令空间问题
[TOC]
NodeHandle
NodeHandle的作用
- 自动启动关闭ros节点。
- 创建自己的命名空间。
自动启动关闭ros节点
具体细节参考: Ros node启动与关闭
创建自己的命名空间
-
ros基本组件分为nodes、Parameters、Topics和Services。每个组件都带有一个命名空间。
-
Ros命名空间规则如下:
组件名格式是:第一级名字/第二级名字/第三级名字/第四级名字。对于一个具体的Parameters、Topics和Services可以没有第二和第三级名字。
- 通常使用
~
时,其一般作为本节点内部使用,但是不是强制的,外部只要按照组件名格式还是可以使用组件的。
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");