我有我的应用程序的记录会话。 当用户启动一个会话记录我开始从设备的CMMotionManager对象收集数据并将它们存储在CoreData处理和后介绍。 我收集的数据包括GPS数据,加速度计数据和陀螺仪的数据。 数据的频率为10Hz。
目前我正在努力计算设备的倾斜角度与运动数据。 它可以计算出该装置的侧面是土地利用重力数据,但我想要计算用户与接地之间右侧或左侧角无论行进方向。
这个问题需要一些线性代数的知识来解决。 例如,对于某些点计算我必须计算上的计算出的平面上的3D线的方程式。 我工作的这一个每天和它变得更加复杂。 我不擅长数学的。 相关问题的一些数学运算的例子实在是太感谢。
这取决于你想收集的数据和什么样的方式,用户将在他/她的口袋里记录iPhone去做些什么。 其原因是,欧拉角是没有安全,尤其是表达的旋转没有独特的方式。 考虑用户把手机直立到他的牛仔裤后面的口袋里,然后向左转大约90°的情况。 因为CMAttitude涉及在桌子上平躺着的设备,则必须根据这一用于两个后续旋转(俯仰= X,辊= Y,偏航= Z) 图片 :
- 用于获取电话音调+ 90°竖直=>(90,0,0)
- 对于转向辊+ 90°左=>(90,90,0)
但是你可以得到相同的位置:
- 偏航用于接通电话左+ 90°(0,0,90)
- 间距-90°为使得手机直立(-90,0,90)
你看到两个不同的表示(90,90,0)和(-90,0,90)获得相同的旋转和有更多的人。 因此,在按下起动按钮,做一些花哨的旋转把手机变成口袋里,你有麻烦了,因为你不能依靠欧拉角做更复杂的运动(S时, 万向节锁定了这个比较头疼;-)
现在好消息:你是对的线性代数将做的工作。 你可以做的是强制用户通过建立把手机始终不变的立场例如,在右后口袋直立固定,计算角度(S)相对于地面的点积从重力矢量CMDeviceMotion G =(X ,Y,Z)和现在的位置矢量p是-Y轴(0,-1,0)的直立位置:
克•X = X * 0 + Y *( - 1)+ Z * 0 = -y = || ||克* 1 * COS(阿尔法)
=> 阿尔法=反余弦(-y / 9.81),为总角度。 需要注意的是重力加速度g是不断约9.81
为了让左右倾斜角度和前瞻性靠背角度,我们使用tangens:
alphaLR =反正切(X / Y)
alphaFB =反正切(Z / Y)
[更新:]
如果不能依靠具有电话在上面的公式的预定现在的位置等(0,-1,0),可以只计算出总的角度,但不是特定的人alphaLR和alphaFB。 原因是,你只需要在新的坐标系的一个轴,你需要他们两个人。 新的Y轴Y“将被定义为平均重力矢量,但你不知道你的新的X轴,因为每个矢量perpedicular到y”将是有效的。
所以,你必须提供诸如让用户走远成一个方向偏离不和使用GPS和磁强计数据得到的第2轴Z”的进一步信息。 听起来很容易出错的做法。
的总角度是没有问题的,因为我们可以替换(0,-1,0),平均重力矢量(PX,PY,PZ):
克•P = X 的pX + Y的pY + Z = PZ || ||克 || p || * COS(阿尔法)= || ||克^ 2个* COS(阿尔法)
阿尔法=反余弦((X 的pX + Y +的pY Z * PZ)/ 9.81 ^ 2)
两两件事要牢记:
- 不同的人穿不同的口袋里不同trowsers。 因此,重力矢量甚至会为同一人穿别的衣服是不同的,你可能需要某种形式的规范化
- CMMotionManager不会在后台即用户必须工作不推待机按钮
如果我理解你的问题,我觉得你有兴趣让你的设备的态度 。 您可以使用做这个attitude
的财产CMDeviceMotion
,你从一开始对象deviceMotion
的财产CMMotionManager
对象。
有两个不同的角度,你可能会感兴趣的CMAttitude
类: 摇摆和颠簸 。 如果你想象你的设备与顶部(其中耳机插孔)螺旋桨飞机,间距为飞机/设备将与地面做,如果飞机是在爬升或俯冲的角度。 同时,滚动的是,“翅膀”将与地面如果飞机要成为银行或中期桶滚的角度。
(顺便说一句,有一个叫做偏航 ,我认为是不相关的提问第三角。)
该角度将弧度给出,但它是很容易将它们转换为度,如果这就是你想要的(通过180乘以然后除以pi
)。
假设我知道你想什么,好消息是,你可能不需要了解任何线性代数捕捉和利用这些角度。 (如果我失去了一些东西,请澄清,我很乐意进一步提供帮助。)
UPDATE(基于评论):
在姿态值CMAttitude
对象是相对于地面(即,默认的参考帧具有与Z轴垂直,即在相反的方向作为重力指向),所以不必担心抵消重力。 因此,举例来说,如果你躺在平坦的桌面设备,然后把它卷起来倒向一侧,该roll
的CMAttitude对象的属性从0变化到正负90度(+ - .5pi弧度),这取决于哪一方,你滚吧上。 同时,如果你开始就平躺着,然后慢慢站起来在它结束时,同样会发生在pitch
财产。
虽然可以,如果你想直接使用俯仰,滚转和偏航角,也可以设置不同的参考帧(例如,一个不同的方向为“向上”)。 要做到这一点,只是拍摄过程中“校准”的步骤在该方向的态度,然后用CMAttitude的multiplyByInverseOfAttitude:
方法来你的态度数据转换到新的参照系。
即使你的问题只提到捕捉“倾斜角 ”(与地面),你可能会想捕捉的3个姿态角的至少2个(例如,俯仰,要么卷或偏转,这取决于他们在做什么),潜在的所有三个,如果该设备将是在一个人的口袋里。 (该装置可以以各种方式口袋里旋转。如果口袋宽松,例如)。在大多数情况下,不过,我想你大概就能依靠只有两三个的(除非你看到的剧烈改变在整个记录会话的过程中偏航)。 因此,例如,在我的牛仔裤口袋,手机通常几乎是垂直的。 因此,对我来说,间距将改变一大堆我,说,走,坐或运行。 每当我改变我面对的方向滚动会有所不同。 同时,偏航不会在所有的变化不大(除非我做的卡丁车轮,我不能!)。 所以偏航也许可以为我被忽略。
总结要点:使用这些态度的角度,你不需要做任何线性代数,也不用担心比重(尽管你可能想用这个作其他用途,当然)。
(基于凯新岗位) 更新2:
凯刚才回答并展示了如何利用重力和线性代数,以确保您的角度是唯一的 。 (而且,顺便说一句,我觉得你应该给赏金这一职务,FWIW。)
根据你想要做什么,你可能想用这个数学。 你想,如果你需要“讲”和/或比较对您记录会话的过程中态度的一个标准化的方式来使用线性代数和重力。 如果你只是想它们可视化,你可能仍然逃脱不使用增加了复杂性。 (例如,可视化(间距= 90,辊= 0,偏航= 0)应该是相同的可视化(间距= 0,辊= 90,偏航= 90)。)在上述我的方法,而你可以有多种方式指的是“相同”的态度,没有人其实是错误的 ,本身。 他们还是会给予你相对于地面的角度。
但事实上,陀螺仪可以从态度到另一个的一个有效描述切换意味着什么,我上面写的只有三种组分的2抽身需要更正:因为这个,你就需要捕获所有三个组件,不管是什么。 抱歉。