【ros2】ROS2 C++服务端与客户端开发指南
文章目录
- ROS2 C++服务端与客户端开发指南
-
- 一、核心概念:C++服务通信的特点与优势
- 二、基于书中第4章的C++服务开发核心步骤
-
- 1. 前置准备:创建功能包与依赖配置
-
- (1)创建C++功能包
- (2)配置`package.xml`
- (3)配置`CMakeLists.txt`
- 2. 服务端开发步骤(以书中海龟巡逻为例)
-
- (1)服务接口回顾(`.srv`文件)
- (2)服务端代码实现
- 3. 客户端开发步骤(以书中随机巡逻为例)
-
- (1)客户端代码实现
- 4. 编译与运行
-
- (1)编译功能包
- (2)启动节点测试
- 三、书外拓展知识:C++服务通信高级特性
-
- 1. 同步与异步调用的区别
- 2. 服务的并发处理
- 3. 服务的超时控制
- 4. 服务与参数的结合
- 5. 调试与监控工具
- 四、常见问题与解决方案
- 五、总结
ROS2 C++服务端与客户端开发指南
(基于《ROS2机器人开发:从入门到实践》第4章及拓展知识)
一、核心概念:C++服务通信的特点与优势
服务(Service)是ROS2中基于“请求-响应”模式的双向通信机制,适用于需要明确反馈的交互场景(如任务执行、参数查询、算法计算等)。相比Python,C++实现的服务通信具有运行效率高、实时性强的特点,更适合机器人控制、传感器数据处理等性能敏感场景。
核心特征:
- 通信模式:客户端主动发送请求,服务端处理后返回响应(一对一交互)。
- 接口定义:通过
.srv文件声明请求(Request)和响应(Response)数据结构,用---分隔。 - 生命周期:服务仅在被调用时激活,处理完成后释放资源,适合低频率、高复杂度的任务。
二、基于书中第4章的C++服务开发核心步骤
1. 前置准备:创建功能包与依赖配置
(1)创建C++功能包
服务端和客户端需依赖ROS2核心库及自定义接口包,创建功能包命令如下:
# 创建C++功能包,依赖rclcpp(ROS2 C++库)和自定义接口包
ros2 pkg create demo_cpp_service --build-type ament_cmake \
--dependencies rclcpp chapt4_interfaces turtlesim
- 依赖说明:
rclcpp:ROS2 C++核心库,提供节点、服务等基础功能。chapt4_interfaces:自定义服务接口包(包含.srv文件)。turtlesim:示例中控制海龟运动的依赖(根据实际场景调整)。
(2)配置package.xml
声明编译和运行依赖,确保功能包能正确引用接口和ROS2库:
<?xml version="1.0"?>
<package format="3"><name>demo_cpp_service</name><version>0.0.0</version><description>ROS2 C++服务示例</description><!-- 编译依赖 --><buildtool_depend>ament_cmake</buildtool_depend><build_depend>rclcpp</build_depend><build_depend>chapt4_interfaces</build_depend><build_depend>turtlesim</build_depend><!-- 运行依赖 --><exec_depend>rclcpp</exec_depend><exec_depend>chapt4_interfaces</exec_depend><exec_depend>turtlesim</exec_depend><export><build_type>ament_cmake</build_type></export>
</package>
(3)配置CMakeLists.txt
指定可执行文件、依赖库及安装规则(核心配置):
cmake_minimum_required(VERSION 3.8)
project(demo_cpp_service)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(rclcpp REQUIRED)
find_package(chapt4_interfaces REQUIRED)
find_package(turtlesim REQUIRED)# 服务端可执行文件
add_executable(turtle_control src/turtle_control.cpp)
ament_target_dependencies(turtle_controlrclcppchapt4_interfacesturtlesim
)# 客户端可执行文件
add_executable(patrol_client src/patrol_client.cpp)
ament_target_dependencies(patrol_clientrclcppchapt4_interfaces
)# 安装可执行文件到install目录
install(TARGETSturtle_controlpatrol_clientDESTINATION lib/${PROJECT_NAME}
)ament_package()
2. 服务端开发步骤(以书中海龟巡逻为例)
服务端的核心逻辑是:创建服务对象 → 定义请求处理回调函数 → 处理请求并生成响应。
(1)服务接口回顾(.srv文件)
书中4.3节定义的巡逻服务接口Patrol.srv:
# 请求:目标位置坐标
float32 target_x
float32 target_y
---
# 响应:处理结果
int8 SUCCESS=1 # 成功常量
int8 FAIL=0 # 失败常量
int8 result # 1表示成功,0表示失败
(2)服务端代码实现
// src/turtle_control.cpp
#include "rclcpp/rclcpp.hpp"
#include "geometry_msgs/msg/twist.hpp" // 速度控制消息
#include "turtlesim/msg/pose.hpp" // 海龟位置消息
#include "chapt4_interfaces/srv/patrol.hpp" // 自定义巡逻服务接口// 命名空间简化代码
using namespace std::placeholders;
using Patrol = chapt4_interfaces::srv::Patrol;
using Twist = geometry_msgs::msg::Twist;
using Pose = turtlesim::msg::Pose;class TurtleController : public rclcpp::Node {
public:TurtleController() : Node("turtle_control_node") {// 1. 创建速度发布者(控制海龟运动)vel_pub_ = this->create_publisher<Twist>("/turtle1/cmd_vel", 10)