ROS2服务通信实战
一、前言在机器人系统开发中ROS2 提供多种节点通信方式其中话题通信与服务通信是最核心的两种机制。话题通信发布者持续单向推送数据订阅者被动接收不存在应答机制适合激光雷达、相机等连续流式传感器数据传输服务通信采用客户端 / 服务端C/S一问一答同步交互模型。客户端主动发起请求服务端接收请求、执行业务逻辑并返回处理结果适合单次指令交互场景例如设备启停、参数查询、运算请求、机械臂定点运动。很多初学者学习 ROS2 时容易混淆话题与服务的适用场景同时在自定义.srv接口、客户端服务端交互、编译配置上频繁踩坑。本文严格依照课程实训案例完整还原需求分析→自定义服务接口→功能包创建→服务端开发→客户端开发→编译配置→运行测试全流程附带原理剖析、完整源码、运行效果、易错点总结适合课程作业、实训报告知识点覆盖全面逻辑层次完整。二、案例需求与架构分析2.1 案例需求编写 ROS2 服务通信程序实现整数求和功能客户端在终端传入两个整数作为请求数据发送至服务端服务端持续监听服务请求解析收到的两个数字完成求和运算服务端将求和结果封装为响应消息返回客户端两端打印日志直观展示请求、运算、响应全过程。运行效果客户端输入100 200服务端计算后返回结果300。2.2 服务通信三大核心要素服务通信模型由 3 部分构成缺一不可客户端 Client通信发起方主动创建连接、封装请求数据等待接收服务端反馈服务端 Server通信监听方长期运行等待客户端接入收到请求后触发回调函数处理业务生成响应数据消息载体.srv 服务接口约定客户端与服务端的数据传输格式使用---分隔两段上半段Request请求数据客户端→服务端下半段Response响应数据服务端→客户端2.3 整体开发流程创建并编辑.srv自定义服务文件修改接口包CMakeLists.txt配置消息编译规则创建 C 服务功能包添加对应依赖编写服务端源代码编写客户端源代码修改业务包CMakeLists.txt实现编译安装编译工作空间刷新环境变量多终端启动节点完成功能测试。三、自定义服务通信接口 AddInts.srv3.1 创建.srv 文件在base_interfaces_demo功能包下新建srv文件夹创建AddInts.srv写入内容文件说明int32 num1、int32 num2客户端发送的两个加数---分隔请求区与响应区int32 sum服务端计算完成后返回的求和结果。3.2 配置接口包 CMakeLists.txt想要编译工具识别.srv并自动生成可供 C/Python 调用的接口代码需要配置消息生成器若为全新接口包不能缺少find_package(rosidl_default_generators REQUIRED)已有 msg 消息的包仅需要在rosidl_generate_interfaces内追加srv/AddInts.srv路径。3.3 编译接口包colcon build --packages-select base_interfaces_demo source install/setup.bash3.4 接口校验测试编译完成后执行如下命令查看接口定义是否生效ros2 interface show base_interfaces_demo/srv/AddInts终端输出内容与AddInts.srv完全一致则自定义接口编译成功。四、创建 C 服务功能包进入工作空间src目录执行命令创建 C 功能包ros2 pkg create cpp02_service --build-type ament_cmake --dependencies rclcpp base_interfaces_demo参数解析cpp02_service功能包名称--build-type ament_cmake指定编译框架为 C 使用的 ament_cmakerclcppROS2 C 客户端库提供节点、服务、日志、自旋等基础 APIbase_interfaces_demo依赖自定义服务接口包。五、C 服务端代码实现文件路径cpp02_service/src/demo01_server.cpp重点原理剖析create_service消息类型(服务名, 回调)服务名称为字符串常量属于通信匹配标识客户端服务名字符串必须完全一致否则无法建立连接回调函数参数req为只读请求数据指针读取客户端上传参数res为响应指针开发者填充数据后ROS2 底层自动发送给客户端rclcpp::spin()自旋机制 ROS2 节点所有消息、服务事件依靠自旋循环处理若无 spin节点无法感知客户端请求回调函数永远不会触发。六、C 客户端代码实现文件路径cpp02_service/src/demo02_client.cpp重点原理剖析wait_for_service()持续探测对应名称的服务是否存在解决客户端先行启动而服务端未启动导致通信失败问题async_send_request()异步非阻塞发送请求返回 Future 异步结果对象spin_until_future_complete()阻塞节点直至服务端返回响应防止提前读取空结果。七、配置 CMakeLists.txt打开cpp02_service/CMakeLists.txt在文件末尾追加编译与安装规则这是极易遗漏的扣分点原理ament 编译系统不会自动编译 cpp 源码必须手动声明可执行文件、依赖库以及安装路径缺少 install 指令时ros2 run无法检索到节点程序。八、编译与运行测试8.1 编译功能包colcon build --packages-select cpp02_service8.2 终端 1启动服务端8.3 终端 2启动客户端服务端新增日志运行结果和课程截图完全一致功能验证通过。九、重难点拓展拉高分数核心板块9.1 话题通信与服务通信对比总结对比项话题通信服务通信交互模式单向发布订阅无应答双向一问一答同步应答数据特征连续周期性数据流单次按需交互启动顺序发布订阅无强制先后必须先启动服务端消息文件.msg.srv区分请求 / 响应典型场景传感器数据传输指令控制、数值运算、状态查询9.2 常见问题与故障排查ros2 run 提示找不到可执行文件原因CMakeLists 未添加编译安装代码未执行colcon build新开终端没有source install/setup.bash。头文件找不到 add_ints.hpp原因接口包base_interfaces_demo没有编译功能包缺少对应依赖。客户端长时间无法连接服务端原因客户端、服务端填写的服务名字符串不一致大小写、字符必须完全相同。客户端参数缺失直接退出运行指令格式错误必须传递两个整数参数。十、实验总结本次实验完整实现 ROS2 服务通信 C/S 架构完成从自定义.srv接口、功能包搭建、服务端与客户端编码、编译部署到功能验证整套工程流程。掌握.srv服务接口的语法规则、编译配置与校验方式理解服务通信一问一答交互模型能够区分服务通信与话题通信适用场景掌握 C 服务端创建服务、回调处理请求的标准开发模板掌握 C 客户端连接服务、异步发送请求、接收响应的实现方式熟悉 ROS2 ament 编译体系能够独立编写 CMakeLists.txt 配置并且自主排查编译、节点通信相关故障。服务通信是机器人指令交互不可或缺的通信手段本次两数求和案例的代码框架具备通用性稍加修改即可应用于电机控制、传感器参数读取、任务指令下发等真实机器人工程项目。

相关新闻

运算放大器 6大经典电路仿真:Multisim 14 实测波形与理论公式对比

运算放大器 6大经典电路仿真:Multisim 14 实测波形与理论公式对比

运算放大器6大经典电路仿真:Multisim 14实测波形与理论公式深度验证在电子工程领域,运算放大器(简称运放)堪称模拟电路设计的"瑞士军刀"。无论是信号调理、传感器接口还是控制系统,运放都扮演着核心角色。然…

2026/7/10 9:28:54 阅读更多 →
x86 CPU Cache层级与容量实测:C++代码探测L1/L2/L3大小与Cache Line

x86 CPU Cache层级与容量实测:C++代码探测L1/L2/L3大小与Cache Line

x86 CPU Cache层级与容量实测:C代码探测L1/L2/L3大小与Cache Line现代计算机系统中,CPU缓存(Cache)是提升程序性能的关键组件。理解CPU缓存的工作原理、层级结构以及如何通过代码实测缓存参数,对于中高级开发者和系统工…

2026/7/10 9:28:54 阅读更多 →
北京市博士后科研工作站、博士后创新实践基地申报指南

北京市博士后科研工作站、博士后创新实践基地申报指南

一、申报条件市属企业、从事科学研究和技术开发的事业单位、本市行政区域内非公有制经济单位,申请设立博士后科研工作站、园区分站、创新实践基地应当具备以下基本条件并符合至少一项推荐条件:(一)基本条件1.具备独立法人资格&…

2026/7/10 9:26:53 阅读更多 →

最新新闻

2026家用豆浆破壁机带12小时预约,醒来就喝热乎鲜豆浆

2026家用豆浆破壁机带12小时预约,醒来就喝热乎鲜豆浆

2026家用豆浆破壁机带12小时预约,醒来就喝热乎鲜豆浆清晨六点半,厨房里飘出温热的豆浆香,杯体安静运转几乎听不到噪音,预约好的早餐已经准备就绪。这样的场景,正在越来越多家庭里变成日常。蓝宝这款柔音破壁机&#xf…

2026/7/10 10:17:21 阅读更多 →
3个神级操作,让Mac窗口置顶神器Topit帮你工作效率飙升200%

3个神级操作,让Mac窗口置顶神器Topit帮你工作效率飙升200%

3个神级操作,让Mac窗口置顶神器Topit帮你工作效率飙升200% 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 还在为窗口遮挡而抓狂吗?Topi…

2026/7/10 10:15:21 阅读更多 →
终极指南:如何使用Kinovea开源运动分析软件快速掌握专业视频分析技巧

终极指南:如何使用Kinovea开源运动分析软件快速掌握专业视频分析技巧

终极指南:如何使用Kinovea开源运动分析软件快速掌握专业视频分析技巧 【免费下载链接】Kinovea Video solution for sport analysis. Capture, inspect, compare, annotate and measure technical performances. 项目地址: https://gitcode.com/gh_mirrors/ki/Ki…

2026/7/10 10:13:20 阅读更多 →
BilibiliDown使用指南:3步掌握B站视频音频批量下载技巧

BilibiliDown使用指南:3步掌握B站视频音频批量下载技巧

BilibiliDown使用指南:3步掌握B站视频音频批量下载技巧 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/…

2026/7/10 10:09:18 阅读更多 →
示波器触发模式深度解析:标准模式 vs 自动模式,捕捉秒脉冲的3个关键差异

示波器触发模式深度解析:标准模式 vs 自动模式,捕捉秒脉冲的3个关键差异

示波器触发模式深度解析:标准模式 vs 自动模式,捕捉秒脉冲的3个关键差异在电子工程实践中,示波器触发模式的选择往往决定了信号分析的成败。当面对脉宽仅10微秒的秒脉冲信号(5V TTL方波)时,工程师常陷入&qu…

2026/7/10 10:09:18 阅读更多 →
SpringCloud 中业务与数据库是否分开?分两层说清楚

SpringCloud 中业务与数据库是否分开?分两层说清楚

目录 一、逻辑层面:业务代码 和 数据库天然完全分离(微服务核心设计) 两种数据库拆分方案 二、部署层面:可以分开部署,也可以本地合在一起 1. 生产环境(标准):业务服务 和 数据库…

2026/7/10 10:09:18 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻