Есть ли способ заставить ros::spinOnce() вызывать определенное количество обратных вызовов из очереди обратных вызовов?

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

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 
}

person Telepresence    schedule 12.01.2017    source источник


Ответы (1)


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

person cassinaj    schedule 13.01.2017