具有不同线程ID的ROS TimeSynchronizer回调

时间:2018-10-30 13:02:12

标签: python multithreading python-multithreading ros

我正在调试一个预订两个消息并使用TimeSynchronizer来调用单个函数的Python ROS节点。

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库可能是一个问题。因此,我从回调函数中打印了当前线程ID:

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。

  • 目前,我通过在回调中将我的两个图像排队到双端队列中来避免了这个问题,并拥有用于处理双端队列的主线程。那似乎解决了问题。但是,我必须处理ROS已经通过消息传递系统提供的内容。另外,我仍然很好奇为什么尽管有一个回调可以从不同的线程调用,但对我来说似乎是个错误。

0 个答案:

没有答案