【问题标题】:Store orientation to an array - and compare将方向存储到数组 - 并进行比较
【发布时间】:2011-09-16 03:39:20
【问题描述】:

我想实现以下目标:

我希望用户能够使用陀螺仪“记录”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 的回答可能对我来说是正确的方法。但我不是那么聪明(显然),所以如果有人可以帮助我完成与数组比较的第一步,我会是一个快乐的人!

谢谢!

【问题讨论】:

  • 您想比较方向(旋转)、加速度(~= 运动)还是两者都比较?相对于地面的方向重要吗?
  • 谢谢阿里,我明天去试试。然后我会告诉你进展如何:)
  • @tc:只是运动。它不必与地面相关。
  • 那么方向还是加速?或两者?还是别的什么?
  • @zebulon 很高兴您发现我的回答很有用,感谢您的赏金。请让我知道 DWT 是如何为您服务的。

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


【解决方案1】:

尝试动态时间扭曲。这是一维数组的说明性示例。在数据库中,我们已经有以下 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)开始; D(0,*)D(*,0) 在 MIN 中被忽略。如果我们比较数组AB,那么Dist(i,j)A[i]B[j] 之间的距离。我只是使用ABS(A[i]-B[j])。此示例的成本矩阵:

数组 1 的得分为 13,数组 2 的得分为 5。分数越低越好,因此最相似的数组是数组 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),

即两点之间的Eucledian distance

【讨论】:

  • 噢,这很复杂。我试图弄清楚它是如何工作的。谢谢!
  • @Mikael 我认为由于这个答案,应该更改这个问题的标题,以简化未来用户对其的访问。此外,我强烈建议加速度计执行运动识别,而不消除重力的影响和额外的集成以避免噪音。因此重力将分布在轴上,并以包含的有关方向的信息的形式为您提供数据唯一值。不要整合数据,因为我会减慢您的测量速度。我已经写了关于 DTW 和 ACC 的论文,所以相信我。很棒的简短而有意义的答案,我也谢谢。
  • @murt 是像Dist(i,j)/t这样的加速度数据,其中“t”是A和B的时间间隔?加速度数据如何包含有关方向的信息?是因为它是根据方向数据计算的吗?你能分享一些你发表的与这个主题相关的论文吗?提前致谢!
  • @BruceYo 数据是 D(x,y,z) 的形式,它包括重力。因此,如果您将手机放在底部边缘,那么其中一个轴会显示大约 8-9m/s^2 的值。更进一步,现在如果你移动智能手机,每个轴都会受到重力的影响,所以每个轴上的最终力将包括重力的分布力,因此可以说模仿一个方向。当然,这并不简单,因此您无法确定东北,东北等位置。它更像是您的手机相对于重力的哪个位置。 GitHubMurt/GestureRecognition
【解决方案2】:

我认为 Ali 的方法总体上是一个不错的方法,但是在使用欧拉角(即俯仰角、滚动角和偏航角)时,存在一个称为 gimbal lock(或此主题的 SO discussions)的普遍问题。当您记录一个持续时间超过几个刻度的更复杂的运动时,您会遇到它,从而导致不同角度方向上的大角度增量。

简而言之,这意味着对于同一位置,您将有多个数学表示,这取决于您到达该位置的移动顺序 - 以及另一侧的信息丢失。考虑一架飞机从左到右在空中飞行。 X轴从左到右,Y轴指向空中。以下两个运动序列将导致相同的结束位置,尽管您会以完全不同的方式到达那里:

序列 A:

  1. 绕偏航 +90° 旋转
  2. 围绕俯仰 +90° 旋转

序列 B:

  1. 围绕俯仰 +90° 旋转
  2. 绕辊旋转 +90°

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

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

【讨论】:

  • 四元数有“双重覆盖”问题(幸运的是没有那么可怕)。无论哪种方式,您都需要比较两个方向之间的“距离”,这对于任何表示都不是特别简单。
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多