每个服务只能有一个服务器,但可以有多个客户端。
一、Service 通讯机制
服务是 ROS 节点的另一种通信方式。服务基于调用 - 响应模型,而非主题的发布者 - 订阅者模型。主题允许节点订阅数据流并获取持续更新,而服务仅在客户端明确调用时才提供数据。
在 ROS 2 中,服务指的是远程过程调用。换句话说,一个节点可以对另一个节点进行远程过程调用,该节点将执行计算并返回结果。
在 ROS 2 中,由于客户端通常需要等待结果,因此服务应该能够快速返回。服务不应该用于长时间运行的进程,尤其是在异常情况下可能需要被抢占的进程。如果你的服务需要执行长时间运行的计算,请考虑使用 Action。
一个服务由两部分组成:服务器和客户端。
服务器是接受远程过程请求并执行某些计算的实体,客户端是一个请求远程服务器代替其执行计算的实体。
服务的执行流程如下图:
二、创建自定义服务 C++ 版
2.1 创建功能包
cd ros2_learning/src
ros2 pkg create --build-type ament_cmake hello_world_service_cpp
其中,
使用 --build-type 指定编译系统为 ament_cmake
hello_world_service_cpp:自定义功能包名称
生成的目录结构如下:
hello_world_service_cpp
├── CMakeLists.txt
├── include
│ └── hello_world_service_cpp
├── LICENSE
├── package.xml
└── src
2.2 编辑源文件
我们编写一个服务端(server)和一个客户端(client),实现计算两个整型数字的和。
在 hello_world_service_cpp/include 目录下新增 server.h 文件,文件内容如下:
#pragma once
#include "rclcpp/rclcpp.hpp"
AddTwoInts = example_interfaces::srv::AddTwoInts;
: rclcpp::Node {
:
();
:
;
rclcpp::Service<AddTwoInts>::SharedPtr service_;
};


