ROS 命名空间,名称

相关课程视频下载链接
和彩云 网盘链接:
链接:和彩云网盘
提取码:qo1z
简介:和彩云网盘是中国移动旗下的网盘,目前对免费用户下载不限速,只要简单注册一个账号就可以下载

迅雷云盘 网盘链接:
迅雷网盘链接
提取码:h22t
简介:迅雷网盘 免费用户下载虽然限速,但是比百度网盘要好

百度网盘:
链接:百度网盘链接
提取码:HHZN
简介:如果你是VIP那就用百度网盘吧。

基本概念

上一篇:ROS launch 文件相关操作
如果不同包内含有相同的节点,不同的节点发布同名的话题会不会产生二义性?答案是会。
从编译的角度讲,同名的节点指的是生成同样节点名的可执行程序,而从运行的角度讲,只要ros::init(“node_name”) 函数内的node_name相同就是同名的节点,不管运行程序的名字叫什么,都视为同名的节点,当同一个节点在没终止前,再一次运行它,与同名的两个节点同时运行时,两种情况都会异常退出。
不同节点发布同名的话题,两个节点能正常运行,但是使用命令rostopic list查看是,列表中只会有一个topic名称.如果有节点订阅了这个话题,那么订阅节点将会接受到来自两个发布节点的消息数据,如果数据没有区分,并不能知道当前接收到的数据来自哪个节点发出来的。所以很多时候我们并不希望这样,除非特殊的需求设计(比如我们需要用一个节点专门收集其他节点错误信息,当然不同节点的错误信息一般都会通过错误码之类的区分开来)。
命名空间应用于ros的 节点、话题、同时还有参数,这里只讲节点、话题,参数部分留在以后再讲。
命名空间的作用当然是防止命名滥用造成的冲突,当我们同一个节点同时执行的时候就会终止程序运行,ros master 判断依据就是根据命名空间来的,也就是说如果我们改变了两次运行同一个节点的命名空间,使之不同,这样就可以同时运行这一个节点两次。
如:
我们先运行
rosrun pkg_name node_name
随后我们再开个终端运行
rosrun pkg_name node_name __ns:=new_name
以上两次运行同一个节点并不会报任何错。

具体实施

但是很多时候我们就是需要这样子话题名,那么就是要通过命名空间来区分了。比如我们需要区分不同节点的同名的子话题名,如果在初始化ros::NodeHandle nh("~")函数时,传递参数“~”就会在话题发布名前,自动添加节点名的私有空间名。

以上讲的都是相对名称,还有一种全局名称,默认全局名称就是“/”,所有节点以及默认的话题名都是全局命名空间下。
假如有这样的发布话题:

	ros::Publisher pub1 = n.avdertise<std_msgs::String>(/chatter”,10);
    ros::Publisher pub2 = n.avdertise<std_msgs::String>(“chatter”,10);

加上“/”的话题名会屏蔽所有其他命名空间,只会设置当前自定义的命名作为话题。而没有“/”的话题名会跟随设置的命名空间来设置自己发布的话题名称。
有时候我们需要修改全局命名空间,当然一般时候不需要修改,假设有这样一种情况,我们有一个元包,元包里面有多个节点,节点需要发布的子话题有可能相同,想通过话题名知道来自哪个元包,又不想去改发布器初始化代码,我们可以通过两种方式去修改全局命名空间,一是通过添加运行参数“_ _ns”(两个下划线不需要空格):
rosrun pkg_name node_name __ns:=/new_name/此处有没有“/”都可以,
以上两个下划线“/”都可以省略,ROS会自动添加。另外我们通过修改shell内执行的ROS程序默认命名空间环境变量,也就是在执行程序前,先运行这条命令:
export ROS_NAMESPACE=new_name
这需要对linux系统有一点了解比如我们修改ROS_NAMESPACE变量之后,再去查看/proc/(节点程序对应的PID)/environ文件就能看到变量的值。当然在launch文件中都可通过以上两种方式间接修改,如下;
修改属性ns:
<node pkg="pkg_name" type="node_name" name="node_name" ns="new_name"/>
或者修改元素env:

	<node pkg="pkg_name" type="node_name" name="node_name">
            <env name="ROS_NAMESPACE" value="
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值