将方向存储到数组 - 并进行比较

时间:2011-06-16 07:43:10

标签: iphone android math artificial-intelligence gesture-recognition

我想实现以下目标:

我希望用户能够使用陀螺仪“记录”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);
     }];

如果用户处于记录模式,我认为我可以将这些值存储到数组中。当用户尝试复制该移动时,我可以将复制的移动阵列与录制的移动阵列进行比较。 问题是,如何以智能方式比较两个数组呢?它们永远不会有完全相同的值,但它们可能有点相同。

我在这里是否正确?

更新:我认为,对于我来说,使用DTW的Alis回答可能是正确的方法。但我并不那么聪明(显然),所以如果有人能帮助我完成与阵列比较的第一步,我会是一个快乐的人!

谢谢!

2 个答案:

答案 0 :(得分:46)

尝试动态时间扭曲。这是一维数组的说明性示例。在数据库中,我们已经有以下2个数组:

数组1:[5, 3, 1]
数组2:[1, 3, 5, 8, 8]

我们测量了[2, 4, 6, 7]。哪个阵列与新测量的最相似?显然,第二个数组类似于新测量的,第一个不是。

让我们根据this paper, subsection 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)。如果我们要比较数组AB,则Dist(i,j)A[i]B[j]之间的距离。我只是使用了ABS(A[i]-B[j])。此示例的成本矩阵:

Dynamic Time Warping, cost matrices

对于阵列1,我们得到13作为分数,对于阵列2我们得到5.得分越低,所以最相似的阵列是阵列2.最好的变形路径标记为灰色。

这只是DTW的草图。在现实世界的应用程序中,您必须解决许多问题。例如,使用偏移而不是固定的终点,或定义拟合度量:参见this paper,第363页,5。边界条件和第364页。上述链接的论文也有更多细节。

我刚注意到你正在使用偏航,俯仰和翻滚。简单地说:don'tanother reason not to。您可以使用加速度计数据吗? “加速度计是直接测量方向”(来自DCM manuscript),这正是您所需要的。至于tc的问题,相对于北方的方向是否重要?我猜不是。

比较方向(欧拉角,旋转矩阵,四元数)比较加速度矢量要容易得多。如果使用加速度数据,则每个时间点都有3维向量,即(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)

这是两点之间的Eucledian distance

答案 1 :(得分:8)

我认为阿里的方法通常是一个很好的方法,但是当使用欧拉角(即俯仰,滚转和偏航)时,存在一个称为gimbal lock(或SO discussions关于此主题)的一般问题。当你录制一个持续时间超过几个刻度的更复杂的运动时会遇到它,从而导致不同角度方向的大角度增量。

简而言之,这意味着,根据您到达那里的动作顺序,您将拥有多个相同位置的数学表示 - 而另一方则丢失信息。考虑一架飞机从左到右在空中飞舞。 X轴从左到右,Y轴指向空气。以下两个运动顺序将导致相同的结束位置,尽管您将以完全不同的方式实现目标:

序列A:

  1. 绕偏航旋转+ 90°
  2. 绕节距旋转+ 90°
  3. 序列B:

    1. 绕节距旋转+ 90°
    2. 围绕滚动旋转+ 90°
    3. 在这两种情况下,你的飞机都指向地面,你可以从你的位置看到它的底部。

      唯一的解决方案是避免欧拉角,从而使事情变得更复杂。四元数是解决这个问题的最好方法,但是花了一段时间(对我来说)才能了解这个非常抽象的表示。好的,这个答案不会让你对原始问题有任何进一步的帮助,但它可以帮助你避免浪费时间。也许你可以做一些概念上的改变来建立你的想法。