Mik*_*ael 22 iphone math android artificial-intelligence gesture-recognition
我想实现以下目标:
我希望用户能够使用陀螺仪"记录"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);
}];
Run Code Online (Sandbox Code Playgroud)
我想如果用户处于记录模式,我可以将这些值存储到数组中.当用户尝试复制该移动时,我可以将复制的移动阵列与录制的移动阵列进行比较.问题是,如何以智能方式比较两个阵列?它们永远不会具有完全相同的值,但它们可能有些相同.
我在这里走在正确的轨道上吗?
更新:我想也许Alis回答有关使用DTW的方法对我来说可能是正确的方法.但是我并不那么聪明(显然),所以如果有人能帮助我完成与阵列比较的第一步,我会是一个快乐的人!
谢谢!
Ali*_*Ali 46
尝试动态时间扭曲.这是一维数组的说明性示例.在数据库中,我们已经有以下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))
Run Code Online (Sandbox Code Playgroud)
这D(i,j)是(i,j)成本矩阵的元素,见下文.检查该论文的图3,看看是否应用了这种递归关系.简而言之:首先计算列,从D(1,1); 开始; D(0,*)并被D(*,0)遗漏在MIN中.如果我们比较数组A和B然后Dist(i,j)是之间的距离A[i]和B[j].我只是用了ABS(A[i]-B[j]).此示例的成本矩阵:

对于阵列1,我们有13作为分数,对于阵列2我们有5分.较低的分数获胜,因此最相似的阵列是阵列2.最佳的变形路径标记为灰色.
这只是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:
序列B:
在这两种情况下,您的飞机都指向地面,您可以从您的位置看到它的底部.
解决这个问题的唯一方法是避免欧拉角,从而使事情变得更加复杂.四元数是解决这个问题的最好方法,但是花了一段时间(对我来说)才能了解这个非常抽象的表示.好的,这个答案不会让你对原始问题有任何进一步的帮助,但它可以帮助你避免浪费时间.也许你可以做一些概念上的改变来建立你的想法.
凯