由浅到深理解ROS(3)-命名空间

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

由浅到深理解ROS(3)-命名空间
全局命名空间:
/rosout前⾯的反斜杠“/”表明该节点名称属于全局命名空间。

之所以叫做全局名称因为它们在任何地⽅(包括代码、命令⾏⼯具、图形界⾯⼯具等的任何地⽅)都可以使⽤。

⽆论这些名称⽤作众多命令⾏⼯具的参数还是⽤在节点内部,它们都有明确的含义。

这些名称从来不会产⽣⼆义性,也⽆需额外的上下⽂信息来决定名称指的哪个资源。

如/turtle1/cmd_vel 由斜杠分开的⼀系列命名空间(namespace),每个斜杠代表⼀级命名空间。

命名空间⽤于将相关的计算图源(节点、话题、服务和参数统称为计算图源,⽽每个计算图源由⼀个叫计算图源名称(graph resource name)的短字符串识)归类在⼀起。

为了指明⼀个计算图源,需要完整列出其所属的命名空间,尤其是有时候命名空间层次⽐较多,这可能会让你抓狂。

这时,⼀个主要替代⽅案是让ROS为计算图源提供⼀个默认的命名空间,具有此特征的名称叫做相对计算图源名称(ralative graph resource name),或简称为相对名称(relative name)。

相对名称:
相对名称的典型特征是它缺少全局名称带有的前斜杠“/”。

例如:cmd_vel 及 count_and_log/set_logger_level理解相对名称的关键是,如果不知道ROS 解析某个计算图源时所使⽤的默认命名空间,相对名称并不能和特定计算图源匹配。

解析相对名称:将相对名称转化为全局名称的过程相当简单。

ROS将当前默认的命名空间的名称加在相对名称的前⾯,从⽽将相对名解析为全局名称。

⽐如,如果我们在默认命名空间为/turtle1 的地⽅使⽤相对名称cmd_vel,那么ROS 通过组合⽅法得 /turtle1 + cmd_vel ⇒ /turtle1/cmd_vel
相对名称也可以以⼀系列的命名空间开始,这些命名空间被看作是默认命名空间中的嵌套空间。

举个例⼦,如果我们在默认命名空间为/a/b/c/d/e/f 的地⽅使⽤相对空间
g/h/i/j/k,ROS 将会将其进⾏组合为全局命名空间/a/b/c/d/e/f /g/h/i/j/k/l 得到的全局名称就可以⽤于确定⼀个特定的计算图源,就像前⾯介绍全局名称的使⽤时⼀样。

当⼀个节点内的计算图源全部使⽤相对名称时,这本质上给⽤户提供了⼀种⾮常简单的移植⼿段,即⽤户能⽅便地将此节点和话题移植到其他的(⽐如⽤户⾃⼰程序的)命名空间,⽽节点的原设计者并不⼀定参与这个过程。

这种灵活性可以使得⼀个系统的组织结构更清晰,更重要的是能够防⽌在整合来⾃不同来源的节点发⽣名称冲突。

作为对⽐,如果所有节点都使⽤全局名称命名⾃⼰的计算图源,就很难实现这种⾼效资源整合。

所以,除⾮⼀些特殊情况有特殊要求,否则编写节点时并不推荐使⽤全局名称。

私有名称:
私有名称,以⼀个波浪字符(~)开始,是第三类也是最后⼀类计算图源名称。

和相对名称⼀样,私有名称并不能完全确定它们⾃⾝所在的命名空间,⽽是需要ROS 客户端库将这个名称解析为⼀个全局名称。

与相对名称的主要差别在于,私有名称不是⽤当前默认命名空间,⽽是⽤的它们节点名称作为命名空间。

例如,有⼀个节点,它的全局名称是 /sim1/pubvel,ROS 将其私有名称∼max_vel 转换⾄如下全局名称:/sim1/pubvel + ~max_vel⇒ /sim1/pubvel/max_vel 这种命名⽅式适⽤的地⽅是每个节点内部都有这样⼀些资源,这些资源只与本节点有关,⽽不会与其他节点打交道,这些资源就可以使⽤私有名称,与松耦合性相对的。

私有名称的关键字“private”仅仅表⽰其他节点不会使⽤它们所在的命名空间,也就是仅在命名空间层⾯上有意义。

对于其他节点来讲,只要知道私有名称解析后的全局名称,都可以通过其全局名称访问这些计算图源。

这和C++等其他类似编程语⾔中的关键字“private”是不同的,在这些编程语⾔中,系统中的其他部分是不能访问某个类的私有成员变量的。

相关文档
最新文档