You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将写入文件的ROS时间戳读取后完整恢复为原始rospy.Time格式

问题根源

你遇到的精度丢失本质是双精度浮点数的有效位不足:双精度浮点数仅能精确表示不超过2^53(约9e15)的整数,而ROS纳秒级时间戳数值在1e18量级,to_sec()返回的带小数的秒数有效位也达到19位,均超过双精度浮点数的15~17位有效位上限,只要转float必然丢失精度。
你第二次尝试的额外错误:

  1. 读取纳秒字符串后转了float,精度已经受损,后续计算当然无法得到准确值
  2. 直接将纳秒数值传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:06:03