2017-01-12 14 views
2

Я пишу программу в ROS, которая должна выполнять определенные вычисления после каждой функции обратного вызова. Моя функция обратного вызова в основном подписывается на тему и устанавливает значение переменной, которая используется для выполнения определенного вычисления. Тема, на которую я подписываюсь, имеет частоту 30 Гц. Итак, у меня есть цикл while в моей программе, который работает со скоростью 30 Гц. Петля несколько похожа на следующий код:Есть ли способ сделать ros :: spinOnce() вызов определенного числа обратных вызовов из очереди обратного вызова?

while (ros::ok()) 
{ 
    ros::spinOnce(); //this should set a certain variable "a" 
    perform_computation(); //this performs computation on the variable "a" 
    looprate.sleep(); //this runs at 30 Hz 
} 

ответ

2

ROS :: spinOnce() похож на ROS :: спины(), но с той разницей, что он не блокирует. Каждый вызов ros :: spinOnce() будет обрабатывать все принятых сообщений с момента последнего вызова, то есть он будет вызывать все функции обратного вызова абонента для каждого из сообщений. Если вы хотите взять контроль над функциями обратного вызова, я бы буферизую сообщения, полученные от функции обратного вызова, и обрабатываю буферизованные сообщения в такте и в нужной последовательности. Это также способ обработки информации, если обратный вызов делает несколько длительных вычислений. Функция обратных вызовов должна быть очень быстрой.