我想要实现以下功能:
我希望用户能够使用陀螺仪“记录”iPhone的运动。之后,用户应该能够重现相同的运动。我使用以下代码提取俯仰角、横滚角和偏航角:
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error)
{
CMAttitude *attitude = motion.attitude;
NSLog(@"pitch: %f, roll: %f, yaw: %f]", attitude.pitch, attitude.roll, attitude.yaw);
}];
我的想法是,如果用户处于录制模式,我可以将这些值存储到一个数组中。当用户尝试重现该运动时,我可以将重现的运动数组与录制的数组进行比较。关键是,如何以一种智能的方式比较这两个数组?它们永远不会完全相同,但它们可以大致相似。
我的思路正确吗?
更新:我认为Alis关于使用DTW的回答可能是正确的。但我没那么聪明(显然),所以如果有人能帮助我完成比较数组的第一步,我将非常高兴!
谢谢!
回答:
尝试使用动态时间规整。这是一个使用一维数组的说明性示例。在数据库中,我们已经有以下 2 个数组:
数组 1:[5, 3, 1]
数组 2:[1, 3, 5, 8, 8]
我们测量到 [2, 4, 6, 7]
。哪个数组与新测量的数组最相似?显然,第二个数组与新测量的数组相似,而第一个数组则不然。
让我们根据 这篇论文的 2.1 节计算成本矩阵:
D(i,j)=Dist(i,j)+MIN(D(i-1,j),D(i,j-1),D(i-1,j-1))
这里 D(i,j)
是成本矩阵的 (i,j)
元素,见下文。查看该论文的图 3,了解如何应用此递归关系。简而言之:首先计算列,从 D(1,1)
开始;在 MIN 中省略 D(0,*)
和 D(*,0)
。如果我们要比较数组 A
和 B
,那么 Dist(i,j)
是 A[i]
和 B[j]
之间的距离。我简单地使用了 ABS(A[i]-B[j])
。此示例的成本矩阵:
对于数组 1,我们得到的分数是 13,对于数组 2,我们得到的分数是 5。分数越低越好,因此最相似的数组是数组 2。最佳规整路径标记为灰色。
这只是 DTW 的一个草图。在实际应用中,您需要解决许多问题。例如,使用偏移量而不是固定结束点,或定义拟合度量:请参阅这篇论文,第 363 页,5. 边界条件和第 364 页。上面链接的论文也有更多细节。
我刚刚注意到您正在使用偏航角、俯仰角和横滚角。 简而言之:不要这样做,还有 另一个不要这样做的理由。你可以使用加速度计数据代替吗?“加速度计是方向的直接测量”(来自 DCM 手稿),这正是你所需要的。至于tc的问题,相对于北方的方向重要吗?我猜不重要。
如tc所指出的,比较加速度向量比比较方向(欧拉角、旋转矩阵、四元数)容易得多。如果您使用的是加速度数据,则在每个时间点都有三维向量,即 (x,y,z) 坐标。我会简单地计算
Dist(i,j)=SQRT((A[i][X]-B[j][X])^2+(A[i][Y]-B[j][Y])^2+(A[i][Z]-B[j][Z])^2)
,
这就是两点之间的欧几里得距离。