Ошибка Rospy message_filter ApproximateTimeSynchronizer

Я установил ROS melodic версию в Ubuntu 18.04. Я запускаю rosbag в фоновом режиме, чтобы издеваться над камерами в сообщениях rostopics. Я установил имена камер в rosparams и повторил их, чтобы зафиксировать темы каждой камеры. Я использую message_filter ApproximateTimeSynchronizer для получения синхронизированных по времени данных, как указано в официальной документации, http://wiki.ros.org/message_filters

Но большую часть времени функция обратного вызова для ApproximateTimeSynchronizer не вызывается/имеет задержку. Фрагмент кода, который я использую, приведен ниже:

Что я здесь делаю неправильно?

def  camera_callback(*args):
    pass # Other logic comes here
rospy.init_node('my_listener', anonymous=True) 
camera_object_data = []
for camera_name in rospy.get_param('/my/cameras'):
    camera_object_data.append(message_filters.Subscriber(
        '/{}/hd/camera_info'.format(camera_name), CameraInfo))
    camera_object_data.append(message_filters.Subscriber(
        '/{}/hd/image_color_rect'.format(camera_name), Image))
    camera_object_data.append(message_filters.Subscriber(
        '/{}/qhd/image_depth_rect'.format(camera_name), Image))
    camera_object_data.append(message_filters.Subscriber(
        '/{}/qhd/points'.format(camera_name), PointCloud2)
 topic_list = [filter_obj for filter_obj in camera_object_data]
 ts = message_filters.ApproximateTimeSynchronizer(topic_list, 10, 1,  allow_headerless=True)
 ts.registerCallback(camera_callback)
 rospy.spin()

person user12757    schedule 01.09.2019    source источник


Ответы (1)


Глядя на ваш код, он кажется правильным. Однако есть проблема с неправильными отметками времени и, следовательно, с этим синхронизатором, см. http://wiki.ros.org/message_filters/ApproximateTime для предположений алгоритма.

Я рекомендую написать соответствующий узел, который одновременно публикует пустые версии этих четырех сообщений. Если это все еще не работает в этом идеальном сценарии, существует проблема с приведенным выше кодом. Если он работает нормально, то вам нужно обратить внимание на заголовки.

Учитывая, что он у вас есть в виде пакетного файла, вы можете пройтись по сообщениям в командной строке и обратите внимание на временные метки. (Также можно выполнить шаг внутри python).

$ rosbag play --pause recorded1.bag # step through msgs by pressing 's'

В зашумленных по времени сообщениях с небольшой полезной нагрузкой я только что написал узел для прослушивания всех этих сообщений и повторной публикации их всех с последним временем, найденным в любом из них (для синхронизации с ведением журнала в csv). Не оптимально, но должно показать, в чем проблема.

person JWCS    schedule 04.09.2019