我们究竟如何计算时间戳差异?

时间:2015-01-21 15:28:26

标签: google-project-tango

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

2 个答案:

答案 0 :(得分:2)

我有一些有趣的时间戳数据可以揭示你的问题,但没有完全回答。我一直试图将深度帧与图像帧相匹配 - 正如很多人在这个Tango标签下发布的那样。我的数据并不完全匹配,我认为我的投影矩阵和点重投影有问题。然后我检查了我的深度帧和图像帧上的时间戳,发现它们的关闭时间长达130毫秒。很多!即使每当深度帧可用时我都会获得最新的图像。所以我回去测试时间戳数据。

我在Native中使用基于point-cloud-jni-example的代码。对于onXYZijAvailable(),onFrameAvailable()和onPoseAvailable()中的每一个,我都在倾倒时间信息。在XYZ和Frame情况下,我将返回的数据复制到静态缓冲区以供以后使用。对于此测试,我忽略了缓冲的图像帧,XYZ深度数据显示在示例代码的常规OpenGL显示循环中。捕获的数据如下所示:

                        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行)。

答案 1 :(得分:0)

我认为基本问题是如何将姿势,深度和彩色图像数据同步到一个帧中。所以要回答这个问题,实际上有两个步骤

  • 将姿势同步到彩色图像或深度:要做到这一点,最简单的方法是使用TangoService_getPoseAtTime功能,这基本上使您能够查询具有特定时间戳的姿势。即,您有一个深度点云可用,并且它为您提供该深度帧的时间戳,然后您可以使用深度点云时间戳来查询相应的姿势。
  • 同步彩色图像和深度图像:目前,您必须在应用程序级别缓冲深度点云或彩色图像,并根据其中一个时间戳,查询缓冲区中的其他数据。 color_image数据结构中有一个字段名称TangoXYZij,评论显示它已保留供将来使用,因此内置的同步功能可能会在将来的版本中出现。