0

ROS melodicUbuntu 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()
4

1 回答 1

0

查看您的代码,它似乎是正确的。但是,可能存在错误的时间戳和因此这个同步器的问题,有关算法假设,请参见http://wiki.ros.org/message_filters/ApproximateTime

我的建议是编写一个相应的节点,同时发布这四个 msg 的空版本。如果它在这个完美的场景中仍然无法正常工作,那么上面的代码就有问题了。如果它工作得很好,那么你需要注意标题。

鉴于您将它作为一个包文件,您可以在命令行上单步执行 msgs并观察时间戳。(也可以步入python)。

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

在带有小负载的时间嘈杂的消息上,我刚刚编写了一个节点来监听所有这些消息,并使用在其中任何一个上找到的最新时间重新发布它们(用于同步记录到 csv)。不是最佳的,但它应该揭示问题所在。

于 2019-09-04T17:03:17.713 回答