ROS消息的基本概念
在ROS中,消息是节点之间传递数据的结构化数据。每种消息类型都定义了一组字段,这些字段可以是基本数据类型(如整数、浮点数、布尔值等),也可以是其他消息类型。消息类型通常以.msg文件的形式定义,并存储在ROS包中。
常用的ROS消息类型
-
标准消息类型
ROS提供了一些标准消息类型,这些类型在许多应用中都非常常用。以下是一些常见的标准消息类型:
-
std_msgs/String: 用于传递字符串数据。格式非常简单,仅包含一个字段:
plaintextstring data -
std_msgs/Int32: 用于传递32位整数。格式如下:
plaintextint32 data -
std_msgs/Float64: 用于传递64位浮点数。格式如下:
plaintextfloat64 data -
std_msgs/Bool: 用于传递布尔值。格式如下:
plaintextbool data
-
-
几何消息类型
几何消息类型用于描述空间中的位置、方向和变换。这些消息类型在机器人运动和导航中非常重要。
-
geometry_msgs/Point: 用于表示三维空间中的点。格式如下:
plaintextfloat64 x float64 y float64 z -
geometry_msgs/Quaternion: 用于表示旋转。格式如下:
plaintextfloat64 x float64 y float64 z float64 w -
geometry_msgs/Pose: 用于表示位置和方向的组合。格式如下:
plaintextgeometry_msgs/Point position geometry_msgs/Quaternion orientation -
geometry_msgs/Twist: 用于表示速度,包括线速度和角速度。格式如下:
plaintextgeometry_msgs/Vector3 linear geometry_msgs/Vector3 angular
-
-
传感器消息类型
传感器消息类型用于传递从传感器获取的数据。这些消息类型在机器人感知中非常重要。
-
sensor_msgs/Image: 用于传递图像数据。格式较为复杂,包含以下字段:
plaintextstd_msgs/Header header uint32 height uint32 width string encoding uint8 is_bigendian uint32 step uint8[] data -
sensor_msgs/LaserScan: 用于传递激光扫描数据。格式如下:
plaintextstd_msgs/Header header float32 angle_min float32 angle_max float32 angle_increment float32 time_increment float32 scan_time float32 range_min float32 range_max float32[] ranges float32[] intensities
-
-
导航消息类型
导航消息类型用于机器人路径规划和导航。
-
nav_msgs/Odometry: 用于传递里程计数据。格式如下:
plaintextstd_msgs/Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist -
nav_msgs/Path: 用于传递路径数据。格式如下:
plaintextstd_msgs/Header header geometry_msgs/PoseStamped[] poses
-
三、详细说明消息类型
ROS 的 .msg 文件定义了消息内部的数据结构。
基本格式规则如下:
text
字段类型 字段名称
每行定义一个字段。
例如:
text
int32 id
string name
geometry_msgs/Pose pose
这定义了一个包含三个成员变量的消息:整型 id、字符串 name 和另一个复合消息 pose。
ROS 支持的基本数据类型包括:
| 类型 | 说明 |
|---|---|
| bool | 布尔值 |
| int8, int16, int32, int64 | 带符号整数 |
| uint8, uint16, uint32, uint64 | 无符号整数 |
| float32, float64 | 浮点数 |
| string | 字符串 |
| time, duration | 时间与时长 |
| 其他消息类型 | 引用已有消息(例如:geometry_msgs/Pose) |
| 数组类型 | 在类型后加中括号,例如:float64[] values |
四、ROS 常用标准消息类型
ROS 已定义了许多常用的标准消息包,便于开发者直接使用。
1. std_msgs 标准类型
最基础的消息类型,主要用于简单数据传输。
常见类型:
| 消息类型 | 说明 |
|---|---|
std_msgs/Bool |
布尔值 |
std_msgs/Int32 |
32 位整数 |
std_msgs/Float64 |
双精度浮点 |
std_msgs/String |
字符串 |
std_msgs/Header |
消息头(包含时间戳和坐标系) |
Header 通常用于含有时空属性的消息(如传感器数据、位姿等)。
2. geometry_msgs 几何信息类型
用于描述位置、姿态、速度等空间信息。
| 消息类型 | 说明 |
|---|---|
geometry_msgs/Point |
表示三维坐标点(x, y, z) |
geometry_msgs/Quaternion |
四元数姿态(x, y, z, w) |
geometry_msgs/Pose |
包含 Point 和 Quaternion,描述位姿 |
geometry_msgs/Twist |
线速度和角速度 |
geometry_msgs/Transform |
坐标变换结构 |
geometry_msgs/PoseStamped |
带时间戳的位姿信息 |
3. sensor_msgs 传感器数据类型
用于传输常见传感器的数据,如激光、相机、IMU 等。
| 消息类型 | 说明 |
|---|---|
sensor_msgs/LaserScan |
激光雷达扫描数据 |
sensor_msgs/Image |
图像帧数据 |
sensor_msgs/Imu |
惯性测量单元数据 |
sensor_msgs/PointCloud2 |
点云数据 |
sensor_msgs/JointState |
机械关节状态 |
sensor_msgs/Range |
距离传感器数据 |
这类消息通常较大并包含 Header,保证时空同步性。
4. nav_msgs 导航与路径规划消息
与定位、地图、路径等相关。
| 消息类型 | 说明 |
|---|---|
nav_msgs/Odometry |
里程计信息(位置 + 速度) |
nav_msgs/Path |
路径序列(多个 PoseStamped) |
nav_msgs/OccupancyGrid |
栅格地图数据 |
nav_msgs/GetMap |
服务接口,获取地图 |
5. actionlib_msgs 动作通信相关
与 action 动作机制配套使用:
| 消息类型 | 说明 |
|---|---|
GoalID |
动作目标标识符 |
GoalStatusArray |
动作状态数组 |
五、自定义消息类型
在开发中,你可以创建自己的消息类型。
步骤:
-
在功能包中创建
msg目录:bashmkdir -p my_pkg/msg -
创建消息文件:
MyData.msgtextint32 id string name float64[] data -
在
package.xml中声明依赖:xml<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend> -
在
CMakeLists.txt中添加:cmakefind_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation ) add_message_files(FILES MyData.msg) generate_messages(DEPENDENCIES std_msgs) catkin_package(CATKIN_DEPENDS message_runtime) -
编译并使用:
bashcatkin_make然后即可在代码中引用:
cpp#include "my_pkg/MyData.h"
六、ROS2 中的消息格式与 DDS 类型支持
ROS2 继承了 ROS1 的 .msg 格式,但底层通过 DDS(Data Distribution Service) 进行通信。
因此:
- 消息定义语法基本相同;
- 支持
.msg,.srv,.action; - 编译工具从
catkin改为colcon + ament_cmake; - 可与多语言(C++, Python, Rust)无缝互通。
在 ROS2 中创建自定义消息的流程与 ROS1 类似,只是构建系统不同。
七、总结
| 分类 | 包名 | 典型消息 | 用途 |
|---|---|---|---|
| 基础类型 | std_msgs | String, Bool, Int32 | 基本通信 |
| 几何类型 | geometry_msgs | Pose, Twist, Quaternion | 位姿与运动描述 |
| 传感器类型 | sensor_msgs | LaserScan, Image, Imu | 获取环境信息 |
| 导航类型 | nav_msgs | Odometry, Path, Map | 定位与地图 |
| 动作类型 | actionlib_msgs | GoalID, GoalStatus | 任务与控制 |
| 自定义类型 | 用户自定义 | 任意结构 | 特定业务需求 |
八、附注
- ROS 消息类型是通信契约 ,发布者与订阅者需使用完全一致的消息定义。
- 使用
rosmsg show(ROS1)或ros2 interface show(ROS2) 可查看消息结构。 - 借助
rostopic pub/echo或ros2 topic pub/echo可在命令行调试消息。
结语:
ROS 的消息定义机制为分布式机器人系统提供了统一的数据格式标准。理解这些基础消息类型和格式,是构建机器人应用(如导航、感知、控制等)的基本功。掌握后,开发者可以轻松扩展并实现适合自己机器人架构的数据接口。