ROS多线程服务话题定时器等回调函数处理

首先,Timer, topic, service都会有相对应到回调函数。在ROS机制中,通过注册相对应到句柄,他们的所有回调函数都会注册到全局回调队列里面。也就是GlobalCallbackQueue. 这个全局回调队列会被单线程ros::spin()或者是别的多线程给调用。当线程数满载处理回调函数,其他回调函数则会被阻塞,排队等待处理。

为了可以让自己需要到回调函数一直运行,不会被别的回调函数阻塞,可以自己自定义一个回调队列callback queues。

ros::NodeHandle nh;
nh.setCallbackQueue(&my_callback_queue);

首先这样做可以让自己想要的定时器、话题、服务等回调函数注册到自己定义的回调队列,而不会注册到默认的全局回调队列。这也意味着,自定义的回调队列不会被ros::spin和ros::spinOnce()进行回调处理。所以,自定义回调队列必须自定义处理,通过ros::CallbackQueue::callAvailable() 和 ros::CallbackQueue::callOne() 的方法。 callOne只会每次回调一次队列里面的回调函数,而available会处理回调队列里面的回调函数。

接着开启另一个线程实时处理自定义队列的回调函数。也就是该nodehandle句柄下的回调函数。

可以使用

ros::AsyncSpinner spinner(0, &my_callback_queue);
spinner.start();

或者

ros::MultiThreadedSpinner spinner(0);
spinner.spin(&my_callback_queue);

剩下句柄的回调函数都在全局回调队列中,有单线程spin或者多线程自动处理。默认情况下多线程后面没有回调队列指针,则处理全局回调队列

 

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中,可以使用多线程处理回调函数ROS提供了两种多线程回调处理的方法:ros::MultiThreadedSpinner和ros::AsyncSpinner。 ros::MultiThreadedSpinner是一个多线程回调处理类,它通过启动指定数量的Spinner线程并发执行Callback队列中的可用回调来处理回调函数。你可以通过指定回调队列来控制线程的数量和执行方式。 ros::AsyncSpinner是另一种多线程回调处理方法,它使用异步的方式来启停Spinner线程。你可以指定要开启的线程数量,并发执行Callback队列中的可用回调。 这两种多线程回调处理方法都能够在处理回调函数时提高效率,充分利用系统资源,同时保证其他回调函数不会被阻塞。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ROS多线程服务话题定时器回调函数处理](https://blog.csdn.net/GeForeverr/article/details/108776801)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【ROS】回调的多线程问题](https://blog.csdn.net/lemonxiaoxiao/article/details/128422748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值