将方向存储到一个数组 – 并进行比较
我想要实现以下内容:
我希望用户能够使用陀螺仪“logging”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); }];
我想我可以将这些值存储到一个数组,如果用户在logging模式。 而当用户试图复制那个动作时,我可以将复制的动作数组与所logging的动作数组进行比较。 问题是,我怎样才能巧妙地比较两个数组? 他们将永远不会有完全相同的价值观,但他们可以有点相同。
我是否在正确的轨道上?
更新:我认为,也许阿利斯使用DTW的答案可能是我在这里的正确方法。 但是我不是那么聪明(显然),所以如果任何人能够帮助我比较arrays的第一步,我会是一个快乐的人!
谢谢!
尝试dynamic时间扭曲 。 这里是一维数组的例子。 在数据库中,我们已经有了以下2个数组:
数组1: [5, 3, 1]
数组2: [1, 3, 5, 8, 8]
我们测量[2, 4, 6, 7]
。 哪一个arrays与新测量的最相似? 显然,第二个数组类似于新测量,第一个不是。
根据本文第2.1节计算成本matrix:
D(i,j)=Dist(i,j)+MIN(D(i-1,j),D(i,j-1),D(i-1,j-1))
这里D(i,j)
是成本matrix的(i,j)
元素,见下文。 查看该论文的图3,看看是否应用了这种重复关系。 简而言之:首先从D(1,1)
开始计算列; 在MIN中省略D(0,*)
和D(*,0)
。 如果我们比较arraysA
和B
则Dist(i,j)
是A[i]
和B[j]
之间的距离。 我只是使用ABS(A[i]-B[j])
。 这个例子的成本matrix:
对于数组1,我们有13作为分数,对于数组2我们有5分。较低的分数胜,所以最相似的arrays是数组2.最好的翘曲path被标记为灰色。
这只是DTW的草图。 在真实世界的应用程序中,有许多问题需要解决。 例如使用偏移量而不是固定的终点,或者定义拟合的度量:参见本文的第363页,边界条件和第364页。上面的链接文件也有更多的细节。
我只注意到你正在使用偏航,俯仰和滚转。 简单地说: 不要和另一个原因不要 。 你可以使用加速计数据吗? “一个加速度计是一个方向的直接测量”(来自DCM手稿 ),这就是你所需要的。 至于TC的问题,相对于北方的方向是否重要? 我猜不会。
比方向(欧拉angular,旋转matrix,四元数)比较加速度向量要容易得多。 如果使用的是加速度数据,则每个时间点都有3维vector(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距离 。
我认为阿里的方法总的来说是一个很好的方法,但是当使用欧拉angular(即俯仰,滚转和偏航)时,有一个称为万向节锁的常见问题(或者讨论这个话题)。 当你logging一个更复杂的运动,持续时间超过几个滴答时间,从而导致在不同的angular度方向上有较大的angular度变化时,你会碰到它。
简而言之,这意味着你将有不止一个mathexpression式的相同位置,只是取决于你到达那里的动作顺序 – 另一方面是信息的丢失。 考虑一架飞机在空中从左到右飞行。 X轴从左到右,Y轴指向空气。 以下两个移动序列将导致相同的结束位置,尽pipe您将以完全不同的方式到达那里:
序列A:
- 围绕偏航旋转+ 90°
- 围绕音高+ 90°旋转
序列B:
- 围绕音高+ 90°旋转
- 围绕滚动旋转+ 90°
在这两种情况下,你的飞机指向地面,你可以从你的位置看到它的底部。
唯一的解决办法是避免欧拉angular,从而使事情更复杂。 四元数是解决这个问题的最佳方法,但是花了一段时间(对我来说)才明白这个非常抽象的表示。 好的,这个答案不会让你更进一步的解决你的问题,但它可以帮助你避免浪费时间。 也许你可以做一些概念上的改变来设定你的想法。
凯