RMVL  2.5.0-dev
Robotic Manipulation and Vision Library
载入中...
搜索中...
未找到
消息模块使用教程

上一篇教程:参数模块使用教程
下一篇教程:服务模块使用教程


此模块主要为 轻量发布订阅服务及其相关组件 提供支持,详细使用说明请参考 轻量发布订阅服务 —— LPSS

1 概述

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

2 内置消息类型

以下是一些常用的内置消息类型,分为 6 个主要消息分组:stdgeometrysensormotion导航框架与系统viz。用户可以根据需要在自定义的 *.msg 文件中引用这些内置消息类型。

  • std

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

    类型*.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
    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
    int32 sec
    uint32 nsec
    记录了自 1970 年 1 月 1 日以来的时间
    UInt8
    uint8 data
    表示 8 位无符号整数数据
    UInt16
    uint16 data
    表示 16 位无符号整数数据
    UInt32
    uint32 data
    表示 32 位无符号整数数据
    UInt64
    uint64 data
    表示 64 位无符号整数数据
    Duration
    int64 nanoseconds
    表示纳秒精度的时间间隔;嵌套使用时以小写内置类型 duration 声明
  • 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
    表示空间中的位姿(位置 + 姿态)
    PoseStamped
    Header header
    geometry/Pose pose
    带时间戳和参考坐标系的位姿;header.frame_id 指定位姿所在坐标系
    PoseWithCovariance
    geometry/Pose pose
    float64[36] covariance
    带 6x6 协方差矩阵的位姿,变量顺序为 x、y、z、roll、pitch、yaw
    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
    带时间戳的坐标变换,表示 child_frame_idheader.frame_id 中的位姿,并将子坐标系中的坐标映射到父坐标系
    Twist
    geometry/Vector3 linear
    geometry/Vector3 angular
    表示物体的线速度和角速度
    TwistWithCovariance
    geometry/Twist twist
    float64[36] covariance
    带 6x6 协方差矩阵的速度,变量顺序为 x、y、z、roll、pitch、yaw
    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
    duration time_from_start
    关节轨迹中的单个轨迹点,包含各关节的位置、速度、加速度、力矩以及从轨迹起点到达此点的期望时间
    TF
    geometry/TransformStamped[] transforms
    坐标变换树,包含一组带时间戳的坐标系变换关系

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

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

    nav 消息用于表示移动机器人导航中的里程计、路径和二维占据栅格,嵌套使用时需要使用 nav/ 前缀。

    类型*.msg 定义描述
    Odometry
    Header header
    string child_frame_id
    geometry/PoseWithCovariance pose
    geometry/TwistWithCovariance twist
    带协方差的里程计位姿和速度
    Path
    Header header
    geometry/PoseStamped[] poses
    在同一参考坐标系中排列的位姿序列
    MapMetaData
    time map_load_time
    float32 resolution
    uint32 width
    uint32 height
    geometry/Pose origin
    占据栅格的加载时间、分辨率、尺寸和原点位姿
    OccupancyGrid
    Header header
    nav/MapMetaData info
    uint64 revision
    int8[] data
    带版本号的全量二维占据栅格
    OccupancyGridUpdate
    Header header
    uint64 base_revision
    uint64 revision
    uint32 x
    uint32 y
    uint32 width
    uint32 height
    int8[] data
    基于指定地图版本的矩形栅格增量

    其中

    • Odometry.pose 表示 child_frame_idheader.frame_id 中的位姿
    • Odometry.twist 表示 child_frame_id 的速度并采用 child_frame_id 表达

    常用组合为 odombase_linkPath 中所有位姿的 header.frame_id 必须与路径头一致,路径头时间表示生成时刻,单点时间可用于轨迹时间参数化。

    占据栅格采用 row-major 布局,索引为 y * width + xorigin 表示栅格 (0, 0) 在地图坐标系中的真实位姿,resolution 的单位为米/格。data-1 表示未知、0 表示空闲、100 表示占据;全量地图要求 data.size() == width * height。增量更新还要求矩形完全位于目标地图内且 base_revision 等于当前版本,成功应用后版本更新为 revision

  • 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
)

生成的消息类型位于 rm::msg 命名空间。