手把手做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、智能制造与技术实践文章
手把手做ROS2机器人系统开发(七):扩展ROS2软件包接口
上一讲讲解了如何创建自定义 msg 和 srv 文件对应的接口软件包。本章节延续该内容,进一步扩展 ROS2 软件包的接口:将自定义消息直接定义在节点软件包中,实现软件包功能的扩展。通过本讲,大家可以掌握"接口随包定义、随包编译"的工程化开发方式。
树莓派部署YOLOv8手势检测实战:USB IMX378摄像头 + Python + PyTorch + ONNX Runtime + Systemd开机自动运行
本文面向树莓派AI视觉、Python人工智能、YOLOv8目标检测初学者,以树莓派部署手势检测项目为案例,完整介绍从USB IMX378摄像头安装、Miniconda环境配置、Python虚拟环境创建、YOLOv8依赖安装,到手势检测程序Systemd开机自动运行的完整流程。在Raspberry Pi 5 / ARM64(aarch64)环境下建立独立的yolov8-env环境,安装PyTorch、Ultralytics、ONNX Runtime、NumPy等AI视觉组件,最后通过Linux systemd使fatigueDetect.py开机自动运行,实现无需手工登录的AI视觉自动检测,为后续手势识别、人体检测、疲劳驾驶检测、工业视觉检测与边缘AI视觉系统打下基础。
RAG 实战教程(一):RAG 工作原理与完整流程——分片、索引、召回、重排和生成
本文系统讲解RAG的完整工作流程:为什么不能把整份文档直接交给大模型、哪些场景适合RAG、分片Chunking(含常见分片方式对比表与段落感知分片器代码)、索引与Embedding、召回(余弦相似度与BM25混合检索)、重排(BGE Reranker)、生成(Prompt组装),并给出一个可运行的Python端到端Demo与常见问题排查指南。
MCP、A2A、AG-UI:一篇讲清 Agent 协议栈
随着 Agent 从单一聊天窗口走向企业系统,MCP、A2A、AG-UI、A2UI、UCP、AP2 等协议构成了 2026 年的 Agent 协议栈。本文从通信对象出发,逐层讲清每个协议解决什么问题、不解决什么问题,并结合端到端案例、选型六问与架构检查清单,帮助开发者设计可靠的多系统协作架构。
IMX6ULL 裸机开发学习(一):汇编点亮 LED
基于野火 IMX6ULL mini 开发板,用 GNU ARM 汇编完成 LED 闪烁实验:CCM 时钟使能、IOMUX 复用配置、GPIO 方向与数据寄存器操作,配套 Makefile 与 imxdownload 烧写流程。
SOEM-EtherCAT 源代码解析(一):数据类型定义
逐段拆解开源 EtherCAT 主站库 SOEM 的核心头文件 ec_type.h:从基础数据类型、错误码、帧长与超时宏,到以太网头、数据包头结构体,再到状态/命令/数据类型枚举、SII 从站信息接口、邮箱协议与寄存器定义,一文打透 EtherCAT 主站的类型地基。
