首页 > 其他分享 >【ROS】-- 自定义回调队列

【ROS】-- 自定义回调队列

时间:2024-05-27 20:35:30浏览次数:21  
标签:ros 自定义 ops -- 回调 queue 队列 ROS

在 ros 中,我们常用的回调处理是 ros::spin() 或者 ros::spinOnce(),但是,这两个是阻塞式单线程处理的, 即当不做其他处理的情况下,某一个回调函数堵塞,其他topic或者service的回调函数就无法进入。

使用ros多线程的方式可以解决该问题,但引入多线程会导致线程安全的问题。针对某些场景,可以手动将回调函数分到不同的回调队列中去,不同回调队列内部仍是单线程。
【ROS】在类中实现自定义多线程回调 文中给出了类内自定义topic 订阅回调函数的解决思路,简单总结如下:
1、先在类的声明中提供自定义的回调队列:

/**
ros::SubscribeOptions ops=ros::SubscribeOptions::create<bhand_controller::State>(
                "/bhand_node/state",
                1,
                state_callback,
                ros::VoidPtr(),
                &state_callback_queue
                ) 
*/
// SubscribeOptions 不支持将类成员函数设置为回调函数, 需要单独声明模板目标
template <class M, class T>
ros::SubscribeOptions getSubscribeOptions(
    const std::string &topic, uint32_t queue_size,
    void (T::*fp)(const boost::shared_ptr<M const> &),
    T* obj,
    ros::CallbackQueueInterface* queue,
    const ros::TransportHints &transport_hints = ros::TransportHints()) {
    ros::SubscribeOptions ops;
    ops.template init<M>(topic, queue_size, boost::bind(fp, obj, _1));
    ops.callback_queue = queue;
    ops.transport_hints = transport_hints;
    return ops;
}

2、利用 ros::AsyncSpinner 异步多线程处理特定回调队列:

ros::CallbackQueue string_queue;
ros::SubscribeOptions ops = getSubscribeOptions(image_topic,1,
				&Rotation::image_callback,this, &m_image_queue);//image_topic为订阅的图像话题名称
m_img_subscriber = nh_.subscribe(ops);
// 队列长度为1保证该回调队列内部仍为单线程
ros::AsyncSpinner spinner_(1, &string_queue);
// start the spinner
spinner_.start();

参考上面的实现,给出ros service的自定义回调队列的实现方式

template <class Service, class T>
	ros::AdvertiseServiceOptions getAdvertiseServiceOptions(
	const std::string& service,
	bool (T::*fp)(typename Service::Request&, typename Service::Response&),
	T* obj,
	ros::CallbackQueueInterface* queue) {
	ros::AdvertiseServiceOptions ops;
	ops.init<typename Service::Request, typename Service::Response>(service, boost::bind(fp, obj, _1, _2));
	ops.callback_queue = queue;
	return ops;
}

标签:ros,自定义,ops,--,回调,queue,队列,ROS
From: https://www.cnblogs.com/Maybera/p/18216454

相关文章

  • ACM CCS CONCEPTS 翻译
    根据ACM的出版要求,请在正文中关键词的下面补充CCSCONCEPTS部分。CCS操作如下:登录https://dl.acm.org/ccs选择,根据自己研究方向选择类目,复制张贴CCS中所选类目的文字。并将CCS的代码复制在文件的备注栏(请参考ACM-2的操作指引)。目前首页总共有13个类目,含义和内容分别如下:G......
  • 强化学习快速入门
    本文章通过强化学习快速入门(https://zhuanlan.zhihu.com/p/699934259)在线发布并更新。1.强化学习直观理解强化学习的应用场景是马尔可夫过程,很多现实中的问题都可以认为是马尔可夫过程,特征是当前状态仅仅与前一个状态有关,而与更早的状态无关。按照随机过程的定义:\[\begin{ali......
  • DB Link导致SCN Headroom以及2012年1月的CPU或PSU补丁问题研究
    转自:https://www.cnblogs.com/dc-chen/p/7245290.htmlhttps://www.laoxiong.net/scn-ora-19706-_external_scn_rejection_threshold_hours-parameter.htmlhttps://www.modb.pro/db/4664https://www.iteye.com/blog/tianmaotalk-2437997一、基础概念1、SCN(SystemChangeNumb......
  • 收放卷主从轴速度随动增益计算(CODESYS ST代码)
    收放卷主从轴速度随动控制,我们需要知道随动增益,如果是利用电子齿轮实现速度随动,我们需要通过增益计算电子齿轮比的分子和分母,具体源代码大家可以参考下面文章链接:收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)_收放卷伺服控制属于-CSDN博客文章浏览阅读2......
  • 大语言模型的高效提示方法:综述
    24年4月东北大学的论文“EfficientPromptingMethodsforLargeLanguageModels:ASurvey”。提示已成为将大语言模型(LLM)应用于特定自然语言处理任务的主流范例。虽然这种方法为LLM的上下文学习ICL打开了大门,但它带来了模型推理的额外计算负担和手工设计提示的人......
  • AtCoder abc325D
    原题链接ProblemStatementThereare\(N\)productslabeled\(1\)to\(N\)flowingonaconveyorbelt.AKeyenceprinterisattachedtotheconveyorbelt,andproduct\(i\)enterstherangeoftheprinter\(T_i\)microsecondsfromnowandleavesit......
  • SpringBoot继承JWT token实现权限的验证(从头开始)
    目录概述前提:我们需要知道的文件的用处第1步:数据库的连接第2步:定义一个标准化响应对象的类第3步:编写请求数据库数据代码第4步:自定义异常处理第5步:导入依赖第6步:自定义拦截器第7步:配置拦截器第8步:生成token第9步:开始测试代码第10步:vue请求示例扩展:自定义注解AuthAc......
  • 2024年中国金融行业网络安全案例集
    随着科技的飞速发展,金融行业与信息技术的融合日益加深,网络安全已成为金融行业发展的生命线。金融行业作为国家经济的核心支柱,正在面临着日益复杂严峻的网络安全挑战。因此,深入研究和探讨金融行业的网络安全问题,不仅关乎金融行业的稳健运行,更关系到国家经济的安全和社会的稳......
  • 5_27总结
    增强for循环一般for循环:int[]num={1,2,3,4,5,6};for(inti=0;i<num.length;i++){System.out.println("元素:"+num[i]);}增强for循环:int[]num={1,2,3,4,5,6};for(inti:num){//集合或数组a:数组名称numSystem.out.println......
  • spring项目报错error:java:无效的目标发行版:15 解决
    1.报错原因由控制台信息可知报错原因是Error:java:无效的目标发行版:15"指的是你尝试使用Java编译器(javac)编译Java代码时,指定的目标版本是15,但是你的编译器版本(在这里是javac8)不支持这个目标版本。 2.依次排查错误首先我想到的就是在peojectsetting检查jd......