ROS2系列 (19) : C++服务通信实例——自定义巡逻服务接口(接口创建篇)

在前文中,我们基于Python实现了人脸检测的服务通信。本文将聚焦C++服务通信的自定义接口创建,通过“巡逻海龟”案例,详解如何在已有功能包中添加自定义服务接口,为后续服务端和客户端开发奠定基础。

一、自定义服务接口的创建流程

1.1 功能包与目录结构

我们复用已有工作空间chapt4_ws中的chapt4_interfaces功能包,添加巡逻服务接口。最终目录结构如下:

chapt4_interfaces/
├── srv/
│   ├── FaceDetector.srv  # 原有人脸检测接口
│   └── Patrol.srv        # 新增巡逻服务接口
├── CMakeLists.txt
├── package.xml
└── ...

1.2 编写Patrol.srv接口

chapt4_interfaces/srv/目录下创建Patrol.srv文件,定义巡逻服务的请求响应结构:

float32 target_x  # 目标点x坐标
float32 target_y  # 目标点y坐标
---
int8 SUCCESS=1    # 定义成功常量(值为1)
int8 FAIL=0       # 定义失败常量(值为0)
int8 result       # 执行结果(取值为SUCCESS或FAIL)
  • 请求部分:包含两个浮点型字段target_xtarget_y,用于指定海龟的巡逻目标点。
  • 响应部分:通过---分隔,包含两个常量(SUCCESSFAIL)和一个结果字段result,用于反馈巡逻任务的执行状态。

1.3 配置package.xml

确保chapt4_interfaces/package.xml包含服务接口所需的依赖声明:

<?xml version="1.0"?>
<package format="3">
  <name>chapt4_interfaces</name>
  <version>0.0.0</version>
  <description>自定义服务接口包,包含人脸检测和巡逻服务</description>
  <maintainer email="your@email.com">your_name</maintainer>
  <license>Apache-2.0</license>

  <!-- 构建工具依赖 -->
  <buildtool_depend>ament_cmake</buildtool_depend>
  <buildtool_depend>rosidl_default_generators</buildtool_depend>

  <!-- 运行时依赖 -->
  <depend>geometry_msgs</depend>
  <depend>rosidl_default_runtime</depend>

  <!-- 声明为接口包,供ROS2工具链识别 -->
  <member_of_group>rosidl_interface_packages</member_of_group>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

1.4 配置CMakeLists.txt

更新chapt4_interfaces/CMakeLists.txt,添加巡逻服务接口的构建规则:

cmake_minimum_required(VERSION 3.8)
project(chapt4_interfaces)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# 查找依赖包
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(geometry_msgs REQUIRED)

# 声明所有服务接口文件
set(srv_files
  "srv/FaceDetector.srv"   # 原有人脸检测接口
  "srv/Patrol.srv"         # 新增巡逻服务接口
)

# 生成多语言接口代码(C++/Python)
rosidl_generate_interfaces(${PROJECT_NAME}
  ${srv_files}
  DEPENDENCIES geometry_msgs  # 依赖geometry_msgs以确保类型兼容性
)

ament_package()

二、构建并验证自定义接口

2.1 构建功能包

在工作空间根目录执行构建:

cd ~/chapt4/chapt4_ws
colcon build --packages-select chapt4_interfaces
source install/setup.bash

2.2 验证接口生成

通过ros2 interface show命令查看生成的巡逻服务接口:

ros2 interface show chapt4_interfaces/srv/Patrol

输出应与Patrol.srv定义完全一致:

float32 target_x
float32 target_y
---
int8 SUCCESS=1
int8 FAIL=0
int8 result

三、总结

本文完成了“巡逻海龟”服务的自定义接口创建,核心流程包括:

  • 接口定义:通过Patrol.srv声明目标点请求和结果响应;
  • 配置文件:在package.xmlCMakeLists.txt中声明依赖和构建规则;
  • 构建验证:通过colcon build生成多语言接口代码,并通过ros2 interface show验证。

该接口为后续C++服务端和客户端的开发提供了基础,下一篇将基于此接口实现完整的“巡逻海龟”服务通信流程。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐