How to sync data in a ros bag
I'm trying to integrate a LiDAR unit with an INS (IMU+GPS) and as it seems there's no way to sync them together unless we're willing to let go of IMU data (only GPS data is output in NMEA format if they are connected). So we connected them separately to a laptop and recorded some sample data and here's the issue: They are not in sync and when I try to do LiDAR mapping in any application ( here's one as an example) I get misaligned point clouds and jerky movement!
I was wondering if there's a way read the bag file, synchronize the data and save it in a new bag?
I have looked into TimeSynchronizer
here but I'm not sure how to apply it, or if it's what I need for this purpose at all.
Here's also a hacky script I came up with in Python, but it doesn't produce the desired result I guess the timings are too close or it's not the proper method at all:
def sync__to_current_timestamp(bag, output_path):
topic_list = ["/os_cloud_node/points", "/os_cloud_node/imu", "/imu/data", "/gnss"]
with rosbag.Bag(output_path + 'data_synced.bag', 'w') as outbag:
bar = ChargingBar('Syncing', max=bag.get_message_count())
for topic, msg, t in bag.read_messages():
bar.next()
if topic == "/tf" and msg.transforms:
outbag.write(topic, msg, rospy.Time.now())
elif topic in topic_list:
msg.header.stamp = rospy.Time.now()
outbag.write(topic, msg, rospy.Time.now())
bar.finish()
print("\n Done!")
Would appreciate any pointers.
Have you seen the
rosbag
cookbook? It gives a good example of how to use the TimeSynchronizer to sync bag data.@tryan Thank you for the url, I had a look although it's in C++ and that alone is a challenge for me (I was looking for a Python solution) but couldn't find the "saving" logic in that code?
I may have misinterpreted your question, so please clarify if I missed the point. If you have data that were recorded concurrently (is that your situation?), you could play the bag file, and run a custom synchronizer node.
ApproximateTimeSynchronizer
will collect the messages in a buffer and trigger a group callback when it has collected an set that are near in time. You've probably already looked at this, but here's a Python example. You could save the data to a new bag with a new timestamp in the callback function.How exactly are the topics "not in sync"? Are they offset by a small delay, different frequencies, or something else?