ROS 2基础概念#4:消息(Message)| ROS 2学习笔记

ROS 2消息简介

ROS程序使用三种不同的接口来进行沟通:消息(message),服务(service)和动作(action)。ROS 2使用一种简化的描述语言:IDL(interface definition language)来描述这届接口。这种描述使得ROS工具自动生成不同编程语言的接口类型源代码变得更加简单。

这三种接口类型简介如下。本文主要介绍有关消息的接口。

  • msg: .msg 文件是描述ROS消息定义的简单文本文件。它们被用于生成关于消息定义的不同编程语言的源代码。
  • srv: .srv 文件描述服务(service)。它们包含两个部分:请求(request)和返回(response)。请求和返回都是消息声明(declaration)。
  • action: .action 文件描述动作(action). 它们包含三个部分:目标(goal),结果(result)和反馈(feedback)。每个部分都是一个消息声明。

消息描述规范

消息在ROS软件包的msg/目录下的.msg文件里定义。.msg文件包含两部分内容:fields和constants。

Fields

每个field都包含类型和名称的定义。类型和名称之间用空格分开:

fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3

例如:

int32 my_int
string my_string
Field类型

Field 可以是:

  • ROS 2内置支持的类型 (built-in-types)
  • 开发者自定义的消息名称和类型,例如 “geometry_msgs/PoseStamped”

目前内置支持的类型:

Type nameC++PythonDDS type
boolboolbuiltins.boolboolean
byteuint8_tbuiltins.bytes*octet
charcharbuiltins.str*char
float32floatbuiltins.float*float
float64doublebuiltins.float*double
int8int8_tbuiltins.int*octet
uint8uint8_tbuiltins.int*octet
int16int16_tbuiltins.int*short
uint16uint16_tbuiltins.int*unsigned short
int32int32_tbuiltins.int*long
uint32uint32_tbuiltins.int*unsigned long
int64int64_tbuiltins.int*long long
uint64uint64_tbuiltins.int*unsigned long long
stringstd::stringbuiltins.strstring
wstringstd::u16stringbuiltins.strwstring

所有的内置支持类型都能用于定义数组(array):

Type nameC++PythonDDS type
static arraystd::array<T, N>builtins.list*T[N]
unbounded dynamic arraystd::vectorbuiltins.listsequence
bounded dynamic arraycustom_class<T, N>builtins.list*sequence<T, N>
bounded stringstd::stringbuiltins.str*string

所有比 ROS 定义更宽松的类型都通过软件强制执行 ROS 范围和长度约束。

使用数组(array)和有界(bounded)类型的消息定义示例:

int32[] unbounded_integer_array
int32[5] five_integers_array
int32[<=5] up_to_five_integers_array

string string_of_unbounded_size
string<=10 up_to_ten_characters_string

string[<=5] up_to_five_unbounded_strings
string<=10[] unbounded_array_of_strings_up_to_ten_characters_each
string<=10[<=5] up_to_five_strings_up_to_ten_characters_each
Field名称

Field名称必须是小写字母数字字符,并用下划线分隔单词。 它们必须以字母字符开头,并且不能以下划线结尾或有两个连续的下划线。

Field缺省值

缺省值可以设置为消息类型中的任何字段。 目前,字符串数组和复杂类型不支持缺省值(即上面的内置类型表中不存在的类型;这适用于所有嵌套消息)。

通过向字段定义行添加第三个元素来定义缺省值,即:

fieldtype fieldname fielddefaultvalue

例如:

uint8 x 42
int16 y -2000
string full_name "John Doe"
int32[] samples [-200, -100, 0, 100, 200]

注意:

  • 字符串值必须用单引号或双引号定义
  • 当前字符串值未转义

常量

每个常量定义就像一个具有默认值的字段描述,只不过该值永远不能以编程方式更改。 该值分配通过使用等号“=”来指示,即:

constanttype CONSTANTNAME=constantvalue

例如:

int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'

注意:

常量名必须大写!

ROS 2消息接口的新功能

ROS 2 IDL 与 ROS 1 IDL 密切相关。 大多数现有的 ROS 1 .msg 和 .srv 文件应该可以按原样与 ROS 2 一起使用。在 ROS 1 的现有功能集之上,ROS 2 IDL 引入了一些新功能,即:

  • 有界数组(bounded arrays): ROS 1 IDL 允许无界数组(例如 int32[] foo)和固定大小数组(例如 int32[5] bar),而 ROS 2 IDL 进一步允许有界数组(例如 int32[<=5] bat) 。 在某些用例中,能够为数组的大小设置上限,而不必承诺始终使用那么多空间(例如,在实时系统中,您需要预先分配将要使用的所有内存),这一点在执行期间使用很重要)。
  • 有界字符串(bounded strings): ROS 1 IDL 允许无界字符串(例如 string foo),而 ROS 2 IDL 进一步允许有界字符串(例如 string<=5 bar)。
  • 缺省值(default values): ROS 1 IDL 允许常量字段(例如 int32 X=123),而 ROS 2 IDL 还允许指定默认值(例如 int32 X 123)。 默认值在构造消息/服务对象时使用,随后可以通过分配给字段来覆盖。 您还可以指定操作部分的默认值。

ROS 2消息的命令行工具

列出系统中所有可用消息类型

ros2 msg list

这个命令会显示系统中所有已知的消息类型,包括标准消息和任何已安装的自定义消息。输出示例:

std_msgs/msg/String
geometry_msgs/msg/Twist
sensor_msgs/msg/LaserScan
…

这里,输出包含了多个消息类型,如std_msgs/msg/String,这是一个标准的字符串消息类型。

显示特定消息类型的详细信息

ros2 msg show std_msgs/msg/String

使用这个命令可以查看特定消息类型的结构,包括它的字段和每个字段的类型。这对于理解和使用消息非常有帮助。

string data

这表明std_msgs/msg/String消息只有一个名为data的字段,其类型为string

总结

ROS 2消息为ROS 2系统提供了一种统一的数据传输机制,使得不同节点之间能够进行高效的通信。通过消息,开发者可以定义和传递各种类型的数据,并且能够在节点之间实现灵活、可靠的数据交换。消息的使用能够提高ROS 2系统的模块化程度、可扩展性和可维护性,使其更适用于各种不同的机器人和自动化应用场景。

作者ROS 2学习笔记系列文章:ROS 2学习笔记 归档 - HY's Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深入理解LRU Cache】:缓存算法的经典之作

目录 一、什么是LRU Cache&#xff1f; 二、LRU Cache的实现 1.JDK中类似LRUCahe的数据结构LinkedHashMap 2.自己实现双向链表 三、LRU Cache的OJ 一、什么是LRU Cache&#xff1f; LRU Cache&#xff08;Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0…

游戏行业需要堡垒机吗?用哪款堡垒机好?

相信大家对于游戏都不陌生&#xff0c;上到老&#xff0c;下到小&#xff0c;越来越多的小伙伴开始玩游戏。随着游戏用户的增加&#xff0c;如何保障用户资料安全&#xff0c;如何确保游戏公司数据安全等是一个不容忽视的问题。因此不少人在问&#xff0c;游戏行业需要堡垒机吗…

数据结构----完全二叉树的时间复杂度讲解,堆排序

目录 一.建堆的时间复杂度 1.向上调整算法建堆 2.向下调整算法建堆 二.堆排序 1.概念 2.代码思路 3.代码实现 一.建堆的时间复杂度 1.向上调整算法建堆 我们就以极端情况考虑时间复杂度(满二叉树遍历所有层) 假设所有节点个数为N,树的高度为h N 2^02^12^2......2^(h-…

表的连接【MySQL】

文章目录 什么是连接测试表内连接外连接左外连接右外连接全外连接 自然连接交叉连接参考资料 什么是连接 数据库的连接是指在数据库系统中&#xff0c;两个或多个数据表之间建立的关联关系&#xff0c;使它们可以进行数据的交互和操作。连接通常基于某种共同的字段或条件&…

2.1_2 数据通信基础知识

文章目录 2.1_2 数据通信基础知识&#xff08;一&#xff09;典型的数据通信模型&#xff08;二&#xff09;数据通信相关术语&#xff08;三&#xff09;设计数据通信系统要考虑的3个问题&#xff08;1&#xff09;三种通信方式&#xff08;2&#xff09;串行传输 & 并行传…

开源的python 游戏开发库介绍

本文将为您详细讲解开源的 Python 游戏开发库&#xff0c;以及它们的特点、区别和应用场景。Python 社区提供了多种游戏开发库&#xff0c;这些库可以帮助您在 Python 应用程序中实现游戏逻辑、图形渲染、声音处理等功能。 1. Pygame 特点 - 基于 Python 的游戏开发库。…

C语言分析基础排序算法——交换排序

目录 交换排序 冒泡排序 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化 快速排序非递归版 交换排序 冒泡排序 见C语言基础知识指针部分博客C语言指针-CSDN博客 快速排序 Hoare版本快速排序 Hoare版本快速排序的过程类似于二叉树前序…

程序员常用小工具推荐

前言 工作或者学习时&#xff0c;常常有一些工具能帮到我们很多&#xff0c;本次简单列举和说明&#xff0c;如果有更多更好用的&#xff0c;欢迎讨论补充。 工具大全 网络分析工具 Wireshark,可以很清晰的解析和过滤网络包&#xff0c;也有助于分析网络的的传输原理。linux环…

基于FPGA的HyperRam接口设计与实现

一 HyperRAM 针对一些低功耗、低带宽应用&#xff08;物联网、消费产品、汽车和工业应用等&#xff09;&#xff0c;涉及到外部存储&#xff0c;HyperRAM提供了更简洁的内存解决方案。 HyperRAM具有以下特性&#xff1a; 1、超低功耗&#xff1a;200MHz工作频率下读写不到50mW…

新书速览|Vue.js 3.x+Element Plus从入门到精通(视频教学版)

详解Vue.jsElement Plus框架各组件的用法&#xff0c;实战网上商城系统和图书借阅系统开发 本书内容 《Vue.js 3.xElement Plus从入门到精通&#xff1a;视频教学版》通过对Vue.js&#xff08;简称Vue&#xff09;的示例和综合案例的介绍与演练&#xff0c;使读者快速掌握Vue.j…

计算机网络—eNSP搭建基础 IP网络

目录 1.下载eNSP 2.启动eNSP 3.建立拓扑 4.建立一条物理连接 5.进入终端系统配置界面 6.配置终端系统 7.启动终端系统设备 8.捕获接口报文 9.生成接口流量 10.观察捕获的报文 1.下载eNSP 网上有许多下载eNSP的方式&#xff0c;记得还要下其它三个Virtual Box、Winpa…

HSCCTF 3th 2024 Web方向 题解wp

WEB-CHECKIN【*没出】 直接给了源码 <?php highlight_file(__FILE__); error_reporting(0); $a$_POST[1]; $b"php://filter/$a/resource/dev/null"; if(file_get_contents($b)"2024"){echo file_get_contents(/flag); }else{echo $b; }咋这么像 WEB…

python文件组织:包(package)、模块(module)、文件(file)

包&#xff1a; 模块所在的包&#xff0c;创建一个包用于组织多个模块&#xff0c;包文件夹中必须创建一个名为’__init__.py’的文件&#xff0c;以将其识别为包&#xff0c;否则只能算作是一个普通的目录。在使用该包时&#xff0c;init自动执行。 包可以多层嵌套&#xff…

使用 ReclaiMe Pro 进行 RAIDZ 数据恢复

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ZFS 是一个开源文件系统&#xff0c;主要用于 FreeNAS 和 NAS4Free 存储系统。在开发 ZFS 时&#xff0c;主要目标是可靠性&#xff0c;这是通过写时复制、冗余元数据、日志等不同功能来实现的。ZFS 使用自…

Redis核心数据结构之跳跃表

跳跃表 概述 跳跃表(skiplist)是一种有序数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找&#xff0c;还可以通过顺序性操作来批量处理节点。在大部分情况下&am…

VB 数据质量诊断软件(分析数据的完整性,合理性,准确性)-139-(代码+程序说明)

转载地址http://www.3q2008.com/soft/search.asp?keyword139 前言: 为何口出狂言,作任何VB和ASP的系统, 这个就是很好的一个证明 :) 又有些狂了... 数据库操作谁都会,接触的多了也没什么难的,VB编程难在哪?算法上,这个是一个算法题的毕业设计 哈哈忙活了足足有一○小时, …

C++进阶之路---多态(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、多态的概念 1.概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为…

IPSec NAT穿越原理

一、IPSec VPN在NAT场景中存在的问题 当某些组网中&#xff0c;有的分支连动态的公网IP地址也没有&#xff0c;只能由网络中的NAT设备进行地址转换&#xff0c;才能访问互联网&#xff0c;然而IPsec是用来保护报文不被修改的&#xff0c;而NAT需要修改报文的IP地址&#xff0c…

9、组合模式(结构性模式)

组合模式又叫部分整体模式&#xff0c;它创建了对象组的树形结构&#xff0c;将对象组合成树状结构&#xff0c;以一致的方式处理叶子对象以及组合对象&#xff0c;不以层次高低定义类&#xff0c;都是结点类 一、传统组合模式 举例&#xff0c;大学、学院、系&#xff0c;它们…

崇法致行法律知识竞赛活动方案

赛程安排分两天&#xff0c;两场进行。 第一天&#xff08;第一场&#xff09;&#xff08;初赛&#xff09; 共 16 个二级分行&#xff0c;每行三人&#xff0c;共16 个战队参赛。 第一轮——必答轮 在大屏幕上显示10个选择题&#xff08;5个单选、5个多选&#xff09;&…