【ros2】ROS2 C++服务端与客户端创建指南
2025-12-15 19:01 tlnshuju 阅读(0) 评论(0) 收藏 举报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_control
rclcpp
chapt4_interfaces
turtlesim
)
# 客户端可执行文件
add_executable(patrol_client src/patrol_client.cpp)
ament_target_dependencies(patrol_client
rclcpp
chapt4_interfaces
)
# 安装可执行文件到install目录
install(TARGETS
turtle_control
patrol_client
DESTINATION 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)
浙公网安备 33010602011771号