我们将时间戳记作为姿势,图片和点数据的双精度值-它们并不总是对齐的-如何计算两个时间戳记之间的时间距离?是的,我知道如何减去两个双精度数,但我完全不确定增量与时间的对应关系。
最佳答案
我有一些有趣的时间戳数据,这些数据可以阐明您的问题,而没有完全回答。我一直在尝试将深度帧与图像帧匹配-就像很多人在此Tango标签下发布一样。我的数据不完全匹配,我认为我的投影矩阵和点重投影存在问题。然后,我检查了深度帧和图像帧上的时间戳,发现它们的时间间隔多达130毫秒。很多!即使只要有深度框,我都会获得最新的图像。所以我回去只测试时间戳数据。
我正在使用基于point-cloud-jni-example的代码在Native中工作。对于onXYZijAvailable(),onFrameAvailable()和onPoseAvailable()中的每一个,我都在转储时间信息。在XYZ和Frame情况下,我将返回的数据复制到静态缓冲区中以备后用。对于此测试,我忽略了缓冲的图像帧,并且在示例代码的常规OpenGL显示循环中显示XYZ深度数据。捕获的数据如下所示:
callback type : systime : timestamp : last pose
I/tango_jni_example( 3247): TM CLK Img 5.420798 110.914437 110.845522
I/tango_jni_example( 3247): TM CLK XYZ 5.448181 110.792470 110.845522
I/tango_jni_example( 3247): TM CLK Pose 5.454577 110.878850
I/tango_jni_example( 3247): TM CLK Img 5.458924 110.947708 110.878850
I/tango_jni_example( 3247): TM CLK Pose 5.468766 110.912178
系统时间是从每个回调内部运行的std :: chrono :: system_clock :: now()开始的。 (由应用程序启动时的开始时间偏移。)时间戳是XYZij,图像或姿势结构的实际时间戳数据。对于深度和图像,我还列出了最新的姿势时间戳记(从服务开始到设备,给定的时间为0.0)。快速分析大约2分钟的样本数据会得出以下初步结论:
Pose data is captured at VERY regular intervals of 0.033328 seconds.
Depth data is captured at pretty regular intervals of 0.2 seconds.
Image data is captured at odd intervals
with 3 or 4 frames at 0.033 seconds
then 1 frame at about 0.100 seconds
often followed by a second frame with the same timestamp
(even though it is not reported until the next onFrameAvailable()?)
那是返回的结构中的实际时间戳数据。 “真实的?”两次回调之间经过的时间要多得多。即使姿态时间戳为0.033坚如磐石,姿态回调也会在0.010到0.079秒之间触发。图像(帧)回调在0.025和0.040之间触发4次,然后给出大约0.065的长时间停顿。这是在连续调用中返回带有相同时间戳的两个图像的地方。看来相机正在跳过一帧?
因此,要匹配深度,图像和姿势,您确实需要缓冲多个返回值及其相应的时间戳(环形缓冲区?),然后将它们匹配为您要用作主值的任何值。摆姿势时间最稳定。
注意:我尚未尝试获取特定“之间”时间的姿势,以查看返回的姿势是否在onPoseAvailable()给定的值之间插值。
我有logcat文件和各种可用的awk摘录。我不确定如何发布那些(1000行)。