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

2026.8.02-初入ros+slam+opencv第七天-C++服务端开发

一.掌握点

掌握 ROS服务通信(一问一答同步阻塞模式),独立编写服务客户端代码,调用 turtlesim 自带/spawn服务,自动生成第二只乌龟;分清服务端、客户端,区分服务与话题通信差异。

二.核心理论知识点

话题 vs 服务
话题:单向持续数据流,非阻塞,适合传感器实时数据(乌龟位姿、速度指令)
服务:一问一答同步阻塞通信,需要反馈结果,适合触发式动作(生成 / 删除乌龟)
角色区分
服务端:turtlesim_node,提供/spawn服务,接收请求、完成任务并返回结果
客户端:手写程序,主动发起请求**
关键规则**
允许多个客户端同时调用同一个服务;
同一个服务名称只能存在一个服务端,不能重复启动。

三.实操完整流程

1.在功能包src目录新建 turtle_spawn_client.cpp,编写服务客户端代码

2.代码核心组成:

//引入ROS核心头文件,ros初始化、节点句柄、客户端、日志打印都依赖它#include<ros/ros.h>//引入Spawn服务消息头文件,调用/spawn生成乌龟专用#include<turtlesim/Spawn.h>intmain(intargc,char**argv){// 1.初始化ROS节点// argc,argv固定写法,用于支持命令行传参;// "spawn_client_node":ROS系统内部节点名称,rosnode list可以看到ros::init(argc,argv,"spawn_client_node");// 创建节点句柄nh,相当于程序和roscore通信的“通道”,发布、订阅、服务都需要它setlocale(LC_ALL,"zh_CN.UTF-8");ros::NodeHandle nh;// 2.创建服务客户端对象// nh.serviceClient<消息类型>(服务名称)// <turtlesim::Spawn>:使用的服务消息类型// "/spawn":要连接的服务(turtlesim自带生成乌龟服务)ros::ServiceClient client=nh.serviceClient<turtlesim::Spawn>("/spawn");// 3.实例化服务消息对象// 服务消息分为两部分:request 请求数据、response 返回结果turtlesim::Spawn srv;// 设置请求参数:生成乌龟坐标、朝向、名字srv.request.x=4.0;srv.request.y=4.0;srv.request.theta=0;srv.request.name="turtle2";// ROS日志打印(绿色普通信息)ROS_INFO("等待 /spawn 服务上线...");// 阻塞函数:一直等待,直到/spawn服务启动成功,代码才向下运行// 解决问题:先启动客户端、后打开turtlesim造成调用失败client.waitForExistence();ROS_INFO("发起生成乌龟请求...");// 发起同步服务调用!【重点】// 程序会卡在这一行,等待服务端处理并返回结果(阻塞)// 调用成功返回true,失败返回falseboolresult=client.call(srv);if(result){// srv.response 存放服务返回的数据// .c_str():把C++字符串转为C语言字符串,满足ROS_INFO打印要求ROS_INFO("生成成功!乌龟名称:%s",srv.response.name.c_str());}else{// ERROR级别日志,红色警告ROS_ERROR("生成乌龟失败!");}return0;}

nh.serviceClient<消息类型>(服务名) 创建客户端

turtlesim::Spawn srv; 承载请求 request 和响应 response 数据

client.waitForExistence():阻塞等待服务上线,解决启动顺序问题

client.call(srv):发送请求,同步阻塞,等待服务端返回结果

3.修改CMakeLists.txt添加编译规则
add_executable(可执行文件名 cpp源码路径)
target_link_libraries链接库

4.编译工作空间 catkin_make,刷新环境变量
多终端顺序启动测试:roscore → turtlesim_node → 自定义客户端节点

四.易错点

turtlesim::Spawn模板参数不能删除,指定通信的数据格式;

三层名称不要混淆:cpp 文件名、CMake 生成的可执行程序名、ros::init内部节点名,三者互相独立;

waitForExistence()仅仅检测服务是否存在,不会发送请求;真正执行功能依靠client.call();
若删除waitForExistence(),先启动客户端、后启动乌龟仿真,call 直接返回 false,调用失败;

服务客户端代码不需要 ros::spin();

重复运行客户端创建同名乌龟,调用会失败,进入错误分支。

http://www.jsqmd.com/news/1317768/

相关文章:

  • 2026年成都郫都区中高端汽车维修怎么选?本地专业机构推荐与行业观察 - 优质品牌商家
  • UEditor实现Word图片批量上传技术方案
  • Greasy Fork:3分钟解锁浏览器超能力的终极用户脚本平台
  • 2026 年新发布:甘肃专业的停车场膜结构车棚生产厂家找哪家,停在户外的车少遭损?这玩意儿居然能让停车场省出近三成维护成本。 - 企业信息推荐【官方】
  • 微信机器人能帮你做什么
  • Flutter表单引擎lyform鸿蒙HarmonyOS迁移实战
  • 企业数据集成平台选型的7个关键维度与实战方法
  • Unity工业数字孪生实战:从CAD模型优化到实时数据驱动
  • Simulink永磁直驱风机混合储能系统建模与仿真
  • WebFTP安全挑战:CTF中的漏洞利用与防御实践
  • 2026 年新发布:宿城有实力的铁铝皮施工队推荐几家,你捡的废品里藏着这玩意儿,竟能换辆车? - 实业推荐官【官方】
  • 为什么92%的AI产品设计失败?:极简风格3大认知陷阱与反直觉落地路径
  • Unity语音合成插件RT-Voice PRO实战:从TTS原理到智能NPC开发
  • Spring Boot整合Apollo配置中心实战指南
  • 科技史上的决定性瞬间与变革前兆识别
  • 2026年8月箱包锁扣配件/佛山箱包锁扣公司精选推荐_佛山市南海区金沙联沙长升五金厂 - 行业平台推荐
  • AI语音合成实战:从TTS到情感化语音克隆的本地部署指南
  • 2026 年至今,伊川有实力的租大型水泵租赁制造企业推荐几家,工地排涝犯愁?这东西比买省大半还不用占场地,谁懂啊 - 行业甄选官
  • Android音乐传输五大方案详解
  • Matlab实现Transformer单变量时序预测全流程
  • PyWxDump技术合规启示录:开源项目如何在法律框架内实现技术创新
  • AI助手应用实战:从聊天到自动化工作流的进阶指南
  • AI智能写作工具如何优化学术论文撰写流程
  • GITEX国际展会中国区官方总代理实力解析与服务范围科普
  • 2026年本科生必备的10大AI工具指南
  • rsvelte深度解析:用Rust重写Svelte工具链,编译速度提升100倍的背后工程
  • 2026年8月佛山箱包金属锁扣/佛山五金金属锁扣厂家精选推荐_佛山市南海区金沙联沙长升五金厂 - 品牌宣传支持者
  • AI建站不只是生成网页,HostMod 把“上线”也一并解决了
  • Unity调用Windows本地打印机:免插件方案与进程调用法详解
  • 2026 年当下,朗评价高的全自动龙门洗车机制造厂家怎么联系,10块钱就能搞定的洗车,居然比人工洗得还干净?-程熙环保龙门洗车机 - 品质体验官