

🔥大奇个人主页 :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.msgfloat32 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
)
这个表示的使用Cmake的 set命令,将我们编写的 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测量发布频率

