ROS学习 之 命名空间(NameSpace)、重映射(Remapping)、名称(Names)
2017-08-03 11:23
465 查看
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. 命名空间
在学习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 有效的名称
有效名称有一下特点:第一个是字母字符([a-z|A-Z])、波浪号(~)或正斜杠(/)
后续字符可以是数字字母([0-9|a-z|A-Z])、下划线(_)或正斜杠(/)
3.1.3 名称解析
图的名称是分层结构化的,由一系列的命名空间构成。这造就了图资源的唯一性。在ROS中有四种类型的图资源名称:
base(基本名称)
relative/name (相对名称)
/global/name (全局名称)
~private/name (私有名称)
默认情况下,解析是相对于节点的命名空间完成的。这中解析方法简化了编程。
相对名称:相对名称的解析是依赖默认命名空间的。如默认命名空间为”/” 则名称“A/B”被解析为”/A/B”。
基本名称:基本名称是没有命名空间限定符的相对名称(即没有/号)。
全局名称:以“/”开头的名称称为全局名称,代表该名称属于全局命名空间。意思是在ROS系统的任何地方都可以使用。无论在ROS系统的任何地方它都以明确的意义。
私有名称:私有名称以”~”开头,它与相对图名称的区别是,它的解析不依赖与默认命名空间,而是依赖包名称。
默认命名空间是/,他可以使用环境变量ROS_NAMESPACE(默认是没有添加的,可以自己添加)来改变。
示例:
Node | Relative (default) | Global | Private |
---|---|---|---|
/node1 | bar -> /bar | /bar -> /bar | ~bar -> /node1/bar |
/wg/node2 | bar -> /wg/bar | /bar -> /bar | ~bar -> /wg/node2/bar |
/wg/node3 | foo/bar -> /wg/foo/bar | /foo/bar -> /foo/bar | ~foo/bar -> /wg/node3/foo/bar |
3.1.4 重映射的一些详细参数
http://wiki.ros.org/Remapping%20Arguments3.2 软件包资源名称
软件包资源名称用于具有文件系统级概念的ROS,以简化引用磁盘上的文件和数据类型的过程。软件包资源名称非常简单:它们只是资源所在的软件包的名称以及资源的名称。例如,名称“std_msgs / String”是指“std_msgs”包中的“String”消息类型。可能使用包资源名称引用的一些与ROS相关的文件包括:
消息(msg)类型
服务(srv)类型
节点类型
软件包资源名称与文件路径非常相似,但文件路径要短得多。这是由于ROS在磁盘上找到软件包的能力,并对其内容做出了额外的假设。
例如:PacakgeA/b。这个名称指包PackageA中含有b这个文件,具体有几级文件夹并不重要,ROS可以自己去寻找。
有效名称:
软件包资源名称具有严格的命名规则,因为它们经常用于自动生成的代码中。因此,ROS 包不能具有除下划线之外的特殊字符,并且必须以字母字符开头。有效名称具有以下特征:
第一个字符是一个字母字符([az | AZ])
后续字符可以是字母数字([0-9 | az | AZ]),下划线(_)或正斜杠(/)
最多有一个正斜杠(’/’)。
相关文章推荐
- EF框架实体类映射成数据库字段的办法,未能找到类型或命名空间名称“NotMapped”(是否缺少 using 指令或程序集引用?)
- 学习笔记(二)C#获取当前正在执行的代码的命名空间、类、方法的名称
- C++学习小疑问:类的名称能否和命名空间的名称相同?
- Struts 2 学习笔记:Struts 2 的命名空间(namespace)的用法和作用
- EF框架实体类映射成数据库字段的办法,未能找到类型或命名空间名称“NotMapped”(是否缺少 using 指令或程序集引用?)
- 找不到类型或命名空间名称“type/namespace”(是否缺少 using 指令或程序集引用?)
- 【学习笔记】熟悉并使用TypeScript的命名空间namespace
- Fluent Ribbon项目出现“命名空间“clr-namespace:Fluent;assembly=Fluent”中不存在“RibbonWindow”名称”的解决方法
- struts2 命名空间 namespace 学习
- 一步一个脚印学习WCF系列之WCF基础术语—契约的名称与命名空间(二)
- ROS进二阶学习笔记(5)- 命名与命名空间
- 命名空间“clr-namespace:LOADING.Converters”中不存在“PathToImageConverterLeft”名称
- 《设计模式:基于C#的工程化实现及扩展》学习笔记 02 准备篇 -- Namespace(命名空间)
- PHP学习笔记:对命名空间(namespace)学习资料的翻译
- NameSpace命名空间的学习
- struts2 命名空间 namespace 学习
- 一步一个脚印学习WCF之二构建一个简单的WCF应用程序前必须掌握的WCF基础术语---契约的名称与命名空间
- C++ 命名空间namespace .
- “std”: 具有该名称的命名空间不存在
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型 分类: 嵌入式开发学习 2014-11-28 10:42 233人阅读 评论(0) 收藏