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

我想实现以下目标:

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

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

我在这里走在正确的轨道上吗?

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

谢谢!

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

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

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

让我们根据本文第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) 。 如果我们比较arraysABDist(i,j)A[i]B[j]之间的距离。 我只是使用ABS(A[i]-B[j]) 。 此示例的成本矩阵:

动态时间扭曲,成本矩阵

对于arrays1,我们有13作为分数,对于arrays2我们有5分。较低的分数获胜,因此最相似的arrays是arrays2.最佳的变形路径标记为灰色。

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

我刚注意到你正在使用偏航,俯仰和滚动。 简单地说: 不要和另一个原因不要 。 您可以使用加速度计数据吗? “加速度计是直接测量方向”(来自DCM手稿 ),这就是您所需要的。 至于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距离 。

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

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

顺序A:

  1. 偏转旋转+ 90°
  2. 绕节距旋转+ 90°

顺序B:

  1. 绕节距旋转+ 90°
  2. 滚动旋转+ 90°

在这两种情况下,您的飞机都指向地面,您可以从您的位置看到它的底部。

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