ROS学习之计算图源命名
ROS的一些命名规则
0.1全局名称
全局名称,之所以叫做全局名称因为它们在任何地方(译者注:包括代码、命令行工具、图形界面工具等的任何地方)都可以使用。无论这些名称用作众多命令行工具的参数还是用在节点内部,它们都有明确的含义。这些名称从来不会产生二义性,也无需额外的上下文信息来决定名称指哪个资源。比如一下例子
/teleop_turtle
/turtlesim
/turtle1/cmd_vel
说明:
1)前斜杠“/”表明这个名称为全局名称。
2)由斜杠分开的一系列命名空间(namespace),每个斜杠代表一级命名空间。你可能已经猜到了,命名空间用于将相关的计算图源归类在一起。上述名称例子包含了两个显式的命名空间,分别为 turtle1 和 count_and_log。ROS
3)描述资源本身的基本名称(base name)。上述例子中的基本名称分别为:teleop_turle、cmd_vel
我们必须意识到,如果在任何地方都使用全局名称,除了可能使人更容易追踪变量外,并不能从使用复杂的命名空间中受益多少。这种命名系统的真正优势来自于相对名称和私有名称。
0.2相对名称
将相对名称转化为全局名称的过程相当简单。ROS将当前默认的命名空间的名称加在相对名称的前面,从而将相对名解析为全局名称。比如,如果我们在默认命名空间为/turtle1的地方使用相对名称 cmd_vel,那么 ROS 通过下面的组合方法得到全局名称:
/turtle1 + cmd_vel ⇒ /turtle1/cmd_vel
为节点选择一个不同的默认命名空间的最好也是最常用的方法是在启动文件中使用命名空间(ns)属性
(待补充)
0.3私有名称
私有名称,以一个波浪字符(~)开始,是第三类也是最后一类计算图源名称。和相对名称一样,私有名称并不能完全确定它们自身所在的命名空间,而是需要 ROS 客户端库将这个名称解析为一个全局名称。与相对名称的主要差别在于,私有名称不是用当前默认命名空间,而是用的它们节点名称作为命名空间。例如,有一个节点,它的全局名称是 /sim1/pubvel,ROS 将其私有名称∼max_vel 转换至如下全局名称:
/sim1/pubvel + ~max_vel ⇒ /sim1/pubvel/max_vel
这种命名方式基于如下事实,每个节点内部都有这样一些资源,这些资源只与本节点有关,而不会与其他节点打交道,这些资源就可以使用私有名称。
0.4匿名名称
除了以上三种基本的命名类型,ROS 还提供了另一种被称为匿名名称的命名机制,一般用于为节点命名(译者注:这里的匿名并不是指没有名字,而是指非用户指定而又没有语义信息的名字)。匿名名称的目的是使节点的命名更容易遵守唯一性的规则。其思路是,当节点调用 ros::init 方法时可以请求一个自动分配的唯一名称。为 了 请 求 一 个 匿 名 名 称 , 节 点 需 要 将ros::init_options::Anonymous-Name 作 为 第 四 个 参 数 传 递 给ros::init 方法:ros::init(argc, argv, base_name, ros::init_options::AnonymousName);这个附加选项的作用是在节点的基本名称后面追加某个额外的文本,以确保节点的名字是唯一的。