自定义ROS topic 的常用消息格式及类型

ROS消息的基本概念

在ROS中,消息是节点之间传递数据的结构化数据。每种消息类型都定义了一组字段,这些字段可以是基本数据类型(如整数、浮点数、布尔值等),也可以是其他消息类型。消息类型通常以.msg文件的形式定义,并存储在ROS包中。

常用的ROS消息类型

  1. 标准消息类型

    ROS提供了一些标准消息类型,这些类型在许多应用中都非常常用。以下是一些常见的标准消息类型:

    • std_msgs/String: 用于传递字符串数据。格式非常简单,仅包含一个字段:

      plaintext 复制代码
      string data
    • std_msgs/Int32: 用于传递32位整数。格式如下:

      plaintext 复制代码
      int32 data
    • std_msgs/Float64: 用于传递64位浮点数。格式如下:

      plaintext 复制代码
      float64 data
    • std_msgs/Bool: 用于传递布尔值。格式如下:

      plaintext 复制代码
      bool data
  2. 几何消息类型

    几何消息类型用于描述空间中的位置、方向和变换。这些消息类型在机器人运动和导航中非常重要。

    • geometry_msgs/Point: 用于表示三维空间中的点。格式如下:

      plaintext 复制代码
      float64 x
      float64 y
      float64 z
    • geometry_msgs/Quaternion: 用于表示旋转。格式如下:

      plaintext 复制代码
      float64 x
      float64 y
      float64 z
      float64 w
    • geometry_msgs/Pose: 用于表示位置和方向的组合。格式如下:

      plaintext 复制代码
      geometry_msgs/Point position
      geometry_msgs/Quaternion orientation
    • geometry_msgs/Twist: 用于表示速度,包括线速度和角速度。格式如下:

      plaintext 复制代码
      geometry_msgs/Vector3 linear
      geometry_msgs/Vector3 angular
  3. 传感器消息类型

    传感器消息类型用于传递从传感器获取的数据。这些消息类型在机器人感知中非常重要。

    • sensor_msgs/Image: 用于传递图像数据。格式较为复杂,包含以下字段:

      plaintext 复制代码
      std_msgs/Header header
      uint32 height
      uint32 width
      string encoding
      uint8 is_bigendian
      uint32 step
      uint8[] data
    • sensor_msgs/LaserScan: 用于传递激光扫描数据。格式如下:

      plaintext 复制代码
      std_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
  4. 导航消息类型

    导航消息类型用于机器人路径规划和导航。

    • nav_msgs/Odometry: 用于传递里程计数据。格式如下:

      plaintext 复制代码
      std_msgs/Header header
      string child_frame_id
      geometry_msgs/PoseWithCovariance pose
      geometry_msgs/TwistWithCovariance twist
    • nav_msgs/Path: 用于传递路径数据。格式如下:

      plaintext 复制代码
      std_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 包含 PointQuaternion,描述位姿
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,保证时空同步性。


与定位、地图、路径等相关。

消息类型 说明
nav_msgs/Odometry 里程计信息(位置 + 速度)
nav_msgs/Path 路径序列(多个 PoseStamped
nav_msgs/OccupancyGrid 栅格地图数据
nav_msgs/GetMap 服务接口,获取地图

5. actionlib_msgs 动作通信相关

action 动作机制配套使用:

消息类型 说明
GoalID 动作目标标识符
GoalStatusArray 动作状态数组

五、自定义消息类型

在开发中,你可以创建自己的消息类型。

步骤:

  1. 在功能包中创建 msg 目录:

    bash 复制代码
    mkdir -p my_pkg/msg
  2. 创建消息文件:
    MyData.msg

    text 复制代码
    int32 id
    string name
    float64[] data
  3. package.xml 中声明依赖:

    xml 复制代码
    <build_depend>message_generation</build_depend>
    <exec_depend>message_runtime</exec_depend>
  4. CMakeLists.txt 中添加:

    cmake 复制代码
    find_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)
  5. 编译并使用:

    bash 复制代码
    catkin_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/echoros2 topic pub/echo 可在命令行调试消息。

结语:

ROS 的消息定义机制为分布式机器人系统提供了统一的数据格式标准。理解这些基础消息类型和格式,是构建机器人应用(如导航、感知、控制等)的基本功。掌握后,开发者可以轻松扩展并实现适合自己机器人架构的数据接口。

相关推荐
kalvin_y_liu6 天前
Lumi 具神智能机器人 SDK说明和ACT算法中的学习与推理
人工智能·ai·ros
lihongli00012 天前
ros中的Navigation导航系统
自动驾驶·ros
lihongli00012 天前
ROS与Qt结合开发CAN控制界面(发布自定义的truck_send_can1消息)
开发语言·qt·ros
酌量14 天前
从 ROS 订阅视频话题到本地可视化与 RTMP 推流全流程实战
经验分享·笔记·ffmpeg·音视频·ros
lihongli00016 天前
修改ros工作空间名称方法与步骤
ubuntu·ros
lihongli00017 天前
CAN、ROS数据录制与rqt图形化显示
自动驾驶·ros·激光雷达
Mr.Winter`20 天前
深度强化学习 | 基于SAC算法的动态避障(ROS C++仿真)
人工智能·深度学习·神经网络·机器人·自动驾驶·ros·具身智能
老黄编程23 天前
ros2 中 CMakeLists.txt 的 ament_package 有什么用?有什么使用约束?必须放置尾部吗?
ros·cmake
老黄编程23 天前
ros2 功能包 package.xml 结构详细解释
ros