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

22

我想实现以下内容:

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

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

我这样做是否正确?

更新:我认为也许Ali关于使用DTW的答案对我来说是正确的方法。但我不是那么聪明(显然),所以如果有人能帮我比较这两个数组的第一步,我会很高兴的!

谢谢!


你想比较方向(旋转),加速度(约等于移动),还是两者都要?方向相对于地面重要吗? - tc.
谢谢阿里,我明天会尝试一下。然后我会告诉你结果的 :) - Mikael
@tc:只需要移动,不必相对于地面。 - Mikael
@zebulon,很高兴你觉得我的回答有用,感谢你的悬赏。请告诉我DWT对你有什么帮助。 - Ali
@Ali,是的,谢谢!现在客户决定不走那条路了。但我仍然会尝试让它工作,因为将来可能会非常有用。 - Mikael
显示剩余2条评论
2个回答

46

尝试使用动态时间规整。以下是一个带有1D数组的说明性示例。在数据库中,我们已经有了以下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)。如果我们正在比较数组AB,那么Dist(i,j)A[i]B[j]之间的距离。我只是使用了ABS(A[i]-B[j])。本示例的成本矩阵:

Dynamic Time Warping, cost matrices

对于Array 1,我们得分为13,对于Array 2,我们得分为5。较低的分数胜出,因此最相似的数组是Array 2。最佳配准路径用灰色标记。
这只是DTW的一个简单示例。在实际应用中,您需要解决许多问题。例如,使用偏移量而不是固定的结束点,或定义适合度量:请参见this paper第363页,5.边界条件和第364页。上述链接的论文还有更多详细信息。
我刚刚注意到你正在使用偏航、俯仰和横滚角。简单地说:don'tanother reason not to。您能使用加速度计数据吗? "加速度计是方向的直接测量"(来自DCM manuscript),这正是您所需要的。至于tc的问题,与北方的方向相对的方向是否重要?我想没有。
与朝向(欧拉角、旋转矩阵、四元数)相比,比较加速度向量要容易得多,正如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),

这就是两点之间的欧几里得距离


哦,那很复杂。我正在尝试弄清它是如何工作的。谢谢! - Mikael
@Mikael我认为由于这个回答,这个问题的标题应该被更改,以便未来用户更容易访问它。此外,我强烈推荐使用加速度计进行运动识别,而不是消除重力影响和进行额外的积分以避免噪音。因此,重力将分布在轴上,并以包含有关方向的信息的形式给出数据的唯一值。不要集成数据,因为这会减慢您的测量速度。我写了有关DTW和ACC的论文,所以请相信我。非常简短且有意义的回答,我也感谢。 - murt
@murt,加速度数据是否像Dist(i,j)/ t一样,其中“t”是A和B之间的时间间隔?加速度数据如何包含有关方向的信息?这是因为它是从方向数据计算出来的吗?您能分享一些与此主题相关的已发表论文吗?提前致谢! - Bruce Yo
@BruceYo 数据以*D(x,y,z)*的形式呈现,并且包括重力。因此,如果您将手机放在底部边缘,则其中一个轴将显示约8-9m/s^2的值。更进一步,现在如果您移动智能手机,每个轴都会受到重力的影响,因此每个轴上的最终力将包含重力的分布力,因此它将模拟方向。当然,这并不是直接的,因此您无法确定北,东等方位,而更像是相对于重力的位置。GitHubMurt/GestureRecognition - murt

8
我认为阿里的方法总体上是一种不错的方式,但使用欧拉角(即俯仰、横滚和偏航)时存在一个称为 gimbal lock 的一般问题(或者在这个主题上进行SO讨论),当记录持续时间较长且在不同的角度方向上导致大量角度差时,就会遇到这个问题。
简而言之,这意味着对于相同的位置,您将有多个数学表示,这取决于您为到达该位置所做的移动顺序-并且在另一侧会丢失信息。考虑一架从左到右飞行的飞机。X轴从左到右,Y轴指向空中。以下两个移动序列将导致相同的结束位置,尽管您会通过完全不同的方式到达: 序列A:
  1. 围绕偏航旋转+90°
  2. 围绕俯仰旋转+90°
序列B:
  1. 围绕俯仰旋转+90°
  2. 围绕横滚旋转+90°
在这两种情况下,你的飞机指向地面,你可以从你的位置看到它的底部。
唯一的解决方案是避免使用欧拉角,因此使事情更加复杂。四元数是处理这个问题的最佳方法,但对于我来说,理解这种相当抽象的表示需要一段时间。好吧,这个答案不会让你在原问题上取得任何进展,但它可能有助于避免浪费时间。也许你可以进行一些概念上的改变来建立你的想法。
Kay

3
四元数存在“双覆盖”问题(幸运的是不算太糟糕)。无论哪种表示方法,都需要比较两个方向之间的“距离”,这并不是特别容易的事情。 - tc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接