我们将时间戳记作为姿势,图片和点数据的双精度值-它们并不总是对齐的-如何计算两个时间戳记之间的时间距离?是的,我知道如何减去两个双精度数,但我完全不确定增量与时间的对应关系。

最佳答案

我有一些有趣的时间戳数据,这些数据可以阐明您的问题,而没有完全回答。我一直在尝试将深度帧与图像帧匹配-就像很多人在此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行)。

10-08 08:27
查看更多