ROS2的标准消息(Standard Messages)是ROS2生态中预定义的通用数据结构,由多个官方包(如std_msgssensor_msgsgeometry_msgs等)提供,用于节点间传递常见类型的数据(如传感器数据、控制指令、几何信息等)。使用标准消息可以避免重复定义,提高不同节点、不同包之间的兼容性。

一、核心消息包与常用消息类型

ROS2的标准消息主要分布在以下几个包中,每个包针对特定场景设计:

1. std_msgs:基础数据类型

最基础的消息包,包含简单的数据类型(如整数、字符串、布尔值),是其他复杂消息的“ building blocks ”。

消息类型 用途 关键字段示例
std_msgs/msg/String 传递字符串数据 data: "Hello ROS2"
std_msgs/msg/Int32 32位整数 data: 42
std_msgs/msg/Float64 64位浮点数 data: 3.1415
std_msgs/msg/Bool 布尔值(true/false) data: true
std_msgs/msg/Header 消息头(时间戳+坐标系) stamp: <时间戳>, frame_id: "base_link"
std_msgs/msg/Empty 空消息(仅作为触发信号) 无字段

示例Header是多数复杂消息的必填字段,用于标记数据的时间戳(stamp)和所属坐标系(frame_id),对多传感器同步和坐标转换至关重要。

2. geometry_msgs:几何与运动信息

用于描述机器人运动、姿态、坐标等几何相关数据,是控制和导航的核心消息。

消息类型 用途 关键字段示例
geometry_msgs/msg/Point 3D空间点(x,y,z) x: 1.0, y: 2.0, z: 0.5
geometry_msgs/msg/Vector3 3D向量(如速度、加速度) x: 0.5, y: 0.0, z: 0.0
geometry_msgs/msg/Quaternion 四元数(表示姿态) x: 0.0, y: 0.0, z: 0.0, w: 1.0(单位四元数,无旋转)
geometry_msgs/msg/Pose 位姿(位置+姿态) position: <Point>, orientation: <Quaternion>
geometry_msgs/msg/Twist 速度(线速度+角速度) linear: <Vector3>(x/y/z线速度), angular: <Vector3>(x/y/z角速度)
geometry_msgs/msg/Transform 坐标变换(源→目标) translation: <Vector3>(平移), rotation: <Quaternion>(旋转)

示例Twist常用于发布机器人速度指令(如/cmd_vel话题),控制底盘移动;Pose用于描述物体在空间中的位置和姿态。

3. sensor_msgs:传感器数据

最常用的消息包之一,定义了各类传感器的标准数据格式,是传感器驱动开发的核心。

消息类型 用途 关键字段示例
sensor_msgs/msg/LaserScan 激光雷达扫描数据 header: <Header>, angle_min(起始角度), angle_max(终止角度), ranges(距离数组)
sensor_msgs/msg/Image 图像数据(如相机输出) header: <Header>, height(高度), width(宽度), encoding: "rgb8"(编码), data(像素数组)
sensor_msgs/msg/Imu IMU(惯性测量单元)数据 header: <Header>, orientation: <Quaternion>(姿态), angular_velocity: <Vector3>(角速度), linear_acceleration: <Vector3>(线加速度)
sensor_msgs/msg/Range 距离传感器数据(超声波/红外) header: <Header>, range(距离值), min_range(最小量程), max_range(最大量程)
sensor_msgs/msg/BatteryState 电池状态数据 voltage(电压), current(电流), percentage(剩余电量0~1)
sensor_msgs/msg/NavSatFix GPS定位数据 latitude(纬度), longitude(经度), altitude(海拔)

示例:激光雷达驱动发布LaserScan消息到/scan话题,包含每个角度的距离数据;相机驱动发布Image消息到/image_raw话题,包含原始像素数据。

4. nav_msgs:导航相关数据

用于导航模块(如定位、路径规划)的数据交换。

消息类型 用途 关键字段示例
nav_msgs/msg/Odometry 里程计数据(位置+速度) header: <Header>, pose: <PoseWithCovariance>(带协方差的位姿), twist: <TwistWithCovariance>(带协方差的速度)
nav_msgs/msg/Path 路径规划结果(一系列位姿) header: <Header>, poses: [<PoseStamped>, ...](时间戳+位姿的数组)
nav_msgs/msg/OccupancyGrid 占据栅格地图(如SLAM输出) header: <Header>, info: <MapMetaData>(地图尺寸/分辨率), data(栅格数据,-1=未知,0=空闲,100=占据)

示例:底盘驱动发布Odometry消息到/odom话题,提供机器人的里程计信息;SLAM算法发布OccupancyGrid消息到/map话题,输出环境地图。

5. 其他常用消息包
  • action_msgs:动作通信相关(如GoalStatus)。
  • diagnostic_msgs:系统诊断信息(如传感器状态、硬件健康度)。
  • tf2_msgs:坐标变换相关(如TFMessage用于广播坐标关系)。
  • visualization_msgs:RViz可视化数据(如Marker用于显示标记)。

二、标准消息的使用原则

  1. 优先使用标准消息:避免重复定义,例如发布距离数据优先用sensor_msgs/msg/Range,而非自定义消息。
  2. 正确填充Headerstamp需设置为数据采集的时间戳(而非发布时间),frame_id需指定数据所属的坐标系(如激光雷达的lidar_link)。
  3. 了解字段含义:例如LaserScan.ranges数组长度需与angle_minangle_maxangle_increment匹配((angle_max - angle_min)/angle_increment + 1)。
  4. 查看消息详情:使用ros2 interface show <消息类型>命令查看字段定义,例如:
    ros2 interface show sensor_msgs/msg/LaserScan
    

三、示例:使用标准消息发布数据

以发布激光雷达数据(LaserScan)为例,核心代码片段:

from sensor_msgs.msg import LaserScan
from std_msgs.msg import Header

# 构造LaserScan消息
msg = LaserScan()
msg.header.stamp = node.get_clock().now().to_msg()  # 时间戳
msg.header.frame_id = "lidar_link"  # 坐标系
msg.angle_min = -1.57  # 左极限(-90度,弧度)
msg.angle_max = 1.57   # 右极限(90度,弧度)
msg.angle_increment = 0.01  # 角度步长(约0.57度)
msg.range_min = 0.1    # 最小测距
msg.range_max = 10.0   # 最大测距
msg.ranges = [1.2, 1.3, 1.4, ...]  # 距离数组(长度需匹配角度范围)

# 发布消息
node.laser_pub.publish(msg)

ROS2标准消息是节点间通信的“通用语言”,熟悉这些消息的结构和用途,是开发ROS2应用(尤其是驱动、感知、控制模块)的基础。实际开发中,可根据硬件类型和业务需求选择合适的消息类型,或基于标准消息扩展自定义消息。

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐