| RMVL 2.4.0 Robotic Manipulation and Vision Library

载入中...
搜索中...
未找到
消息模块使用教程

上一篇教程：参数模块使用教程
下一篇教程：扩展模块使用教程

此模块主要为 轻量发布订阅服务 提供支持，详细使用说明请参考 轻量发布订阅服务 —— LPSS 。

## 1 概述

RMVL 消息描述文件（*.msg）用于定义消息的数据结构和字段类型，类似于 ROS 消息定义文件。通过定义消息描述文件，用户可以方便地在 RMVL 中进行数据传输，这在分布式系统、网络通信中尤为重要。 RMVL 提供了一套简洁的消息定义语法，与 ROS/ROS 2 的定义语法大致兼容，同样支持多种数据类型和较为复杂的数据结构。

## 2 内置消息类型

以下是一些常用的内置消息类型，分为 5 个主要分组：std、geometry、sensor、motion 和 viz。用户可以根据需要在自定义的 *.msg 文件中引用这些内置消息类型。

- std 消息分组

  std 消息包含了一些基本的数据类型，包含 Header、string 以及其他基本的数据类型，嵌套使用时无需使用 std/ 前缀，除 Header 和 ColorRGBA 存储多值的消息类型外，其他均为单值存储。

  类型 | *.msg 定义 | 描述
  --- | --- | ---
  `Bool` | bool data | 表示布尔值数据
  `Char` | char data | 表示字符数据
  `ColorRGBA` | float32 r float32 g float32 b float32 a | 表示颜色的红、绿、蓝和透明度分量
  `Float32` | float32 data | 表示 32 位单精度浮点数数据，采用 float 存储
  `Float64` | float64 data | 表示 64 位双精度浮点数数据，采用 double 存储
  `Header` | uint32 seq time stamp string frame_id | 包含序列号、时间戳和坐标系 ID 的标准消息头
  `Int8` | int8 data | 表示 8 位有符号整数数据
  `Int16` | int16 data | 表示 16 位有符号整数数据
  `Int32` | int32 data | 表示 32 位有符号整数数据
  `Int64` | int64 data | 表示 64 位有符号整数数据
  `String` | string data | 表示字符串数据，底层采用 std::string 存储
  `Time` | time data | 记录了自 1970 年 1 月 1 日以来的时间，一般采用毫秒时间戳
  `UInt8` | uint8 data | 表示 8 位无符号整数数据
  `UInt16` | uint16 data | 表示 16 位无符号整数数据
  `UInt32` | uint32 data | 表示 32 位无符号整数数据
  `UInt64` | uint64 data | 表示 64 位无符号整数数据

- geometry 消息分组

  geometry 消息用于表示空间中的几何概念，如点、向量、姿态和变换，嵌套使用时需要使用 geometry/ 前缀。

  类型 | *.msg 定义 | 描述
  --- | --- | ---
  `Point` | float64 x float64 y float64 z | 表示空间中的一个点，采用双精度浮点数存储
  `Point32` | float32 x float32 y float32 z | 表示空间中的一个点，采用单精度浮点数存储
  `Polygon` | geometry/Point32[] points | 表示空间中的一个多边形，由多个点组成，采用单精度浮点数存储
  `Pose` | geometry/Point position geometry/Quaternion orientation | 表示空间中的位姿（位置 + 姿态）
  `Quaternion` | float64 x float64 y float64 z float64 w | 表示空间中的旋转姿态（四元数）
  `Transform` | geometry/Vector3 translation geometry/Quaternion rotation | 表示两个坐标系之间的变换关系（平移 + 旋转）
  `TransformStamped` | Header header string child_frame_id geometry/Transform transform | 带时间戳的坐标变换，表示从 `header.frame_id` 到 `child_frame_id` 的变换
  `Twist` | geometry/Vector3 linear geometry/Vector3 angular | 表示物体的线速度和角速度
  `Vector3` | float64 x float64 y float64 z | 表示空间中的一个 3D 向量
  `Wrench` | geometry/Vector3 force geometry/Vector3 torque | 表示作用在物体上的力和力矩

  在自定义 *.msg 文件中使用 geometry 分组的消息时，需要手动指定分组前缀，即要手动添加 geometry/ 前缀，例如：

  # 自定义消息类型 PoseX.msg
  Header header
  geometry/Pose pose
  string pose_name

- sensor 消息分组

  sensor 消息用于表示来自传感器的原始数据，例如惯性测量单元（IMU）和相机，嵌套使用时需要使用 sensor/ 前缀。

  类型 | *.msg 定义 | 描述
  --- | --- | ---
  `CameraInfo` | Header header uint32 height uint32 width float64[5] D float64[9] K | 表示相机的校准和配置参数
  `Image` | Header header uint32 height uint32 width string encoding uint8 is_bigendian uint32 step uint8[] data | 表示图像数据
  `Imu` | Header header geometry/Quaternion orientation float64[9] orientation_covariance geometry/Vector3 angular_velocity float64[9] angular_velocity_covariance geometry/Vector3 linear_acceleration float64[9] linear_acceleration_covariance | 表示来自 IMU 的数据，包括姿态、角速度和线加速度
  `JointState` | Header header string[] name float64[] position float64[] velocity float64[] effort | 表示单自由度关节的状态信息，例如机械臂、机器人的关节角度、速度和力矩
  `MultiDOFJointState` | Header header string[] joint_names geometry/Transform[] transforms geometry/Twist[] twist geometry/Wrench[] wrench | 表示多自由度关节的状态信息，例如包含球形关节、飞行器的6自由度基座关节的位姿、速度和力矩

  与 geometry 分组的消息类似，在自定义 *.msg 文件中使用 sensor 分组的消息时，需要手动指定分组前缀，即要手动添加 sensor/ 前缀，例如：

  # 自定义消息类型 SCARA.msg
  Header header
  string robot_name
  uint8[4] ip
  sensor/JointState joint_state

- motion 消息分组

  motion 消息用于表示运动相关的数据，例如轨迹、坐标变换树等内容，嵌套使用时需要使用 motion/ 前缀。

  类型 | *.msg 定义 | 描述
  --- | --- | ---
  `JointTrajectory` | Header header string[] joint_names motion/JointTrajectoryPoint[] points | 关节轨迹，包含轨迹点序列，描述了一组关节随时间的运动规划
  `JointTrajectoryPoint` | float64[] positions float64[] velocities float64[] accelerations float64[] effort int64 time_from_start | 关节轨迹中的单个轨迹点，包含各关节的位置、速度、加速度、力矩以及从轨迹起点到达此点的期望时间
  `TF` | geometry/TransformStamped[] transforms | 坐标变换树，包含一组带时间戳的坐标系变换关系

  与 geometry 分组的消息类似，在自定义 *.msg 文件中使用 motion 分组的消息时，需要手动指定分组前缀，即要手动添加 motion/ 前缀，例如：

  # 自定义消息类型 ArmPlan.msg
  Header header
  string robot_name
  motion/JointTrajectory trajectory

- viz 消息分组

  viz 消息用于表示可视化相关的数据，例如标记、路径和交互式控制，嵌套使用时需要使用 viz/ 前缀。

  类型 | *.msg 定义 | 描述
  --- | --- | ---
  `Marker` | Header header uint32 id uint8 type uint8 action geometry/Pose pose geometry/Vector3 scale ColorRGBA color geometry/Point[] points ColorRGBA[] colors geometry/Point[] points ColorRGBA[] colors | 标记显示，允许以编程方式向 LViz 3D 视图添加各种基本形状
  `MarkerArray` | Header header viz/Marker[] markers | 标记显示数组，允许一次发布多个标记以提高效率

## 3 自动代码生成

RMVL 提供了 rmvl_generate_msg 的 CMake 函数，用于生成消息类型的 C++ 代码文件，用于生成独立模块的消息类型。用户只需在模块的 CMakeLists.txt 文件中调用该函数，并提供消息类型的名称和路径，RMVL 将自动生成相应的 C++ 代码文件。

# 根据 msg/test.msg 文件生成消息类型代码
# 将生成 rmvlmsg/test.hpp 头文件
rmvl_generate_msg(test)
# 根据 msg/dir/test.msg 文件生成消息类型代码
# 将生成 rmvlmsg/dir/test.hpp 头文件
rmvl_generate_msg(dir/test)
# 根据 msg/test2.msg 文件生成消息类型代码，并指定其绑定的子模块 sub
# 将生成 rmvlmsg/test2.hpp 头文件
rmvl_generate_msg(
test2
MODULE sub
)
# 根据 msg/dir/test2.msg 文件生成消息类型代码，并指定其绑定的子模块 sub
# 将生成 rmvlmsg/dir/test2.hpp 头文件
rmvl_generate_msg(
dir/test2
MODULE sub
)