我们将时间戳作为姿势,图片和点数据的双精度值 - 它们并不总是对齐 - 如何计算两个时间戳之间的时间距离?是的,我知道如何减去两个双打,但我完全不确定delta如何与时间相对应。
答案 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)
我认为基本问题是如何将姿势,深度和彩色图像数据同步到一个帧中。所以要回答这个问题,实际上有两个步骤