ros2 jazzy 用c++开发服务节点,回调函数使用类非静态成员函数

以下是一个符合ROS2 Jazzy规范的C++服务节点详细范例,使用类非静态成员函数作为服务回调:

#include"rclcpp/rclcpp.hpp"#include"example_interfaces/srv/add_two_ints.hpp"classMinimalService:publicrclcpp::Node{public:MinimalService():Node("minimal_service"){// 创建服务(使用非静态成员函数作为回调)service_=create_service<example_interfaces::srv::AddTwoInts>("add_two_ints",std::bind(&MinimalService::handle_service,this,std::placeholders::_1,std::placeholders::_2));}private:// 服务回调函数(类非静态成员函数)voidhandle_service(constexample_interfaces::srv::AddTwoInts::Request::SharedPtr request,example_interfaces::srv::AddTwoInts::Response::SharedPtr response){RCLCPP_INFO(this->get_logger(),"Incoming request: a=%ld b=%ld",request->a,request->b);// 业务逻辑处理response->sum=request->a+request->b;RCLCPP_INFO(this->get_logger(),"Sending response: %ld",response->sum);}rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service_;};intmain(intargc,char**argv){rclcpp::init(argc,argv);autonode=std::make_shared<MinimalService>();rclcpp::spin(node);rclcpp::shutdown();return0;}

关键要素解析:

  1. 服务创建

    create_service<ServiceType>("service_name",std::bind(&ClassName::MemberFunction,this,std::placeholders::_1,std::placeholders::_2));
  2. 回调函数签名

    voidhandle_service(constRequestType::SharedPtr request,ResponseType::SharedPtr response);
  3. 编译配置(CMakeLists.txt)

    find_package(ament_cmake REQUIRED) find_package(example_interfaces REQUIRED) add_executable(service_node src/service.cpp) ament_target_dependencies(service_node example_interfaces rclcpp ) install(TARGETS service_node DESTINATION lib/${PROJECT_NAME} )
  4. **参数说明:

    • 使用std::bind绑定类成员函数和this指针
    • std::placeholders::_1/_2占位符匹配请求/响应参数
    • 回调函数参数必须使用SharedPtr智能指针
    • 回调函数返回类型必须为void

高级用法扩展:

多线程处理

#include"rclcpp/executors/multi_threaded_executor.hpp"intmain(intargc,char**argv){rclcpp::init(argc,argv);autonode=std::make_shared<MinimalService>();// 使用多线程执行器处理并发请求rclcpp::executors::MultiThreadedExecutor executor;executor.add_node(node);executor.spin();rclcpp::shutdown();return0;}

带回调组的服务

autocallback_group=create_callback_group(rclcpp::CallbackGroupType::Reentrant);service_=create_service<AddTwoInts>("add_two_ints",std::bind(&MinimalService::handle_service,this,std::placeholders::_1,std::placeholders::_2),rmw_qos_profile_services_default,callback_group// 指定回调组);

响应延迟处理

voidhandle_service(/*...*/){// 使用异步执行器延迟响应rclcpp::AsyncSpinnerspinner(1);spinner.start();// 复杂计算逻辑...response->sum=result;}

常见问题解决:

  1. 类型不匹配错误

    • 确保请求/响应参数使用SharedPtr类型
    • 回调函数签名必须严格匹配模板类型
  2. 生命周期管理

    // 在析构函数中清理资源~MinimalService(){RCLCPP_INFO(this->get_logger(),"Service node destroyed");}
  3. 错误处理

    try{// 业务逻辑...}catch(conststd::exception&e){RCLCPP_ERROR(this->get_logger(),"Service failed: %s",e.what());// 设置错误响应response->sum=-1;}

这个范例完整展示了如何在ROS2 Jazzy中使用类非静态成员函数作为服务回调,包含错误处理、多线程扩展等生产级代码特性,可直接编译运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1203754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开箱即用有多爽?PyTorch-2.x-Universal-Dev-v1.0五分钟上手实录

开箱即用有多爽&#xff1f;PyTorch-2.x-Universal-Dev-v1.0五分钟上手实录 1. 为什么“开箱即用”对开发者如此重要&#xff1f; 你有没有经历过这样的场景&#xff1a;刚拿到一个新项目&#xff0c;满心期待地打开终端&#xff0c;结果光是配置环境就花了半天&#xff1f;p…

系统思考:商业敏感度与组织反映

商业敏感度&#xff0c;从来不是判断对不对&#xff0c;而是判断发生在第几层。 很多组织只在事件层做反应&#xff1a;市场变了、客户变了、对手变了。少数组织会往下看一层&#xff1a;是哪些结构&#xff0c;在持续制造这些变化&#xff1f; 但真正危险的&#xff0c;往往发…

verl容器化部署:Docker镜像制作与运行指南

verl容器化部署&#xff1a;Docker镜像制作与运行指南 1. verl 是什么&#xff1f;为什么需要容器化部署 verl 是一个灵活、高效且可用于生产环境的强化学习&#xff08;RL&#xff09;训练框架&#xff0c;专为大型语言模型&#xff08;LLMs&#xff09;的后训练设计。它由字…

YOLOv10官方镜像Python调用示例,快速集成API

YOLOv10官方镜像Python调用示例&#xff0c;快速集成API 你是否曾为部署一个目标检测模型耗费整整两天&#xff1f;装CUDA版本、配PyTorch、编译TensorRT、调试ONNX导出……最后发现只是因为torchvision和Pillow版本冲突&#xff1f;别再重复造轮子了。YOLOv10官方镜像已预装全…

截图文字识别神器:用这颗镜像快速提取屏幕内容

截图文字识别神器&#xff1a;用这颗镜像快速提取屏幕内容 你有没有过这样的经历&#xff1a;看到网页上一段关键信息&#xff0c;想复制却无法选中&#xff1b;会议截图里密密麻麻的PPT文字&#xff0c;手动敲一遍要十分钟&#xff1b;学生党截取教材图片&#xff0c;却卡在“…

Glyph性能优化秘籍:如何提升OCR识别准确率

Glyph性能优化秘籍&#xff1a;如何提升OCR识别准确率 1. 引言&#xff1a;为什么你需要关注Glyph的OCR表现&#xff1f; 你有没有遇到过这样的情况&#xff1a;明明输入了一整页文档&#xff0c;模型却漏掉关键信息&#xff1f;或者在处理长文本时&#xff0c;推理速度慢得像…

Llama3-8B能否替代GPT-3.5?指令遵循能力对比评测教程

Llama3-8B能否替代GPT-3.5&#xff1f;指令遵循能力对比评测教程 你是不是也经常遇到这样的问题&#xff1a;想部署一个轻量但靠谱的开源大模型&#xff0c;既要能准确理解指令、回答专业问题&#xff0c;又不能动辄需要A100集群&#xff1f;GPT-3.5效果好但闭源、不可控、成本…

呼叫中心情绪监控应用:Emotion2Vec+镜像让管理更高效

呼叫中心情绪监控应用&#xff1a;Emotion2Vec镜像让管理更高效 1. 为什么呼叫中心需要实时情绪监控 在客户服务一线&#xff0c;每一次通话都是一次信任的建立或流失。传统质检方式依赖人工抽样监听&#xff0c;覆盖率通常不足5%&#xff0c;且滞后数小时甚至数天——当投诉…

MinerU支持中文PDF吗?多语言识别效果实测报告

MinerU支持中文PDF吗&#xff1f;多语言识别效果实测报告 你是不是也遇到过这样的问题&#xff1a;手头有一份几十页的中文技术文档PDF&#xff0c;想把里面的内容转成可编辑的Markdown&#xff0c;结果试了三四个工具&#xff0c;不是表格错位、就是公式变成乱码、图片丢失&a…

Qwen2.5-0.5B行业应用前景:中小企业AI化实操建议

Qwen2.5-0.5B行业应用前景&#xff1a;中小企业AI化实操建议 1. 小模型也能大作为&#xff1a;为什么0.5B值得中小企业关注 你可能听说过动辄几十亿、上百亿参数的大模型&#xff0c;但真正适合中小企业的AI助手&#xff0c;未必是“越大越好”。Qwen2.5-0.5B-Instruct 这个仅…

YOLOv10无NMS设计太香了!官方镜像让部署更简单

YOLOv10无NMS设计太香了&#xff01;官方镜像让部署更简单 在工业质检线上&#xff0c;每秒数十张PCB板图像需要被快速分析&#xff1b;在城市交通监控中心&#xff0c;成百上千路视频流要求实时处理——这些高并发、低延迟的视觉任务背后&#xff0c;都依赖一个核心能力&…

如何用测试镜像解决rc.local失效问题?亲测有效

如何用测试镜像解决rc.local失效问题&#xff1f;亲测有效 在现代 Linux 系统中&#xff0c;我们常常需要让某些脚本或程序在开机时自动运行。过去最简单的方法是修改 /etc/rc.local 文件&#xff0c;将命令写入其中即可实现开机自启。然而&#xff0c;从 Ubuntu 16.04 开始&a…

如何调用MinerU API?Python接口代码实例详解

如何调用MinerU API&#xff1f;Python接口代码实例详解 1. 简介&#xff1a;什么是 MinerU&#xff1f; MinerU 是由 OpenDataLab 推出的一款专注于 PDF 文档结构化提取的深度学习工具&#xff0c;特别适用于处理包含多栏排版、复杂表格、数学公式和嵌入图像的学术或技术类文…

Qwen3-4B响应延迟高?异步推理部署优化实战方案

Qwen3-4B响应延迟高&#xff1f;异步推理部署优化实战方案 1. 问题背景&#xff1a;为什么Qwen3-4B会变慢&#xff1f; 你有没有遇到这种情况&#xff1a;刚部署完 Qwen3-4B-Instruct-2507&#xff0c;第一次提问秒回&#xff0c;结果第二次就开始卡顿&#xff0c;甚至等了十…

BERT模型部署耗时长?一键镜像方案缩短80%配置时间

BERT模型部署耗时长&#xff1f;一键镜像方案缩短80%配置时间 你是不是也经历过&#xff1a;想快速验证一个中文语义理解想法&#xff0c;结果光是装环境、下模型、写推理脚本就折腾了两小时&#xff1f;改个依赖版本报错、GPU显存不够、HuggingFace缓存路径不对……这些琐碎问…

开源模型企业落地指南:Qwen3-4B生产环境部署规范

开源模型企业落地指南&#xff1a;Qwen3-4B生产环境部署规范 1. Qwen3-4B-Instruct-2507 模型简介 1.1 阿里开源的文本生成大模型 Qwen3-4B-Instruct-2507 是阿里云最新推出的开源大语言模型&#xff0c;属于通义千问系列中的轻量级高性能版本。该模型在保持较小参数规模&am…

告别PS!lama重绘技术实现AI智能移除图片内容

告别PS&#xff01;lama重绘技术实现AI智能移除图片内容 你是不是也遇到过这样的情况&#xff1a;一张完美的照片&#xff0c;却因为角落里的路人、烦人的水印或者画面中不该出现的物体而无法使用&#xff1f;过去我们只能依赖Photoshop这类专业软件&#xff0c;花大量时间学习…

Qwen2.5-0.5B响应不流畅?流式输出优化实战教程

Qwen2.5-0.5B响应不流畅&#xff1f;流式输出优化实战教程 1. 为什么小模型也会“卡顿”&#xff1a;从现象到本质 你刚部署好 Qwen2.5-0.5B-Instruct&#xff0c;满怀期待地输入“你好”&#xff0c;却等了两秒才看到第一个字蹦出来&#xff1b;问一句“Python怎么读取CSV文…

为什么BERT中文填空总出错?上下文理解优化教程

为什么BERT中文填空总出错&#xff1f;上下文理解优化教程 1. 先说个真实问题&#xff1a;你填的不是空&#xff0c;是陷阱 很多人第一次用BERT做中文填空时&#xff0c;都会遇到类似情况&#xff1a; 输入&#xff1a;“他一进门就[MASK]地笑了起来。” 模型返回&#xff1a…

SGLang生产部署避坑指南:常见错误排查步骤详解

SGLang生产部署避坑指南&#xff1a;常见错误排查步骤详解 在大模型应用日益普及的今天&#xff0c;如何高效、稳定地将LLM服务部署到生产环境&#xff0c;成为开发者面临的核心挑战。SGLang作为一款专注于提升推理效率的框架&#xff0c;凭借其独特的架构设计&#xff0c;在多…