如何将写入文件的ROS时间戳读取后完整恢复为原始rospy.Time格式
问题根源
你遇到的精度丢失本质是双精度浮点数的有效位不足:双精度浮点数仅能精确表示不超过2^53(约9e15)的整数,而ROS纳秒级时间戳数值在1e18量级,to_sec()返回的带小数的秒数有效位也达到19位,均超过双精度浮点数的15~17位有效位上限,只要转float必然丢失精度。
你第二次尝试的额外错误:
- 读取纳秒字符串后转了float,精度已经受损,后续计算当然无法得到准确值
- 直接将纳秒数值传入
rospy.Time()构造函数,而rospy.Time()的两个入参分别是秒数、纳秒数,直接传入完整纳秒值会被当成秒数处理,结果完全错误
正确实现方案
方案1:存纳秒整数(最简洁规范)
直接使用rospy自带的纳秒转换接口,全程用整数传递,完全无精度损失:
import rospy # 写入时间戳 t = rospy.Time.now() # 此处替换为你从bag中读取的时间戳 with open("ts.txt", "w") as f: f.write(f"{t.to_nsec()}\n") # 读取恢复时间戳 with open("ts.txt", "r") as f: ts_nsec = int(f.read().strip()) recovered_t = rospy.Time.from_nsec(ts_nsec)
方案2:分开存储秒和纳秒字段
直接存储rospy.Time原生的两个整数字段,可读性更强:
import rospy # 写入时间戳 t = rospy.Time.now() with open("ts.txt", "w") as f: f.write(f"{t.secs} {t.nsecs}\n") # 读取恢复时间戳 with open("ts.txt", "r") as f: secs, nsecs = map(int, f.read().strip().split()) recovered_t = rospy.Time(secs, nsecs)
以上两种方案都可以100%还原原始时间戳,不会有任何精度损失。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

