ROS中节点、话题、参数重命名以及全局、相对、私有命名空
间(⽰例+代码)
ROS中的命名空间
我们⾸先要了解⼀下路径的各个部分所代表的含义:
① 以话题为例,三级路径:
② 以节点为例,共有⼆级路径:
③ 以参数为例,共有三级路径:
ROS中的命名空间分为三种:全局、相对、私有。其实命名空间就是名称的前缀,前缀代表着所在路径,存放的位置可以相对于根⽬录、节点、节点句柄的命名空间这三者来进⾏划分:
私有、全局、相对命名空间判断的依据:
私有命名空间“/node_name”节点名称在最外侧
全局命名空间仅有⼀个“/”根⽬录在最外侧
相对命名空间“/namespace”节点句柄命名空间在最外侧
话题命名空间的设置
1. cpp源⽂件设置:
话题⾸先要在master中注册,所以注册话题信息的函数是节点句柄调⽤的,因此相对/私有命名空间的设置是靠节点句柄完成的。相对和私有命名空间的设置如下所⽰:
1// 全局命名空间:topic=/chatter
2ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter",10);
3// 相对命名空间:topic=/namespace/chatter
4ros::NodeHandle nh("dr");
5ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
6// 相对命名空间:topic= /node_name/namespace/ chatter
7ros::NodeHandle nh("~dr");
8ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
namespace是干嘛的9// 私有命名空间:topic=/node_name/chatter
10ros::NodeHandle nh("~");
11ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
当我们的topic设置为”/chatter”(带有斜杠)且全局优先级最⾼,因此topic不会受到namspace和node_name的影响。
2. rosrun命令⾏设置:
除此之外,还可以使⽤rosrun给该.cpp⽂件中所有的属性添加相对命名空间,具体形式为:rosrun package_name cpp_name __ns:="hello",运⾏结果如下所⽰:
在该节点所在⽂件中所有的话题、所有的上报参数、所有的节点名称都将加上/hello/的前缀。
注意:__ns:=”global_namespace”是双下划线。
3. 修改⼯程的环境变量ROS_NAMESPACE(修改global_namespace)
⼀开始ROS_NAMESPACE的内容为空,我们将ROS_NAMESPACE设置为HELLO之后,在运⾏以下cpp源⽂件,结果如下图所⽰:
话题的重命名
话题的重命名⼜名为“话题的映射(remapping)“,是为了防⽌如下情况发⽣⽽提出的:
1. 情况⼀:
订阅者C需要的是发布者A的data1⽽⾮发布者B的data2,所以我们需要将发布者A/订阅者C之间的topic映射为topic_a,使得订阅者C⼜可以接收到发布者A的data1,同时不改变发布者B的topic:
2. 情况⼆:
我们需要将topic映射为topic_a,使得发布者A与订阅者C可以通过同⼀topic完成连接:
话题的重映射可以通过以下两种操作完成:
① 在rosrun中更改topic名称
形式如下:rosrun package_name cpp_name topic_name:="topic_new_name",结果如下所⽰:
输⼊命令:rosrun demo04 testServer /server/dr/chatter:="A“
② 在launch⽂件中使⽤<remap>标签
1<launch>
2 <remap from="/server/remap/chatter" to="A"/>
3</launch>
节点命名空间的设置
① 使⽤launch⽂件中<node>标签的ns属性
1<launch>
2 <node name="node_A" type="testServer" pkg="demo04" ns="hello"/>
3</launch>
结果如下所⽰:
如果使⽤ns⼦标签得出的路径为相对命名空间,如若没有使⽤ns⼦标签得出的路径为全局命名空间。
② rosrun命令
具体形式:rosrun package_name cpp_name __ns:="hello",运⾏结果如下所⽰:
在该节点所在⽂件中所有的话题、所有的上报参数、所有的节点名称都将加上/hello/的前缀。
注意:__ns:=”global_namespace”是双下划线,这⾥得出的路径为相对命名空间。
③ 使⽤cpp源⽂件设置
1<launch>
2 <!-- 全局:/node_A -->
3 <node name="node_A" type="testServer" pkg="demo04"/>
4 <!-- 相对:/hello/node_A -->
5 <node name="node_A" type="testServer" pkg="demo04" ns="hello"/>
6</launch>
注意:节点的命名空间⼀共有两层,分别为“相对”和“全局”。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论