Search code examples
pythonrosrospy

message_filters doesn't call the callback function


I'm trying to use the message_filters in order to subscribe to two topics. Here's my code

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)

But it never goes to the callback function. It just freezes at rospy.spin().


Solution

  • Rather than using TimeSynchronizer I used ApproximateTimeSynchronizer and it worked. So, I changed the code to-

    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)
    

    Before finding this solution, I just used global variables to access the message of the first topic by assigning the message to the global variable in the callback and used it on the callback of the second, and that's how I was able to work with both. It's not clean but saves hours of frustration.