3

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

4

2 回答 2

2

我有一些有趣的时间戳数据可以阐明您的问题,但没有准确回答。我一直在尝试将深度帧与图像帧相匹配——就像很多人在这个 Tango 标签下发帖一样。我的数据不完全匹配,我认为我的投影矩阵和点重投影存在问题。然后我检查了深度帧和图像帧上的时间戳,发现它们相差了 130 毫秒。很多!即使只要有深度帧可用,我都会获得最新的图像。所以我回去只测试时间戳数据。

我正在使用基于 point-cloud-jni-example 的代码在 Native 中工作。对于 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.010 到 0.079 秒之间触发,即使姿势时间戳在 0.033 处坚如磐石。图像(帧)回调在 0.025 和 0.040 之间触发 4 次,然后在 0.065 左右给出一个长时间的停顿。这就是在连续调用中返回具有相同时间戳的两个图像的地方。相机似乎在跳帧?

因此,要匹配深度、图像和姿势,您确实需要缓冲多个返回及其相应的时间戳(环形缓冲区?),然后将它们匹配为您想要作为主控的任何值。姿势时间是最稳定的。

注意:我没有尝试获取特定“中间”时间的姿势,以查看返回的姿势是否在 onPoseAvailable() 给出的值之间进行插值。

我有 logcat 文件和各种可用的 awk 提取。我不知道如何发布那些(1000 行)。

于 2015-03-19T21:25:31.443 回答
0

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

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