2021SC@SDUSC
目录
一、写在前面
上一节我们分析了ROS节点间进行通信的数据格式以及解析方式,但正如在源码分析开始时我们所说,ROS是一个分布式的系统,因此节点之间通讯不仅需要恰当的数据格式,而且需要一个命名系统使消息能够路由至正确的位置.在本节我们将分析namespace包下有关节点命名与解析的代码.
二、ROS中节点的名称类型
ROS中有三种类型的类型的节点名称:全局名称、相对名称和私有名称.下面我们将类比Linux下的文件系统来解释ROS的命名策略与命名格式.
全局名称类似Linux中的绝对路径,它指明了从根节点开始的路径从而提供了一个不依赖上下文的路径搜索方式.如使用cd /usr/local/opt切换目录,系统解析路径后会从根节点开始逐层搜索直到进入指定目录.在ROS中,全局名称同样是以/开头的.
相对名称类似Linux中的相对路径,它指明了从某个路径点开始的路径,因此搜索结果与当前路径有关.如在Linux中使用cd bin进入目录,如果在/usr/local/tomcat下执行这个命令,则会进入/usr/local/opt/tomcat/bin目录,但如果在/users/admin/mysql目录下执行这个命令,则会进入/users/admin/mysql/bin目录.可见这种方式究竟进入哪个目录取决于当前的目录.在ROS中,相对名称以下级路径开头,没有前缀.
私有名称可以类比相对名称,它指明了从某个路径点开始的路径,但系统自动进行一层转换而从当前路径下的私有路径中进行搜索.假设在/users/admin目录下访问一个私有路径files,则实际进入的路径是/users/admin/.private_$(whoami)/files,这样就实现了私有路径的访问.在ROS中私有名称是以~开头的.
另外ROS中还有一类匿名节点名称,匿名路径与其它路径并无不同,只是通过这种方式表示一类孤儿节点或想要隐藏的节点,这种做法与Linux下以 . 开头的隐藏文件或隐藏路径是相似的.
三、GraphName
public class GraphName {
@VisibleForTesting
static final String ANONYMOUS_PREFIX = "anonymous_";
private static final String ROOT = "/";
private static final St