ROS学习 之 命名空间(NameSpace)、重映射(Remapping)、名称(Names)

http://wiki.ros.org/Names
http://wiki.ros.org/Remapping%20Arguments
http://www.cnblogs.com/qixianyu/p/6576075.html
http://www.cnblogs.com/zjiaxing/p/5541841.html

引言

作为一个开源的、分布式的机器人操作系统,众多开发者开发的包并不能保证所有定义的资源命名都不同,一旦含有相同的名称的资源的包在一个ROS网络中运行,就会发生冲突。

因此,在实际的ROS网络中,各个节点、话题、消息和参数的名称必须是唯一的,不然就会发生冲突,这很容易理解。

因此最简单的两种方法,来区分相同名字的资源:

  1. 给两个名字前加上定语,就是 添加命名空间
  2. 给两个名字取个不同的别名,就是 重映射

1. 命名空间

在学习ROS中演示教程turtlesim时,我们创建两个“小龟”,由于默认的节点名都是“turtlesim”,因此通过rosrun turtlesim turtlesim_node运行turtlesim_node节点则会关闭前一个,因为名称冲突了。
这时可以通过添加命名空间来解决:

rosrun turtlesim turtlesim_node __ns:=/aa/bb
rosrun turtlesim turtlesim_node __ns:=/aa/cc

使用rqt_graph来查看节点关系:
这里写图片描述

2. 重映射

除了添加命名空间可以区分相同名字的资源,还可以给资源起一个别名,这就是重映射的本意。

rosrun turtlesim turtlesim_node __name:=A
rosrun turtlesim turtlesim_node __name:=B

使用rqt_graph来查看节点关系:
这里写图片描述


小结:有时候添加命名空间和重映射是同时进行的:

$ rosrun turtlesim turtlesim_node __ns:=/aa/bb __name:=A

此时节点名:

/aa/bb/A

3. 名称(Names)

3.1 图的命名

3.1.1 图的概念(the concepts of Graph)

一直搞不懂ROS中‘图(Graph)’是什么东西,再回头看看哪些东西称作 图:

  • Nodes: A node is an executable that uses ROS to communicate with other nodes.

  • Messages: ROS data type used when subscribing or publishing to a topic.

  • Topics: Nodes can publish messages to a topic as well as subscribe to a topic to receive messages.

  • Master: Name service for ROS (i.e. helps nodes find each other)

  • rosout: ROS equivalent of stdout/stderr

  • roscore: Master + rosout + parameter server (parameter server will be introduced later)

以上来自:http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes


因此从官方的形象化解释可以看出,在ROS系统中的一个对象就是一个图(也称计算图computation graph),或者说是ROS系统的最小组成单位就是图。如任何一个消息、参数、主题和服务等等。

图(Graph)、图资源(Graph Resources)、计算图资源(Computation Graph Resources)是指同一个东西,简称图,或称为资源

3.1.2 有效的名称

有效名称有一下特点:

  1. 第一个是字母字符([a-z|A-Z])、波浪号(~)或正斜杠(/)
  2. 后续字符可以是数字字母([0-9|a-z|A-Z])、下划线(_)或正斜杠(/)

3.1.3 名称解析

图的名称是分层结构化的,由一系列的命名空间构成。这造就了图资源的唯一性。

在ROS中有四种类型的图资源名称:

  • base(基本名称)
  • relative/name (相对名称)
  • /global/name (全局名称)
  • ~private/name (私有名称)

默认情况下,解析是相对于节点的命名空间完成的。这中解析方法简化了编程。

  1. 相对名称:相对名称的解析是依赖默认命名空间的。如默认命名空间为”/” 则名称“A/B”被解析为”/A/B”。
  2. 基本名称:基本名称是没有命名空间限定符的相对名称(即没有/号)。
  3. 全局名称:以“/”开头的名称称为全局名称,代表该名称属于全局命名空间。意思是在ROS系统的任何地方都可以使用。无论在ROS系统的任何地方它都以明确的意义。
  4. 私有名称:私有名称以”~”开头,它与相对图名称的区别是,它的解析不依赖与默认命名空间,而是依赖包名称

默认命名空间是/,他可以使用环境变量ROS_NAMESPACE(默认是没有添加的,可以自己添加)来改变。

示例:

NodeRelative (default)GlobalPrivate
/node1bar -> /bar/bar -> /bar~bar -> /node1/bar
/wg/node2bar -> /wg/bar/bar -> /bar~bar -> /wg/node2/bar
/wg/node3foo/bar -> /wg/foo/bar/foo/bar -> /foo/bar~foo/bar -> /wg/node3/foo/bar

3.1.4 重映射的一些详细参数

http://wiki.ros.org/Remapping%20Arguments

3.2 软件包资源名称

软件包资源名称用于具有文件系统级概念的ROS,以简化引用磁盘上的文件和数据类型的过程。软件包资源名称非常简单:它们只是资源所在的软件包的名称以及资源的名称。例如,名称“std_msgs / String”是指“std_msgs”包中的“String”消息类型。

可能使用包资源名称引用的一些与ROS相关的文件包括:

  • 消息(msg)类型
  • 服务(srv)类型
  • 节点类型

软件包资源名称与文件路径非常相似,但文件路径要短得多。这是由于ROS在磁盘上找到软件包的能力,并对其内容做出了额外的假设。
例如:PacakgeA/b。这个名称指包PackageA中含有b这个文件,具体有几级文件夹并不重要,ROS可以自己去寻找。


有效名称:
软件包资源名称具有严格的命名规则,因为它们经常用于自动生成的代码中。因此,ROS 包不能具有除下划线之外的特殊字符,并且必须以字母字符开头。有效名称具有以下特征:

  • 第一个字符是一个字母字符([az | AZ])
  • 后续字符可以是字母数字([0-9 | az | AZ]),下划线(_)或正斜杠(/)
  • 最多有一个正斜杠(’/’)。
<think>好的,我现在要回答用户关于ROS中话题重映射以及如何通过rosrun实现的例子和解释的问题。首先,我需要回忆一下ROS的基本概念,特别是话题重映射的相关知识。 话题重映射ROS中是一个常见的操作,允许用户动态地更改节点发布或订阅的话题名称。这在多个节点需要通信但使用不同话题名时非常有用,或者在避免命名冲突时也很重要。用户提到的是通过rosrun来实现,所以我需要重点讲解rosrun命令中的重映射语法。 我记得ROS中的重映射语法是通过`:=`符号来实现的。例如,运行节点时,使用`rosrun 包名 节点名 旧话题名:=新话题名`这样的格式。需要确认这个语法是否正确,可能需要查阅官方文档或之前的笔记。 接下来,我需要举一个具体的例子。比如,假设有一个发布者节点发布到`/chatter`话题,而订阅者节点需要订阅`/new_chatter`。这时候可以通过在运行订阅者时进行重映射,将订阅的话题从默认的`/chatter`改为`/new_chatter`。或者反过来,在运行发布者时改变它发布的话题名称。 另外,可能需要解释一下匿名节点的概念。当运行多个相同节点时,为了避免话题冲突,可以使用`__name`参数来重映射节点名称,同时也可以结合话题重映射。例如,`rosrun beginner_tutorials talker __name:=talker2 /chatter:=/new_chatter`。 然后,我需要确保用户理解这些操作的语法和实际应用场景。比如在多个传感器数据需要重映射到统一的话题时,或者在集成不同团队开发的节点时,可能需要调整话题名称以匹配。 同时,需要检查是否有相关的常见问题,比如用户在使用rosrun时可能遇到的节点找不到的问题,这可能与功能包路径或安装有关,但用户的问题主要关注重映射,所以这部分可能不需要深入,但可以适当提及引用中的内容,比如引用[2]提到的rosrun找不到节点的问题,可能的原因和解决方法。 最后,生成相关问题,例如如何同时重映射多个话题,或者在launch文件中如何实现重映射,以及重映射的优先级问题。这些都能帮助用户进一步了解相关主题。 总结一下,回答的结构应该是: 1. 解释话题重映射的概念和作用。 2. 使用rosrun进行重映射的语法和示例。 3. 可能的匿名节点和多个重映射的情况。 4. 注意事项和常见问题。 5. 生成相关问题。 需要确保使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不到数学公式。引用用户提供的引用[1]和[2]时,在适当的位置添加脚注,比如在提到创建功能包或节点找不到的问题时。</think>### ROS话题重映射rosrun实现方法 #### 一、话题重映射基础概念 话题重映射(Topic Remapping)是ROS中动态修改节点通信话题名称的功能。通过该功能,可以**在不修改代码的情况下**调整节点发布或订阅的话题名称,适用于以下场景: 1. 集成不同命名规范的节点 2. 避免多节点运行时的话题冲突 3. 快速调试时修改通信通道 #### 二、rosrun实现方法 基本语法格式: ```bash rosrun [package_name] [node_name] [old_topic_name]:=new_topic_name ``` ##### 示例1:单话题重映射 假设存在发布者节点`talker`,默认发布到`/chatter`话题: ```bash # 重映射到/new_chatter rosrun beginner_tutorials talker chatter:=new_chatter ``` 此时节点实际发布的话题变为`/new_chatter`,订阅者需相应修改订阅话题[^1]。 ##### 示例2:匿名节点+重映射 当运行多个相同节点时,建议组合使用匿名节点和重映射: ```bash rosrun beginner_tutorials talker __name:=talker1 chatter:=sensor1_data rosrun beginner_tutorials talker __name:=talker2 chatter:=sensor2_data ``` 通过`__name`参数指定节点名称,避免名称冲突[^2]。 #### 三、多话题同时重映射 支持对同一节点的多个话题进行重映射: ```bash rosrun my_pkg my_node \ camera/image_raw:=camera_front/image_raw \ gps/data:=gps/nmea_data ``` #### 四、优先级规则 1. 命令行重映射 > launch文件重映射 > 代码默认值 2. 支持相对名称和全局名称: ```bash rosrun demo_pkg node image:=camera/image # 相对名称 rosrun demo_pkg node /image:=/camera/raw # 全局名称 ``` #### 五、验证方法 1. 使用`rostopic list`查看当前活跃话题 2. 通过`rqt_graph`可视化节点连接关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值