Iphone 利用堆芯运动计算倾斜角

Iphone 利用堆芯运动计算倾斜角,iphone,ios,math,linear-algebra,core-motion,Iphone,Ios,Math,Linear Algebra,Core Motion,我的申请有一个记录会话。当用户启动记录会话时,我开始从设备的CMMotionManager对象收集数据,并将其存储在CoreData上,以便稍后处理和显示。我收集的数据包括gps数据、加速度计数据和陀螺仪数据。数据的频率为10Hz 目前,我正在努力用运动数据计算设备的倾斜角度。通过使用重力数据可以计算出设备的哪一侧是陆地,但我想计算出用户和地面之间的左右角,而不考虑行驶方向 这个问题需要一些线性代数知识来解决。例如,对于某一点的计算,我必须计算计算平面上三维直线的方程。我花了一天的时间来做这个,

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

目前,我正在努力用运动数据计算设备的倾斜角度。通过使用重力数据可以计算出设备的哪一侧是陆地,但我想计算出用户和地面之间的左右角,而不考虑行驶方向


这个问题需要一些线性代数知识来解决。例如,对于某一点的计算,我必须计算计算平面上三维直线的方程。我花了一天的时间来做这个,它变得越来越复杂了。我的数学一点也不好。一些与问题相关的数学示例也很受欢迎。

如果我理解您的问题,我想您对了解设备的态度很感兴趣。您可以使用从
CMMotionManager
对象的
deviceMotion
属性获取的
CMDeviceMotion
对象的
attitude
属性执行此操作

您可能对
CMAttitude
类中的两个不同角度感兴趣:侧滚和俯仰。如果你把你的设备想象成一架顶部有螺旋桨的飞机(耳机插孔所在的位置),俯仰是飞机/设备在爬升或俯冲时与地面形成的角度。同时,横滚是指如果飞机倾斜或处于中筒横滚,“机翼”与地面形成的角度

(顺便说一句,第三个角度叫做偏航,我认为与你的问题无关。)

角度将以弧度表示,但如果您需要的话,可以很容易地将其转换为度(乘以180,然后除以
pi

假设我理解你想要什么,好消息是你可能不需要理解任何线性代数来捕捉和使用这些角度。(如果我遗漏了什么,请澄清,我很乐意进一步帮助。)

更新(基于评论):

CMAttitude
对象中的姿态值是相对于地面的(即,默认参考帧的Z轴垂直,指向与重力相反的方向),因此您不必担心取消重力。因此,例如,如果您将设备放在平板桌面上,然后将其侧滚,则CmatiTude对象的
roll
属性将从0更改为正负90度(+-.5pi弧度),具体取决于您将其侧滚。同时,如果您开始将其平躺,然后逐渐将其竖立起来,则
俯仰
属性也会发生同样的情况

如果需要,您可以直接使用俯仰角、横滚角和偏航角,但也可以设置不同的参考坐标系(例如,“向上”的方向不同)。为此,只需在“校准”步骤中捕获该方向上的姿态,然后使用Cmatitude的
multiplyByVerseOfattude:
方法将姿态数据转换为新的参考坐标系

即使你的问题只提到捕捉“倾斜角度”(与地面),如果设备要放在人的口袋里,你可能会想要捕捉3个姿态角中的至少2个(例如俯仰、侧倾或偏航,取决于他们正在做什么),可能所有三个都要捕捉。(例如,如果口袋是宽松的,那么设备可以在口袋中以各种方式旋转。)不过,在大多数情况下,我认为你可能只能依靠三种方式中的两种(除非你在整个录音过程中看到偏航的剧烈变化)。例如,在我的牛仔裤口袋里,手机通常是垂直的。所以,对我来说,当我走路、坐着或跑步时,音高会有很大的变化。每当我改变我面对的方向时,滚动就会发生变化。同时,偏航根本不会有太大的变化(除非我做卡丁车车轮,我不能!)。所以偏航对我来说可能被忽略了

总结一下要点:要使用这些姿态角,你不需要做任何线性代数,也不需要担心重力(当然,你可能想将其用于其他目的)

更新2(基于Kay的新帖子):

Kay只是回答并展示了如何使用重力和线性代数来确保你的角度是唯一的。(顺便说一句,我认为你应该把奖金给那个职位,fwiw。)

根据你想做什么,你可能想使用这个数学。如果你在录音过程中需要一种标准化的“谈论”和/或比较态度的方式,你可能会想使用线性代数和重力。如果您只是想将它们可视化,您可能仍然可以不使用增加的复杂性。(例如,可视化(俯仰=90,横滚=0,偏航=0)应该与可视化(俯仰=0,横滚=90,偏航=90)相同。)在我上面的方法中,虽然你可以有多种方式来表示“相同”的姿态,但从本质上来说,它们都不是错误的。它们仍然会给出相对于地面的角度


但陀螺仪可以从一种有效的姿态描述切换到另一种,这一事实意味着我在上面写的关于三个组件中只有两个可以逃脱的内容需要纠正:因此,无论发生什么情况,你都需要捕获所有三个组件。对不起

这取决于你想对收集到的数据做什么,以及用户将以何种方式将录制的iPhone放在自己的口袋里。原因是欧拉角是不安全的,尤其是没有独特的方式来表达旋转。考虑一种情况,用户将手机直立在牛仔裤的后兜里,然后在90左右左右转弯。?