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

我想要实现以下功能:

我希望用户能够使用陀螺仪“记录”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)。如果我们要比较数组 AB,那么 Dist(i,j)A[i]B[j] 之间的距离。我简单地使用了 ABS(A[i]-B[j])。此示例的成本矩阵:

Dynamic Time Warping, cost matrices

对于数组 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),

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注