news 2026/4/19 17:37:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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中使用类非静态成员函数作为服务回调,包含错误处理、多线程扩展等生产级代码特性,可直接编译运行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 20:19:10

GPEN部署卡在依赖安装?预装环境镜像免配置解决方案

GPEN部署卡在依赖安装&#xff1f;预装环境镜像免配置解决方案 你是不是也遇到过这样的情况&#xff1a;想试试GPEN人像修复效果&#xff0c;刚clone完代码&#xff0c;pip install -r requirements.txt还没跑完&#xff0c;就卡在torch版本冲突、facexlib编译失败、CUDA驱动不…

作者头像 李华
网站建设 2026/4/17 12:56:56

用测试镜像配置开机启动,少走弯路的完整避坑指南

用测试镜像配置开机启动&#xff0c;少走弯路的完整避坑指南 1. 为什么这个“小功能”总让人反复踩坑 你是不是也遇到过这样的情况&#xff1a; 写好了服务脚本&#xff0c;手动运行一切正常&#xff1b; 加进 /etc/init.d/&#xff0c;执行 update-rc.d 也提示成功&#xff…

作者头像 李华
网站建设 2026/4/17 21:36:02

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

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

作者头像 李华
网站建设 2026/4/18 20:44:58

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

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

作者头像 李华
网站建设 2026/4/17 19:42:06

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

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

作者头像 李华
网站建设 2026/4/18 23:36:35

AI对话踩坑记录:用Qwen3-1.7B避开了这些陷阱

AI对话踩坑记录&#xff1a;用Qwen3-1.7B避开了这些陷阱 最近在本地部署和调用 Qwen3-1.7B 做对话系统时&#xff0c;踩了不少坑。从环境配置到接口调用&#xff0c;再到实际推理表现&#xff0c;每一步都可能藏着“惊喜”。本文不讲高深理论&#xff0c;只分享我在使用 CSDN …

作者头像 李华