message_filters 没有调用回调函数

message_filters doesn't call the callback function

我正在尝试使用 message_filters 订阅两个主题。这是我的代码

class sync_listener:
    def __init__(self):
        self.image_sub = message_filters.Subscriber('camera/rgb/image_color', Image)
        self.info_sub = message_filters.Subscriber('camera/projector/camera_info', CameraInfo)
        self.ts = message_filters.TimeSynchronizer([self.image_sub, self.info_sub], 10)
        self.ts.registerCallback(self.callback)

    def callback(self, image, camera_info):
        print("done")

def main(args):
    ls = sync_listener()
    rospy.init_node('sample_message_filters', anonymous=True)
    try:
        rospy.spin()
    except KeyboardInterrupt:
        print("Shutting down")

if __name__ == '__main__':
    main(sys.argv)

但它永远不会进入回调函数。它只是冻结在 rospy.spin()

我没有使用 TimeSynchronizer,而是使用了 ApproximateTimeSynchronizer,而且效果很好。所以,我把代码改成了-

class sync_listener:
    def __init__(self):
        self.image_sub = message_filters.Subscriber('camera/rgb/image_color', Image)
        self.info_sub = message_filters.Subscriber('camera/projector/camera_info', CameraInfo)
        self.ts = message_filters.ApproximateTimeSynchronizer([self.image_sub, self.info_sub], 1, 1) # Changed code
        self.ts.registerCallback(self.callback)

    def callback(self, image, camera_info):
        print("done")

def main(args):
    ls = sync_listener()
    rospy.init_node('sample_message_filters', anonymous=True)
    try:
        rospy.spin()
    except KeyboardInterrupt:
        print("Shutting down")

if __name__ == '__main__':
    main(sys.argv)

在找到这个解决方案之前,我只是使用全局变量通过将消息分配给回调中的全局变量来访问第一个主题的消息,然后在第二个主题的回调中使用它,这就是我能够与两者一起工作。它不干净,但可以节省数小时的挫败感。