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

【实践项目】 自定义服务消息Service(数学运算)

一、案例整体说明1. 功能需求实现一套 ROS 服务通信客户端发送两个数字 一个运算符 - * / %服务端接收数据并计算返回结果自定义服务消息约定请求 / 响应的数据格式2. 技术架构自定义服务消息包custom_server服务端节点接收请求→计算→返回结果客户端节点发送请求→接收结果→打印二、环境准备已创建 ROS 工作空间例如catkin_ws/src已安装 ROSNoetic/Melodic终端已配置 ROS 环境三、步骤 1创建自定义服务消息包1. 进入工作空间 src 目录cd ~/ros_workspace/src2. 创建功能包必须带指定依赖catkin_create_pkg custom_server roscpp rospy rosmsg std_msgs message_generation message_runtime包名custom_server规范业务名_srvs四、步骤 2定义自定义服务消息.srv 文件1. 创建 srv 目录cd ~/ros_workspace/src/custom_server mkdir srv2. 创建服务消息文件在srv目录下新建Arithmetic_Operations.srvtouch srv/Arithmetic_Operations.srv3. 编辑消息内容核心格式打开文件写入float64 A float64 B string option --- float64 result---上方请求数据客户端→服务端---下方响应数据服务端→客户端五、步骤 3配置编译文件package.xml CMakeLists.txt1. 配置 package.xml打开文件添加 / 确保存在以下配置build_dependmessage_generation/build_depend exec_dependmessage_runtime/exec_depend2. 配置 CMakeLists.txt关键1find_package 添加 message_generationfind_package(catkin REQUIRED COMPONENTS message_generation roscpp rosmsg rospy std_msgs )2声明服务消息文件add_service_files( FILES Arithmetic_Operations.srv )3配置消息依赖generate_messages( DEPENDENCIES std_msgs )4catkin 依赖声明catkin_package( CATKIN_DEPENDS message_runtime roscpp rospy std_msgs )六、步骤 4编译 验证自定义消息1. 编译工作空间cd ~/ros_workspace catkin_make2. 验证消息是否生成成功source devel/setup.bash rossrv show custom_server/Arithmetic_Operations✅ 输出如下则成功float64 A float64 B string option --- float64 result七、步骤 5编写服务端节点ros_server_option.cpp1. 创建源码文件cd ~/ros_workspace/src/custom_server mkdir src touch src/ros_server_option.cpp2. 写入完整代码#include iostream #include string #include ros/ros.h #include custom_server/Arithmetic_Operations.h #include locale using namespace std; // 服务回调函数处理运算逻辑 bool callBack(custom_server::Arithmetic_Operations::Request request, custom_server::Arithmetic_Operations::Response response) { string op request.option; double A request.A; double B request.B; // 加减乘除取模运算 if(op ){ response.result A B; } else if(op -){ response.result A - B; } else if(op *){ response.result A * B; } else if(op /){ if(B 0){ ROS_ERROR(错误除数不能为0); response.result 0; }else{ response.result A / B; } } else if(op %){ response.result (int)A % (int)B; } else{ ROS_ERROR(不支持的运算符); response.result 0; } // 打印日志 ROS_INFO(请求A%.2f, B%.2f, 运算符%s, A, B, op.c_str()); ROS_INFO(响应计算结果%.2f, response.result); return true; } int main(int argc,char *argv[]){ setlocale(LC_ALL, ); // 解决中文乱码 ros::init(argc, argv, math_server); // 节点名 ros::NodeHandle nh; // 创建服务服务名 num_service_o ros::ServiceServer server nh.advertiseService(num_service_o, callBack); ROS_INFO(数学运算服务已启动等待客户端请求...); ros::spin(); // 持续监听 return 0; }八、步骤 6编写客户端节点ros_client_option.cpp1. 创建文件touch src/ros_client_option.cpp2. 写入完整代码#include iostream #include ros/ros.h #include custom_server/Arithmetic_Operations.h #include locale using namespace std; int main(int argc,char *argv[]){ setlocale(LC_ALL, ); ros::init(argc, argv, math_client); // 参数校验必须输入 数字A 数字B 运算符 if (argc ! 4){ ROS_INFO(使用格式rosrun custom_server ros_client_option A B 运算符); ROS_INFO(示例rosrun custom_server ros_client_option 10 20 ); return 1; } ros::NodeHandle nh; // 创建客户端连接服务名 num_service_o ros::ServiceClient client nh.serviceClientcustom_server::Arithmetic_Operations(num_service_o); // 组装请求数据 custom_server::Arithmetic_Operations srv; srv.request.A atof(argv[1]); srv.request.B atof(argv[2]); srv.request.option argv[3]; // 发送请求并等待响应 if(client.call(srv)){ ROS_INFO(✅ 计算成功结果%.2f, srv.response.result); }else{ ROS_ERROR(❌ 服务调用失败); return 1; } return 0; }九、步骤 7CMakeLists.txt 配置可执行文件在CMakeLists.txt末尾添加# 生成服务端可执行文件 add_executable(ros_server_option src/ros_server_option.cpp) # 生成客户端可执行文件 add_executable(ros_client_option src/ros_client_option.cpp) add_dependencies(ros_server_option ${${PROJECT_NAME}_EXPORTED_TARGETS} add_dependencies(ros_client_option ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(ros_server_option ${catkin_LIBRARIES}) ${catkin_EXPORTED_TARGETS}) target_link_libraries(ros_client_option ${catkin_LIBRARIES})十、步骤 8最终编译cd ~/ros_workspace catkin_make source devel/setup.bash十一、步骤 9运行测试1. 终端 1启动 ROS 核心roscore2. 终端 2启动服务端source devel/setup.bash rosrun custom_server ros_server_option3. 终端 3启动客户端测试运算source devel/setup.bash # 加法 rosrun custom_server ros_client_option 10 20 # 减法 rosrun custom_server ros_client_option 10 20 - # 乘法 rosrun custom_server ros_client_option 10 20 * # 除法 rosrun custom_server ros_client_option 10 20 / # 取模 rosrun custom_server ros_client_option 10 20 %十二、运行结果服务端输出请求A10.00, B20.00, 运算符 响应计算结果30.00客户端输出✅ 计算成功结果30.00十三、完整流程总结创建包→ 2.建 srv 目录 写消息→ 3.配置编译文件→ 4.编译验证消息写服务端→ 6.写客户端→ 7.配置 CMake→ 8.编译运行总结自定义服务消息核心是.srv文件用---分隔请求与响应必须正确配置CMakeLists.txt才能生成消息头文件服务端通过advertiseService注册服务客户端通过call发送请求本案例完整支持 - * / %五种运算带异常处理

相关文章:

【实践项目】 自定义服务消息Service(数学运算)

一、案例整体说明1. 功能需求实现一套 ROS 服务通信:客户端:发送两个数字 一个运算符( - * / %)服务端:接收数据并计算,返回结果自定义服务消息:约定请求 / 响应的数据格式2. 技术架构自定义服…...

open-vm-tools 开发入门:如何为开源虚拟化工具贡献代码

open-vm-tools 开发入门:如何为开源虚拟化工具贡献代码 【免费下载链接】open-vm-tools Official repository of VMware open-vm-tools project 项目地址: https://gitcode.com/gh_mirrors/op/open-vm-tools open-vm-tools 是 VMware 官方开源的虚拟化工具集…...

告别SPI瓶颈:用STM32的FSMC并行接口驱动LAN9252,榨干EtherCAT从站性能

突破EtherCAT从站性能极限:STM32 FSMC并行接口驱动LAN9252全解析 在工业自动化领域,实时以太网协议EtherCAT因其卓越的性能表现已成为运动控制系统的首选。然而许多工程师在实际部署中常遇到一个尴尬局面——主站协议处理速度飞快,而从站控制…...

Win11Debloat:解放你的Windows系统,5分钟焕新极简体验

Win11Debloat:解放你的Windows系统,5分钟焕新极简体验 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declu…...

moectf2025 rush

如此例题:利用随波逐流进行解题,将图片拖进去,在图片隐写中,找到GIF分离,将rush.gif分解为一张张独立的静态图片,并保存在新的文件夹中利用QR research进行扫描即可得出flag为moectf{QR_C0d3s_feATUR3_eRror_c0RRECt10N}...

快消企业如何选择品牌策划公司?

在寻找专业的品牌策划公司时,福建远见品牌策划公司凭借其系统的策略思维、创新的执行能力和显著的行业口碑,成为众多企业,尤其是注重品牌长期价值企业的优先选择。为什么选择专业的品牌策划公司?专业的品牌策划公司能帮助企业&…...

DeepSeek-OCR-2部署指南:Docker镜像开箱即用,无网络依赖保隐私

DeepSeek-OCR-2部署指南:Docker镜像开箱即用,无网络依赖保隐私 1. 项目简介 DeepSeek-OCR-2 是一个基于深度学习的智能文档解析工具,专门为解决文档数字化难题而设计。与传统的OCR工具只能提取纯文本不同,这个工具能够理解文档的…...

Tensorflow-101自编码器AE深度解析:降噪与卷积自编码器实现指南

Tensorflow-101自编码器AE深度解析:降噪与卷积自编码器实现指南 【免费下载链接】Tensorflow-101 项目地址: https://gitcode.com/gh_mirrors/te/Tensorflow-101 在深度学习领域中,自编码器(Autoencoder,AE)作…...

推荐系统必看:余弦距离与欧式距离在用户行为分析中的实战对比

推荐系统必看:余弦距离与欧式距离在用户行为分析中的实战对比 在构建推荐系统时,距离度量的选择往往决定了模型对用户偏好的理解深度。想象一下这样的场景:当两位用户同时观看了《星际穿越》和《盗梦空间》,但一位用户给前者打了…...

C++ 引入第三方库(三):使用 CMake 导入

使用 CMake 导入库其实应该称为:使用 CMake 将第三方库安装到 CMake 的 install 目录下。解释一下:首先,CMake 有着与 Maven 类似的 install 机制,通过 cmake --install 命令可以将本地项目安装到 CMAKE_INSTALL_PREFIX 目录下&am…...

FastAPI异步测试终极指南:从配置到实现的完整教程

FastAPI异步测试终极指南:从配置到实现的完整教程 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI异步测试是构建高…...

三步搞定B站视频下载:开源工具BiliDownload终极指南

三步搞定B站视频下载:开源工具BiliDownload终极指南 【免费下载链接】BiliDownload B站视频下载工具 项目地址: https://gitcode.com/gh_mirrors/bil/BiliDownload 在数字内容日益丰富的今天,B站(哔哩哔哩)已成为我们获取知…...

BeRoot代码实现原理:深入理解文件权限与服务配置检查机制

BeRoot代码实现原理:深入理解文件权限与服务配置检查机制 【免费下载链接】BeRoot Privilege Escalation Project - Windows / Linux / Mac 项目地址: https://gitcode.com/gh_mirrors/be/BeRoot BeRoot是一款强大的权限提升工具,支持Windows、Li…...

5步实战指南:深度解析UEFITool 0.28固件编辑工具的核心应用

5步实战指南:深度解析UEFITool 0.28固件编辑工具的核心应用 【免费下载链接】UEFITOOL28 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITOOL28 UEFITool 0.28是一款专业的跨平台UEFI固件解析与编辑工具,采用C/Qt框架开发,支持Wi…...

梯度下降为什么总往‘下坡’走?用Python代码直观理解负梯度的奥秘

梯度下降为什么总往‘下坡’走?用Python代码直观理解负梯度的奥秘 想象你站在一座云雾缭绕的山丘上,手拿一张只能显示当前位置坡度的手绘地图。你的目标是找到下山最快的路径——这恰恰是梯度下降算法要解决的核心问题。对于机器学习初学者而言&#xff…...

好写作AI毕业论文功能实测:你的论文写作智能副驾已上线

写论文这件事,你负责开车,AI负责导航——分工明确才能到终点 想象一个场景:你刚拿到驾照,要独自开一趟1000公里的长途。 导航软件给你规划了路线,但你得自己看路标、自己踩油门、自己判断什么时候变道、自己找加油站。…...

TensorFlow Lite Micro入门教程:5分钟搭建你的第一个嵌入式AI应用

TensorFlow Lite Micro入门教程:5分钟搭建你的第一个嵌入式AI应用 【免费下载链接】tflite-micro Infrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal process…...

从PyTorch到Android:YOLOv11模型轻量化部署与Qt实战避坑指南

1. 为什么选择Qt for Android部署YOLOv11? 对于习惯C开发的工程师来说,用Qt框架做Android端部署是个非常务实的选择。我去年接手一个农业巡检项目时,需要在无人机平板上实时检测作物病害,当时尝试过Android Studio方案&#xff0c…...

编码检测终极指南:告别乱码的批量字符集检测解决方案

编码检测终极指南:告别乱码的批量字符集检测解决方案 【免费下载链接】EncodingChecker A GUI tool that allows you to validate the text encoding of one or more files. Modified from https://encodingchecker.codeplex.com/ 项目地址: https://gitcode.com/…...

nsenter 实战技巧:如何绕过 cgroups 限制进行容器诊断

nsenter 实战技巧:如何绕过 cgroups 限制进行容器诊断 【免费下载链接】nsenter 项目地址: https://gitcode.com/gh_mirrors/ns/nsenter 在容器化部署中,nsenter 是一款强大的系统工具,它能够让用户直接进入正在运行的容器命名空间&a…...

如何永久保存微信聊天记录:WeChatMsg免费工具完全指南

如何永久保存微信聊天记录:WeChatMsg免费工具完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

FastAPI OpenAPI文档:从基础配置到高级定制的完整指南

FastAPI OpenAPI文档:从基础配置到高级定制的完整指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi 想要快速构建API并自…...

2026本科毕业论文工具 TOP10:从选题到答辩,AI 帮你一键通关

毕业季的论文焦虑,几乎是每个本科生逃不开的 “必修课”。选题卡壳、文献堆砌、格式返工、查重降重反复折腾…… 与其硬熬,不如找对工具。今天就给大家整理了10 款超实用的 AI 毕业论文写作工具,尤其是榜首的 Paperxie,堪称本科生…...

SEO_本地商家如何进行有效的SEO推广

SEO推广的基础:为什么本地商家需要SEO 在如今的数字化时代,互联网已经成为人们获取信息、购买商品和服务的重要途径。对于本地商家来说,如何在这个竞争激烈的市场中脱颖而出,是一个不容忽视的问题。这时,SEO推广应运而…...

别再只用WinForm了!用Godot 4.2给西门子PLC做个炫酷3D监控界面(附完整C#源码)

工业自动化新视界:用Godot 4.2打造PLC三维监控系统的实战指南 当传统工控界面遇上现代游戏引擎技术,会碰撞出怎样的火花?在工业4.0时代,设备监控系统早已不再满足于简单的二维图表和静态指示灯。想象一下:通过逼真的三…...

Go Context 控制流的正确使用方式

Go语言中的Context是控制并发流程的重要工具,它不仅能传递请求范围的数据,还能优雅地处理超时、取消等场景。正确使用Context可以避免资源泄漏、提升程序健壮性,但错误的使用方式可能导致难以排查的问题。本文将深入探讨Context的核心使用原则…...

URDF避坑指南:如何用SolidWorks导出模型并优化ROS仿真效果

URDF工业级建模实战:从SolidWorks到Gazebo仿真的全流程优化 在机器人开发领域,URDF(统一机器人描述格式)作为ROS生态中的标准建模语言,承担着连接机械设计与算法仿真的关键桥梁作用。然而,当开发者从基础UR…...

数据本体论 vs 数仓实体建模?

一、定义与起源 维度 数据本体论 (Data Ontology) 数仓实体建模 定义 哲学“存在论”在计算机领域的应用,强调语义统一 数据库ER建模方法,强调数据结构化与存储优化 核心思想 以“概念/类”为中心,描述事物“是什么”及“为何关联” 以“…...

数据中心布线新宠:SlimSAS连接器实战配置指南(含常见问题排查)

数据中心布线新宠:SlimSAS连接器实战配置指南(含常见问题排查) 在数据中心高密度布线的战场上,每平方厘米的空间都弥足珍贵。去年某金融客户的核心存储升级项目中,我们遇到一个典型难题:原有SAS连接器在48U…...

itch游戏启动流程详解:从点击到运行的完整技术实现

itch游戏启动流程详解:从点击到运行的完整技术实现 【免费下载链接】itch 🎮 The best way to play your itch.io games 项目地址: https://gitcode.com/gh_mirrors/it/itch itch.io桌面客户端是游戏玩家和开发者的终极工具,它提供了一…...