ZeroOne AI
← 返回文章列表

手把手做ROS2机器人系统开发(六):创建自定义msg与srv接口

👁 26
分类:机器人自动化

在上一讲的服务器/客户端示例中,我们使用的是系统自带的 `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 软件包的接口:将自定义消息直接定义在节点软件包中,实现软件包功能的扩展。通过本讲,大家可以掌握"接口随包定义、随包编译"的工程化开发方式。

AI视觉

树莓派部署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视觉系统打下基础。

工业AI

RAG 实战教程(一):RAG 工作原理与完整流程——分片、索引、召回、重排和生成

本文系统讲解RAG的完整工作流程:为什么不能把整份文档直接交给大模型、哪些场景适合RAG、分片Chunking(含常见分片方式对比表与段落感知分片器代码)、索引与Embedding、召回(余弦相似度与BM25混合检索)、重排(BGE Reranker)、生成(Prompt组装),并给出一个可运行的Python端到端Demo与常见问题排查指南。

工业AI

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 主站的类型地基。

评论(0)