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

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.jsqmd.com/news/287598/

相关文章:

  • 开箱即用有多爽?PyTorch-2.x-Universal-Dev-v1.0五分钟上手实录
  • 系统思考:商业敏感度与组织反映
  • verl容器化部署:Docker镜像制作与运行指南
  • YOLOv10官方镜像Python调用示例,快速集成API
  • Glyph性能优化秘籍:如何提升OCR识别准确率
  • 截图文字识别神器:用这颗镜像快速提取屏幕内容
  • Llama3-8B能否替代GPT-3.5?指令遵循能力对比评测教程
  • 呼叫中心情绪监控应用:Emotion2Vec+镜像让管理更高效
  • MinerU支持中文PDF吗?多语言识别效果实测报告
  • Qwen2.5-0.5B行业应用前景:中小企业AI化实操建议
  • YOLOv10无NMS设计太香了!官方镜像让部署更简单
  • 如何用测试镜像解决rc.local失效问题?亲测有效
  • 如何调用MinerU API?Python接口代码实例详解
  • Qwen3-4B响应延迟高?异步推理部署优化实战方案
  • BERT模型部署耗时长?一键镜像方案缩短80%配置时间
  • 告别PS!lama重绘技术实现AI智能移除图片内容
  • 开源模型企业落地指南:Qwen3-4B生产环境部署规范
  • Qwen2.5-0.5B响应不流畅?流式输出优化实战教程
  • 为什么BERT中文填空总出错?上下文理解优化教程
  • SGLang生产部署避坑指南:常见错误排查步骤详解
  • 2026年多语言检索入门必看:Qwen3-Embedding-4B实战指南
  • 看完就想试!FSMN VAD打造的智能音频处理系统展示
  • Cute_Animal_For_Kids_Qwen_Image商业应用案例:IP形象设计自动化
  • 2026年开年徐州可靠的湿式制动器生产厂家口碑推荐榜
  • 中小企业AI落地实战:Llama3-8B企业客服部署案例
  • 绝对路径输入更稳定,BSHM使用小技巧分享
  • 保姆级教学:跟着操作就能跑通Qwen2.5-7B微调流程
  • AI对话踩坑记录:用Qwen3-1.7B避开了这些陷阱
  • Qwen3-4B响应截断?长输出生成优化部署实战
  • Qwen3-4B显存优化技巧:小显存GPU高效运行部署实战案例