代码改变世界

【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)