手把手做ROS2机器人系统开发(六):创建自定义msg与srv接口
在上一讲的服务器/客户端示例中,我们使用的是系统自带的 `example_interfaces` 消息定义。但在实际项目中,业务数据往往各不相同,例如机器人位姿、设备状态、工艺参数等,必须自定义消息(msg)和服务(srv)接口,才能让节点间传递符合业务语义的数据。本章节将讲解如何创建用户自定义的
手把手做ROS2机器人系统开发(六):创建自定义msg与srv接口
教程背景
在上一讲的服务器/客户端示例中,我们使用的是系统自带的 example_interfaces 消息定义。但在实际项目中,业务数据往往各不相同,例如机器人位姿、设备状态、工艺参数等,必须自定义消息(msg)和服务(srv)接口,才能让节点间传递符合业务语义的数据。本章节将讲解如何创建用户自定义的 msg 和 srv 文件。
一、程序编写
1. 创建软件包
创建接口软件包 tutorial_interfaces:
ros2 pkg create --build-type ament_cmake tutorial_interfaces
2. 创建 msg 和 srv 文件夹
在软件包中创建两个文件夹,分别存放消息与服务定义:
mkdir msg srv
3. 定义 msg 消息示例
创建文件 src/tutorial_interfaces/msg/Num.msg:
int64 num
该消息定义了一个 64 位整型字段 num,可用于传递计数、数值等简单数据。
4. 定义 srv 服务示例
创建文件 src/tutorial_interfaces/srv/AddThreeInts.srv:
int64 a
int64 b
int64 c
---
int64 sum
服务定义中,--- 上方为请求(Request)字段,下方为响应(Response)字段。本示例实现三个整数相加的服务接口。
5. 修改和添加编译选项
编辑 src/tutorial_interfaces/CMakeLists.txt:
cmake_minimum_required(VERSION 3.8)
project(tutorial_interfaces)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Num.msg"
"srv/AddThreeInts.srv"
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
6. 软件包设置
编辑 src/tutorial_interfaces/package.xml:
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>tutorial_interfaces</name>
<version>0.0.0</version>
<description>defined msg and srv</description>
<maintainer email="motion_gui@126.com">gmotion</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
二、程序测试
1. 编译软件包
colcon build --packages-select tutorial_interfaces
2. 测试查询消息
. install/setup.bash
ros2 interface show tutorial_interfaces/msg/Num
输出 int64 num,说明消息定义生成成功。
3. 测试查询服务
. install/setup.bash
ros2 interface show tutorial_interfaces/srv/AddThreeInts
输出请求/响应字段定义,说明服务接口生成成功。
4. 其他软件包引用问题
其他软件包若需使用该接口,需在 package.xml 中添加依赖:
<depend>tutorial_interfaces</depend>
添加依赖并编译后,方可正常包含对应的头文件目录。
小结
消息和服务正确发布出来,说明自定义接口创建成功。本章节暂不进行接口引用编程,具体应用将在下一章节(扩展 ROS2 软件包的接口)中演示。自定义接口是 ROS2 工程化开发的关键能力,掌握后即可按业务需求灵活定义通信协议。
SEO关键词: ROS2自定义消息, ROS2 msg srv定义, rosidl_generate_interfaces, ROS2接口文件, ROS2服务接口教程
推荐阅读
更多工业 AI、智能制造与技术实践文章
C#调用Intel NPU实现YOLOv26极速推理:OpenVINO工业视觉加速实践
通过C# + OpenVINO Runtime调用Intel Core Ultra NPU运行YOLOv26模型,实现低功耗、毫秒级的工业边缘AI视觉推理,涵盖模型导出、环境配置、推理代码与FP16/INT8/异步推理等性能优化实践。
C#工业视觉平台结合YOLOv26与OpenVINO
从数据标注、自动训练到Intel NPU边缘推理的完整工业AI方案:C#工业软件平台 + YOLOv26训练框架 + OpenVINO模型转换 + Intel NPU边缘推理,实现图像采集、自动标注、模型训练到现场推理的完整AI视觉闭环。
MY-BASIC 应用(一):轻量级嵌入式 BASIC 解析器介绍
MY-BASIC 是一个用标准 C 语言编写的轻量级 BASIC 解释器:不足 128KB 内存占用、可嵌入可扩展、支持原型编程与 Lambda 函数式编程、Unicode、列表/字典集合,适合嵌入式设备脚本化控制。
Linux系统篇(七)——工具篇(二):一篇搞懂 C 语言程序从代码到可执行文件的完整旅程
拆解 C 程序预处理、编译、汇编、链接四步变身流程,讲透条件编译与静态、动态链接差异,附分步实操与报错排查。
树莓派推送RTSP视频流实战:FFmpeg + rtsp-simple-server(MediaMTX)搭建局域网视频直播服务
本文面向树莓派视频流、Python视觉开发、RTSP视频监控和边缘AI视觉初学者,介绍如何在Raspberry Pi上搭建简单、稳定的RTSP视频流服务。项目采用FFmpeg + rtsp-simple-server(MediaMTX)方式,将树莓派摄像头采集的视频转换并推送到RTSP服务器,再由电脑、NVR、VLC、OpenCV或AI视觉程序访问。文章从安装FFmpeg并验证版本开始,下载适用于ARM64架构的MediaMTX v1.8.1,配置Linux Systemd服务实现RTSP服务器开机自启,最后将摄像头视频推送到RTSP地址,形成树莓派摄像头 → FFmpeg → RTSP服务器 → 客户端播放/AI检测的完整视频流架构。
YOLO目标检测模型调参入门:从训练参数到检测效果优化
YOLO目标检测模型调参入门指南:详解 epochs、imgsz、batch、模型大小、conf、IoU 等核心参数的作用与调节方法,给出工业视觉、疲劳驾驶、缺陷检测等 AI 项目的调参顺序与实验对比思路,帮助初学者在精度、速度与显存之间找到平衡。
