ROS2标准消息
ROS2的标准消息(Standard Messages)是ROS2生态中预定义的通用数据结构,由多个官方包(如std_msgs、sensor_msgs、geometry_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用于显示标记)。
二、标准消息的使用原则
- 优先使用标准消息:避免重复定义,例如发布距离数据优先用
sensor_msgs/msg/Range,而非自定义消息。 - 正确填充
Header:stamp需设置为数据采集的时间戳(而非发布时间),frame_id需指定数据所属的坐标系(如激光雷达的lidar_link)。 - 了解字段含义:例如
LaserScan.ranges数组长度需与angle_min、angle_max、angle_increment匹配((angle_max - angle_min)/angle_increment + 1)。 - 查看消息详情:使用
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应用(尤其是驱动、感知、控制模块)的基础。实际开发中,可根据硬件类型和业务需求选择合适的消息类型,或基于标准消息扩展自定义消息。
更多推荐



所有评论(0)