Обратный вызов ROS TimeSynchronizer с разными идентификаторами потоков - PullRequest
0 голосов
/ 30 октября 2018

Я отлаживаю узел Python ROS, который подписывается на два сообщения и использует TimeSynchronizer для вызова одной функции.

self.image_sub = message_filters.Subscriber("/camera/color/image_raw", Image)
self.depth_sub = message_filters.Subscriber("/camera/aligned_depth_to_color/image_raw", Image)

self.ts = message_filters.TimeSynchronizer([self.image_sub, self.depth_sub], 1)       
self.ts.registerCallback(self.callback)   

В функции обратного вызова я рендерил некоторые данные, используя библиотеку Open3D. Время от времени я печатаю это сообщение в терминале GLFW Error: GLX: Failed to make context current, и рендеринг просто черный. Я подозревал, что это может быть проблема использования библиотеки Open3D из разных потоков. Поэтому я напечатал текущий идентификатор потока из функции обратного вызова:

def callback(self, rgb_data, depth_data):
    import threading
    print("thread:", threading.current_thread())        

    try:
        self.color_image = self.bridge.imgmsg_to_cv2(rgb_data, "bgr8")
        self.depth_image = self.bridge.imgmsg_to_cv2(depth_data, "16UC1")
    except CvBridgeError as e:
        print(e)        

    #Do some rendering involving self.color_image, self.depth_image
    #...

    return

Большую часть времени я получаю эту распечатку:

('thread:', <Thread(/camera/aligned_depth_to_color/image_raw, started daemon 140521947203328)>)

Но потом я иногда получаю еще один:

('thread:', <Thread(/camera/color/image_raw, started daemon 140521476069120)>)

Когда это происходит, я получаю сообщение GLFW Error: GLX: Failed to make context current. Похоже, что Open3D нельзя использовать из потока, который инициализировал свой контекст.

Но мой вопрос: почему обратный вызов вызывается из двух возможных потоков? и можно ли настроить TimeSynchronizer или что-то еще, чтобы мой обратный вызов всегда вызывался из одного потока?


[ Примечание ]:

  • Я в Ubuntu 16.04 и использую ROS Kinetic.

  • На данный момент я избежал этой проблемы, поставив в очередь в deque мои два изображения в обратном вызове и получив основной поток для обработки deque. Кажется, это решает проблему. Однако мне приходится иметь дело с вещами, которые ROS предоставляет уже через систему обмена сообщениями. Кроме того, мне все еще любопытно, почему, несмотря на наличие единственного обратного вызова, его можно вызывать из разных потоков, мне это кажется ошибкой.

...