【机器人】ROS2 自定义消息协议设计(msg)与话题观测指南(topic)


🔥大奇个人主页 :https://blog.csdn.net/m0_75192474?type=blog

本文所属专栏:https://blog.csdn.net/m0_75192474/category_13131150.html

在实际开发中,我们通常要定义出自己的数据类型,因为我们的原始数据跟ROS的数据类型大多都不匹配,所以我们需要自定义数据类型,同时接入ROS中。本文将完整、详细地讲解在ROS2 Humble版本中,如何从零创建自定义消息、配置编译环境。

ROS1版本自定义消息可以看这篇文章 地址

🤠 创建消息类型源文件msg

首先你应该有一个ROS的标准功能包,如果没有的话可以使用 ros2 pkg create 创建,然后在该目录下创建一个 msg文件夹

ROS2 消息支持的常用基本数据类型包括:

  • bool:布尔类型(true/false)
  • int8、uint8、int16、uint16、int32、uint32、int64、uint64:整数类型
  • float32、float64:浮点数类型
  • string:字符串类型
  • 数组类型:type[] 表示动态长度数组
    当然也可以添加ros标准数据类型,用了其他消息必须在cmakelist.txt中写 DEPENDENCIES

然后就可以创建以 .msg为后缀的消息类型了,就拿 **RawSpeed.msg**这个文件来说,我创建了三个float32的数据

消息文件必须以大写字母开头,不能用下划线开头,驼峰命名法

  • 正确:ImuData.msg

  • 错误:imu_data.msg_Imu.msg

    float32 speed_vx
    float32 speed_vy
    float32 speed_vz

或者 RawLidar.msg

复制代码
int32 sec             # 时间戳 秒
uint32 nanosec        # 时间戳 纳秒
float32[] distance       # 360个点的距离值 单位:m
float32[] intensity      # 360个点的强度值

紧接着创建RawImu.msg RawMag.msg ,以上就是我们的自定义的四个数据类型了

🔥 配置CMakeLists.txt

配置CMakeLists.txt文件是生成自定义消息头文件的必经之路,关系到我们能否在项目中使用它

添加以下内容

复制代码
set(msg_files
	msg/RawImu.msg
	msg/RawLidar.msg
	msg/RawSpeed.msg
	msg/RawMag.msg
)

这个表示的使用Cmakeset命令,将我们编写的 msg文件存储到 msg_files变量中

复制代码
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
DEPENDENCIES
)

ROS2 中,是用来编译你自定义的 .msg / .srv / .action 接口文件,由于我们的msg文件中没有添加ROS2标准数据类型,所以不用写依赖。

复制代码
rosidl_get_typesupport_target(cpp_typesupport_target ${PROJECT_NAME} "rosidl_typesupport_cpp")
target_link_libraries(udptoros_node
    ${cpp_typesupport_target}
)

找到当前包编译出来的 自定义消息 C++ 类型支持库 ,并把它赋值给变量 ${cpp_typesupport_target};把自定义消息库链接到节点 ,让 C++ 代码可以 #include 并使用你自己写的 .msg

udptoros_node 换成你的可执行文件名

🥊 配置package.xml

添加以下命令即可

复制代码
  <member_of_group>rosidl_interface_packages</member_of_group>
  <depend>rosidl_default_generators</depend>
  • 告诉ROS2编译系统,当前包是一个"接口包",需要生成消息/服务代码
  • 告诉ROS2编译系统,声明依赖ROS2默认的消息生成工具,确保编译时能调用 rosidl 相关工具

配置完这两个文件后就可以执行 colcon build 编译了

编译成功后,可以在install目录下找到

🚅 在本包或者其他包中使用自定义消息类型

在本包文件中直接包含即可

复制代码
#include "looraysbot_udptoros/msg/raw_imu.hpp"
#include "looraysbot_udptoros/msg/raw_lidar.hpp"
#include "looraysbot_udptoros/msg/raw_mag.hpp"
#include "looraysbot_udptoros/msg/raw_speed.hpp"

如果说有红色波浪线报includepath错误,通常是c/c++插件找不到头文件路径

解决方法是在c_cpp_properties.json文件中添加

json 复制代码
"${workspaceFolder}/src/looraysbot_udptoros/include",
"${workspaceFolder}/install/looraysbot_udptoros/include/**",

在其他包中使用时需要在 package.xml 中添加依赖项

json 复制代码
  <depend>looraysbot_udptoros </depend>

表示该包编译时依赖 looraysbot_udptoros 包,需要先编译该包,looraysbot_udptoros就是你自定义消息的那个功能包

💙 使用ros2 topic命令查看消息

  • ros2 topic list 列出所有话题

参数

bash 复制代码
ros2 topic list [-h] [--spin-time N] [-s] [--no-daemon]
[-t] [-c] [--include-hidden-topics] [-v]
参数 简写 说明
-h --help 帮助
--spin-time N --- 发现等待秒数(默认 0.3)
-s --use-sim-time 使用仿真时间
--no-daemon --- 不使用后台守护进程
-t --show-types 显示消息类型(最常用)ROS
-c --count-topics 只显示数量
--include-hidden-topics --- 显示隐藏话题
-v --verbose 详细信息(发布 / 订阅数)

常用

bash 复制代码
ros2 topic list -t
ros2 topic list -c
ros2 topic list -v
  • ros2 topic echo 打印话题内容
bash 复制代码
ros2 topic echo [-h] [--spin-time N] [-s] [--no-daemon]
[--no-arr] [--no-delimit] [--truncate-length N]
[--filter EXPR]
<topic_name> [msg_type]
参数 说明
--no-arr 不展开数组(紧凑显示)
--no-delimit 不打印分隔线
--truncate-length N 字符串截断长度
--filter EXPR Python 表达式过滤消息(高级)
<topic_name> 话题名(必填)
[msg_type] 消息类型(可省略自动识别)

常用

bash 复制代码
ros2 topic echo /cmd_vel --no-arr
ros2 topic echo /cmd_vel --filter "msg.angular.x > 0.5"
  • ros2 topic pub 命令行发布消息

参数

bash 复制代码
ros2 topic pub [-h] [--spin-time N] [-s] [--no-daemon]
[-1] [--keep-last N] [-q {sf,rf}]
[--qos-profile PROFILE]
[--rate HZ] [--wait-matching-subscriptions N]
<topic_name> <msg_type> <yaml_content>
参数 说明
-1 只发 1 次(默认循环发)
--rate HZ 发布频率(Hz)
--keep-last N 队列深度
-q {sf,rf} QoS:sf= 服务端 /rf= 客户端
--qos-profile system/default/services/parameters/sensor_data
--wait-matching-subscriptions N 等待 N 个订阅者再发

常用

bash 复制代码
一次性发布字符串
ros2 topic pub -1 /chatter std_msgs/String "data: 'Hello'"

10Hz 发布速度指令
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/Twist "{linear: {x: 0.5}}"
  • ros2 topic info 查看话题元信息

参数

bash 复制代码
ros2 topic info [-h] [--spin-time N] [-s] [--no-daemon] [-v]
<topic_name>

常用

-v显示完整 QoS、端点、类型、GID

bash 复制代码
ros2 topic info /cmd_vel -v
  • ros2 topic hz测量发布频率
相关推荐
龙亘川4 分钟前
具身智能机器人安全深度解析:从风险现状到防护实践(2026)
安全·机器人·具身智能安全技术白皮书
AI进化营-智能译站1 小时前
ROS2 C++开发系列14-Lambda表达式处理传感器数据流|文件IO保存机器人实验日志
开发语言·c++·ai·机器人
工业机器人生命周期管理11 小时前
赢胜智能:五一劳动节快乐
机器人
xwz小王子13 小时前
Science Robotics最新研究:检索增强操作(RAM)——让机器人真正理解“放在哪儿、怎么放”
机器人
爆打维c16 小时前
第3章 ROS基础编程(1.编程工具的配置与使用)
机器人
sheji10519 小时前
泳池机器人行业市场分析报告
人工智能·机器人·智能硬件
sheji1051 天前
割草机器人实物拆解报告
人工智能·机器人·智能硬件
一RTOS一1 天前
“鸿道+AUTBUS+MaVIEW”国产化机器人电子架构方案推动产业自主可控
机器人·鸿道操作系统·鸿道实时操作系统·国产嵌入式操作系统选型·具身智能操作系统
sheji1051 天前
泳池机器人产品设计方案
人工智能·机器人·智能硬件
YJlio1 天前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip