【ros2】ROS2接口定义指南
文章目录
- ROS2接口定义指南
-
- 一、核心概念:ROS2接口的作用与分类
-
- 1. 接口的核心作用
- 2. 接口的三大分类
- 二、基于书中第4章的接口定义核心步骤(以服务接口为例)
-
- 1. 前置准备:创建接口功能包
- 2. 编写接口文件
-
- (1)服务接口(.srv)编写示例(书中人脸检测接口)
- (2)话题接口(.msg)编写示例(拓展)
- (3)动作接口(.action)编写示例(拓展)
- 3. 配置CMakeLists.txt:声明接口并生成代码
- 4. 配置package.xml:声明接口功能包身份
- 5. 编译与验证
- 三、接口定义语法规则(书中核心+拓展细节)
-
- 1. 基础数据类型
- 2. 复合数据类型
- 3. 语法禁忌
- 四、接口的使用方法(书中核心场景)
-
- 1. 其他功能包依赖接口包
-
- (1)创建功能包时添加依赖
- (2)配置依赖包的CMakeLists.txt(C++)
- (3)配置依赖包的package.xml
- 2. 代码中调用接口(简化示例)
-
- (1)Python调用服务接口
- (2)C++调用服务接口
- 五、书外拓展知识:接口高级用法与最佳实践
-
- 1. 接口版本兼容
- 2. 接口复用技巧
- 3. 接口文档编写
- 4. 接口验证工具
- 5. 动作接口的特殊说明
- 六、常见问题排查(基于书中编译错误拓展)
-
- 1. 编译报错“ModuleNotFoundError: No module named 'em'”
- 2. 其他功能包找不到接口包
- 3. 嵌套接口编译失败
- 七、总结
ROS2接口定义指南
(基于《ROS2机器人开发:从入门到实践》第4章+拓展知识)
一、核心概念:ROS2接口的作用与分类
1. 接口的核心作用
接口是ROS2节点间通信的数据协议,定义了数据的结构格式,确保不同节点(甚至不同编程语言)之间能正确解析数据。无论是话题、服务还是动作通信,都依赖接口实现数据标准化传递。
2. 接口的三大分类
| 接口类型 | 适用场景 | 核心特征 | 文件后缀 |
|---|---|---|---|
| 话题接口(Message) | 单向、高频数据传输(如传感器数据、速度指令) | 仅包含数据结构,无请求/响应逻辑 | .msg |
| 服务接口(Service) | 双向、按需请求-响应(如人脸检测、目标点移动) | 分为请求(Request)和响应(Response)两部分,用---分隔 | .srv |
| 动作接口(Action) | 长耗时任务(如路径规划、机械臂运动) | 支持进度反馈、任务取消,包含目标、反馈、结果三部分 | .action |
二、基于书中第4章的接口定义核心步骤(以服务接口为例)
1. 前置准备:创建接口功能包
接口需单独放在ament_cmake类型的功能包中,便于其他功能包依赖。
命令示例(书中4.2.1节):
ros2 pkg create chapt4_interfaces --build-type ament_cmake \
--dependencies rosidl_default_generators sensor_msgs --license Apache-2.0
- 关键依赖说明:
rosidl_default_generators:ROS2接口生成工具,自动将.msg/.srv/.action文件转换为C++/Python可调用的代码。sensor_msgs:依赖已有的接口(如sensor_msgs/Image)时需添加,无依赖可省略。
2. 编写接口文件
在功能包下创建对应目录(msg//srv//action/),按语法编写接口文件。
(1)服务接口(.srv)编写示例(书中人脸检测接口)
# 请求部分:客户端发送给服务端的数据
sensor_msgs/Image image # 引用已有的话题接口(需依赖sensor_msgs)
---
# 响应部分:服务端返回给客户端的数据
int16 number # 检测到的人脸数
float32 use_time # 检测耗时(秒)
int32[] top # 人脸位置:上边界坐标(数组适配多个人脸)
int32[] right # 人脸位置:右边界坐标
int32[] bottom # 人脸位置:下边界坐标
int32[] left # 人脸位置:左边界坐标
(2)话题接口(.msg)编写示例(拓展)
# 自定义激光雷达点云简化接口
std_msgs/Header header # 标准头信息(包含时间戳、坐标系)
float32 angle_min # 最小检测角度(rad)
float32 angle_max # 最大检测角度(rad)
float32[] distances # 各角度对应的距离数据(m)
(3)动作接口(.action)编写示例(拓展)
# 目标:客户端发送的任务指令
float32 target_x
float32 target_y
---
# 结果:任务完成后返回的数据
bool success
string message
---
# 反馈:任务执行中的进度信息
float32 progress # 进度百分比(0.0~1.0)
float32 current_x # 当前位置x坐标
float32 current_y # 当前位置y坐标
3. 配置CMakeLists.txt:声明接口并生成代码
接口文件需在CMakeLists.txt中注册,让构建工具识别并生成对应语言的代码。
核心配置(书中4.2.1节简化版):
cmake_minimum_required(VERSION 3.8)
project(chapt4_interfaces)# 查找依赖包
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(sensor_msgs REQUIRED) # 依赖的其他接口包# 声明接口文件(支持多个文件,用空格分隔)
rosidl_generate_interfaces(${PROJECT_NAME}"srv/FaceDetector.srv" # 服务接口"msg/LaserSimple.msg" # 话题接口(拓展)DEPENDENCIES sensor_msgs # 依赖的接口包
)ament_package()
4. 配置package.xml:声明接口功能包身份
需在package.xml中添加接口功能包标识,便于其他功能包依赖时被ROS2索引。
核心配置:
<?xml version="1.0"?>
<package format="3"><name>chapt4_interfac