用核心运动计算精益角度

Cem*_*ker 6 iphone math linear-algebra ios core-motion

我的申请记录会话.当用户启动记录会话时,我开始从设备的CMMotionManager对象收集数据并将它们存储在CoreData上以便稍后处理和显示.我收集的数据包括gps数据,加速度计数据和陀螺仪数据.数据频率为10Hz.

目前,我正在努力用运动数据计算设备的倾斜角度.可以通过使用重力数据来计算设备的哪一侧着陆,但是我想要计算用户与地面之间的左右角度,而不管行进方向如何.

这个问题需要一些线性代数知识来解决.例如,对于某些点的计算,我必须计算计算平面上的3D线的方程.我正在研究这一天,而且它变得越来越复杂.我根本不擅长数学.一些与该问题相关的数学例子也很受欢迎.

Kay*_*Kay 10

这取决于你想对收集的数据做什么,以及用户将哪些方式记录在她/她的口袋里.原因是欧拉角不安全,尤其没有表达旋转的独特方式.考虑一种情况,用户将手机直立放入牛仔裤的后袋,然后向左转90°.因为CMAttitude与平躺在桌面上的设备有关,所以根据这张图片你有两个后续旋转(pitch = x,roll = y,yaw = z):

  • 将手机竖直放置+ 90°=>(90,0,0)
  • 向左转动+ 90°=>(90,90,0)

但你可以通过以下方式获得相同的位置:

  • 偏转+ 90°左手转动手机(0,0,90)
  • 间距为-90°,使手机直立(-90,0,90)

您会看到两个不同的表示形式(90,90,0)和(-90,0,90)用于获得相同的旋转,并且它们中有更多.所以你按下开始按钮,做一些花哨的旋转把手机放进口袋里你就麻烦了,因为在做更复杂的动作时你不能依赖欧拉角(s.万向节锁,因此会有更多的麻烦;-)

现在好消息:你是正确的线性代数将完成这项工作.您可以做的是强迫您的用户将手机放在相同的位置,例如直立固定在右后袋中,并通过构建CMDeviceMotion重力矢量的点积来计算相对于地面的角度 g =(x ,y,z)和位置向量p,它是直立位置的-Y轴(0,-1,0):

g•x = x*0 + y*( - 1)+ z*0 = -y = || g ||*1*cos(alpha)

=> alpha = arccos(-y/9.81)作为总角度.注意,重力加速度g常常约为9.81

为了获得左右倾斜角和前后角,我们使用tangens:

alphaLR = arctan(x/y)

alphaFB = arctan(z/y)


[更新:]

如果您不能依赖于上述等式中的(0,-1,0)预定义位置的手机,则只能计算总角度,而不能计算特定的αLR和alphaFB.原因是您只有一个新坐标系的轴,您需要其中两个轴.然后,新的Y轴y'将被定义为平均重力矢量,但您不知道新的X轴,因为每个向量到y'的矢量都是有效的.

因此,您必须提供更多信息,例如让用户在不偏离的情况下向一个方向行走更长的距离,并使用GPS和磁力计数据来获得第二轴z'.在实践中听起来很容易出错.

总角度没有问题,因为我们可以用平均重力矢量(pX,pY,pZ)替换(0,-1,0):

g•p = x pX + y pY + z pZ = || g || || p ||*cos(alpha)= || g || ^ 2*cos(alpha)

alpha = arccos((x pX + y pY + z*pZ)/ 9.81 ^ 2)


还有两件事要记住:

  • 不同的人穿着不同的口袋不同的trowsers.因此,即使对于穿着其他衣服的同一个人,重力矢量也会不同,您可能需要某种规范化
  • CMMotionManager无法在后台运行,即用户不得按下待机按钮