ROS2系列 (14) : 服务通信介绍——双向通信的核心机制
ROS2系列 (14) : 服务通信介绍——双向通信的核心机制
在ROS2中,服务通信是节点间“请求-响应”式的双向通信模式,适用于带结果反馈的场景(如创建海龟、查询参数等)。本文将详解服务通信的概念、工具链使用,并结合DDS底层原理对比服务与话题的差异,同时覆盖rqt可视化调用服务的方法。
一、服务通信的核心概念
服务通信是双向的“请求-响应”模式:
- 客户端(Client):发起服务请求的节点;
- 服务端(Server):处理请求并返回响应的节点;
- 服务(Service):通信的“通道”,包含 请求(Request)和响应(Response) 两种数据结构。
与话题(单向、多对多、高频)不同,服务是点对点、有结果反馈的通信方式,适合低频、需要确认的场景(如创建资源、执行动作)。
二、DDS底层视角:服务与话题的关系
ROS2的通信基于**DDS(Data Distribution Service)**实现,服务与话题的底层差异如下:
| 特性 | 话题(Topic) | 服务(Service) |
|---|---|---|
| 通信方向 | 单向(发布者→订阅者) | 双向(客户端→服务端→客户端) |
| 数据模式 | 持续流(无界数据) | 请求-响应(单次交互) |
| DDS映射 | 映射为DDS的“数据发布-订阅” | 映射为两个DDS话题:一个用于请求,一个用于响应 |
| 典型场景 | 传感器数据、状态广播 | 创建资源、执行动作并获取结果 |
简言之,服务是**“有结果的话题组合”**——客户端向服务端的“请求话题”发消息,服务端处理后向客户端的“响应话题”回消息,DDS保证这一过程的可靠性。
三、服务工具链:ros2 service命令详解
3.1 列出所有服务及类型
使用ros2 service list -t可查看当前系统的服务名称及其接口类型:
ros2 service list -t
以海龟模拟器为例,输出类似:
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
# 其他服务...
- 服务名(如
/spawn)是通信的唯一标识; - 接口类型(如
[turtlesim/srv/Spawn])定义了请求和响应的结构。
3.2 查看服务接口定义
通过ros2 interface show可查看服务接口的请求和响应结构:
ros2 interface show turtlesim/srv/Spawn
输出:
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name
- 上半部分是**请求(Request)**字段:创建海龟的坐标(
x、y、theta)和名称(可选); - 下半部分是**响应(Response)**字段:返回创建的海龟名称。
3.3 调用服务(请求-响应)
使用ros2 service call可手动发起服务请求。以创建海龟为例:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 1, y: 1}"
终端输出请求和响应过程:
requester: making request: turtlesim.srv.Spawn_Request(x=1.0, y=1.0, theta=0.0, name='')
response:
turtlesim.srv.Spawn_Response(name='turtle2')
同时,海龟模拟器中会出现名为turtle2的新海龟,完成“请求-响应”的闭环。
四、rqt可视化调用服务
rqt是ROS2的可视化工具,可直观调用服务:
-
启动
rqt:rqt -
在
rqt中依次点击Plugins → Services → Service Caller,打开服务调用界面。 -
选择服务(如
/spawn),填写请求参数(x、y、theta等),点击Call即可发起请求,效果与命令行调用完全一致。
五、总结
本文详解了ROS2服务通信的核心知识:
- 概念与DDS底层:服务是双向请求-响应模式,基于DDS的双话题机制实现;
- 工具链使用:
ros2 service list -t、ros2 interface show、ros2 service call完成服务的查看、定义和调用; - 可视化调用:
rqt的Service Caller插件可直观发起服务请求。
服务通信是ROS2节点协作的重要方式,掌握后可实现带结果反馈的功能(如资源创建、动作执行),为复杂机器人系统的开发奠定基础。
