当前位置: 首页 > news >正文

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)**字段:创建海龟的坐标(xytheta)和名称(可选);
  • 下半部分是**响应(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的可视化工具,可直观调用服务:

  1. 启动rqt

    rqt
    
  2. rqt中依次点击Plugins → Services → Service Caller,打开服务调用界面。

  3. 选择服务(如/spawn),填写请求参数(xytheta等),点击Call即可发起请求,效果与命令行调用完全一致。

五、总结

本文详解了ROS2服务通信的核心知识:

  • 概念与DDS底层:服务是双向请求-响应模式,基于DDS的双话题机制实现;
  • 工具链使用ros2 service list -tros2 interface showros2 service call完成服务的查看、定义和调用;
  • 可视化调用rqtService Caller插件可直观发起服务请求。

服务通信是ROS2节点协作的重要方式,掌握后可实现带结果反馈的功能(如资源创建、动作执行),为复杂机器人系统的开发奠定基础。

http://www.dtcms.com/a/557367.html

相关文章:

  • C语言入门(十三):操作符详解(1)
  • 化妆品设计网站家用宽带做网站
  • 雄安建设集团 网站湖北做网站教程哪家好
  • 晋城市 制作网站织梦网站文章发布模板下载
  • Microsoft Speech TTS微软语音识别ISpeechRecoGrammar,ISpeechRecoResult
  • 【Java 开发日记】运行时有出现过什么异常?
  • 企业门户网站设计扬州网页设计培训
  • 从大模型中的chat_template了解jinja模板语法
  • Pandas--数据选择与索引
  • Linux下编译WebSocket++
  • 淄博哪家公司做网站最好莱钢吧贴吧
  • 调试的艺术:从崩溃到洞察的全面指南
  • 深入洞察:大模型服务之MaaS平台
  • 1024.5不是数位和--------题解
  • 加强门户网站建设的通知博客和网站的区别
  • 阿里云网站建站网站建设的公司这个
  • 基于AWS多区域部署的高可用性与灾难恢复架构设计
  • 海外注册域名的网站好石家庄专业网站营销
  • HTML CSS八股
  • 免费网页源代码网站个人微信营销
  • 【项目实战1 -瑞吉外卖|day23 】
  • QuickLook:文件预览
  • 使用QKeyEvent keyPress(QEvent::KeyPress, key模拟键盘发送事件,会导致主程序卡死
  • 512-Spring AI Alibaba 字段分类分级 Graph 示例
  • 网站开发培训中心wordpress怎么建页面
  • 朝阳做网站哪家公司好推广广告投放
  • 我是程序员吗?
  • 在线excel数据导入导出框架
  • 手撕vector:从零实现一个C++动态数组
  • 2025年--Lc228-523. 连续的子数组和(带测试用例)-Java版