基于手机devicemotion和deviceorientation计算出手机在空间中的位置变化

2023-05-27 08:14

可行性依据

手机旋转deviceorientation 返回的是 实时的绝对值,alpha,beta,gamma三个值。可以得到一个手机在空间中的绝对朝向。这个值都是0的时候,手机面朝上,水平放置于桌上,手机顶指向东方。

手机的重力感应devicemotion,返回的acceleration包含三个加速度x,y,z 。三个值是实时的基本在30ms返回一次,基于手机本体坐标的。比如手机水平放在电梯上,电梯上下时,xy不变,z会先正后负,或先负后正。若是把手机立在电梯上,则xz不变,y会变化。

若是要计算出手机基于地面坐标的变化,可以这么做:将xyz加速度根据abg旋转角度转化到地面坐标的x‘y’z‘加速度。再根据x'y'z加速度计算出速度,再根据速度计 和时间 算出移动的距离。

加速度的基于旋转转化到地面坐标

基于能够获取到的参数,和需要输出的结果。可以使用旋转矩阵(Rotation Matrix)的方式将xyz转化为x'y'z',先进行z轴旋转转化,再进行x轴旋转转化,再进行y轴旋转转化。

基于加速度计算速度

看X轴的速度,定义为Vx初始速度为0,由于间隔时间足够短,认为间隔时间内加速度不变。每次传递进加速度,乘以间隔时间得到速度变化,累加到Vx。Vx = Vx + Ax*t。 Ax就是上一步得到的x’。

基于速度计算距离

看X轴的坐标,定义Dx初始值为0,由于间隔时间短,认为间隔时间内速度不变,Dx = Dx+Vx*t。

同理可以得到其他两个轴的Dy和Dz变化。

边界问题

由于精度,采集计算,以及传感器的误差,最后会出现手机移动后静止放在桌面上,但是Vx,Vy,Vz三个角度上的速度没有回到0,导致手机明明放在桌子上静止了,但是模拟的位置还在运动。此时需要增加一个定时逻辑。当devicemotion时间超过30ms没有触发,或触发的值都是0,认为手机不再被移动。理论上此时手机要么静止,要么在匀速运动,但是现实中不可能出现实际意义上的匀速运动。故此时将速度直接置为0,或30ms内渐变为0.

以上为近期自己写的一个手机空间位置追踪的总结。