ROS的计算图源命名

2024-01-03 23:04
文章标签 计算 ros 命名 图源

本文主要是介绍ROS的计算图源命名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、命名规则
  • 二、名称空间
  • 三、名称解析
  • 四、节点名称重映射
  • 五、话题/服务名称重映射

一、命名规则

ROS中的节点、参数、话题和服务统称为计算图源,其命名方式采用灵活的分层结构,便于在复杂的系统中集成和复用。以下是一些命名的示例:

/foo
/stanford/robot/name
/mq/node1

一个有效的命名应该具备以下特点:

1)首字符必须是字母([a-z|A-Z])、波浪线(~)或者左斜杠(/)。

2)后续字符可以是字母或数字([0-9|a-z|A-Z])、下划线(_)或者左斜杠(/)。

二、名称空间

计算图源命名是ROS封装的一种重要机制。每个资源都定义在一个名称空间内,该名称空间内还可以创建更多资源。但是处于不同名称空间内的资源不仅可以在所处名称空间内使用,还可以在全局范围内访问。这种命名机制可以有效避免不同名称空间内的命名冲突。

ROS提供以下几种设置名称空间的方法:

  • 1)通过编码设置命令参数。调用 ros::init() 的ROS程序会接收名为 __ns 的命令行参数,可以为程序设置默认的名称空间,如下:
std::map<std::string, std::string> map;
map["__ns"] = "namespace";
ros::init(map, "namespace_learning");
  • 2)在launch文件中设置。在launch文件中可通过设置 ns 参数来确定默认名称空间:
<node pkg="package_name " type="file_name" name="node_name" ns="space_name" />
  • 3)命令行中,使用 rosrun 命令参数 __ns:=/xxx 来指定名称空间:
rosrun package_name file_name __ns:=/new_namespace
  • 4)使用环境变量设置。也可以在执行ROS程序的终端中设置默认名称空间的环境变量:
export ROS_NAMESPACE=default-namespace

三、名称解析

计算图源的名称可以分为以下四种,

  • 1)基础(base)名称,例如:name。
  • 2)全局(global)名称,例如:/global/name。
  • 3)相对(relative)名称,例如:relative/name。
  • 4)私有(private)名称,例如:~private/name。

基础名称: 用来描述资源本身,可以看作相对名称的一个子类,上述示例中的name就是一个基础名称。

全局名称: 首字符是左斜杠(/)的名称,由左斜杠分开一系列名称空间,示例中的名称空间为 global。全局名称之所以称为全局,是因为它的解析度最高,可以在全局范围内直接访问。

但是在系统中全局名称越少越好,因为过多的全局名称会直接影响功能包的可移植性。

相对名称: 全局名称需要列出所有名称空间,在名称空间繁多的复杂系统中使用较为不便,所以可以使用相对名称代替。相对名称由ROS提供默认的名称空间,不需要带有开头的左斜杠。

例如在默认名称空间 /relative 内使用相对名称 name,解析到全局名称为 /relative/name

相比全局名称,相对名称具备良好的移植性,用户可以直接将一个相对命名的节点移植到其他名称空间内,有效防止命名冲突。

私有名称: 是一个节点内部私有的资源名称,只会在节点内部使用。私有名称以波浪线 ~ 开始,与相对名称一样,其并不包含本身所在的名称空间,需要ROS为其解析;但不同的是,私有名称并不使用当前默认名称空间,而是用节点的全局名称作为名称空间

例如有一个节点的全局名称是 /sim1/pubvel,其中的私有名称 ~max_vel 解析成全局名称即为 /sim1/pubvel/max_vel

总结命名解析方式如下表:

节点名称空间相对名称全局名称私有名称
/node1/bar -> /bar/bar -> /bar~bar -> /node1/bar
/mq/node2/mqbar -> /mq/bar/bar -> /bar~bar -> /mq/node2/bar
/mq/node3/mqfoo/bar -> /mq/foo/bar/foo/bar -> /foo/bar~foo/bar -> /mq/node3/foo/bar

四、节点名称重映射

所有ROS节点内的资源名称都可以在节点启动时进行重映射。ROS这一强大的特性甚至可以支持我们同时打开多个相同的节点,而不会发生命名冲突。
与名称空间类似,ROS也为名称的设置提供了几种方法:

  • 1)编码方式。

    • C++实现
    // 指定重映射名称
    std::map<std::string, std::string> map;
    map["__name"] = "new_name";
    ros::init(map, "namespace_learning");// 随机重映射名称,会在原有名称后面加时间戳
    ros::init(argc, argv, "namespace_learning", ros::init_options::AnonymousName);
    
    • Python实现
    rospy.init_node("namespace_learning", anonymous=True)
    
  • 2)rosrun 命令行

    在节点启动时可以使用如下方式重映射命名:

    rosrun package_name file_name __name:=new_node_name
    或
    注意该方法不止会重映射节点名称,如有old_name名称的topic或service,也会被重映射
    rosrun package_name file_name old_name:=new_node_name
    
  • 3)在launch文件中设置

    在launch文件中可通过设置 name 参数来设置节点名称:

    <node pkg="package_name" type="file_name" name="new_node_name" />
    

五、话题/服务名称重映射

对于话题和服务,通过编码只能设置名称,不能对名称重映射。

上文提到过,通过 rosrun 可以对话题和服务名称重映射:

rosrun package_name node_name old_name:=new_node_name

通过 launch 文件也可以对话题和服务名称重映射:

<node pkg="package_name" type="file_name" name="node_name"><remap from="old_name" to="new_name" />
</node>

注意,同一节点中,如果有相同名字的话题和服务,以上方法会同时对他们的名称重映射。

这篇关于ROS的计算图源命名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567342

相关文章

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu