手机的传感器实在是太差了,真的不适合用来做导航,除非是为了练习软件开发、利用简单平台学习算法。

使用了这么久,我觉得利用手机的运动传感器进行导航相关的开发,要遵循“简单、直接”的原则。
1 加速度数据与重力信息
很多智能手机是没有陀螺仪的,只能测量加速度和磁场强度,根据重力场和磁场方向确定出手机姿态。对于App开发者来说,只需要调用系统接口读取重力向量数据或姿态角数据,直接利用系统提供的信息完成开发即可。怎么计算和精度如何这是厂商和供应商的事情。

手机坐标系定义
对于开发赛车游戏直接读取y轴加速度输出就能实现方向的控制;视频App也能根据各轴加速度大小确定屏幕方向,实时调整画面旋转。
手机在使用中可以视为是静态的,加速度输出就是重力加速度,此时计算出来的姿态比较准确。但是当我们步行、跑步、骑行时,加速度输出中必然包含运动加速度,继续使用加速度输出求解姿态误差会变大。Android开发时不用考虑这么多,调用“TYPE_GRAVITY”和“TYPE_ROTATION_VECTOR”就行了。
2 低通滤波前后加速度数据对比
通过低通滤波器能不能有效地提取出重力加速度信息?姿态结果又如何?试一试就全都清楚了。
我利用在校园里骑车的一小段数据做测试,这是IMU输出加速度模值滤波前后对比图:

这是三轴加速度滤波前后对比图:

经过低通滤波处理,加速度中与重力无关的成分大部分都被滤除,此时用加速度数据计算姿态应当会得到不错的结果。
3 利用重力向量计算姿态角
利用得到的加速度数据计算手机的姿态角,并于组合导航(手机上完成的组合,精度不高)的姿态比较。
原始加速度数据计算的姿态:

滤波后加速度计数据计算的姿态:

组合得到的姿态:

对比这三个姿态输出,滤波后的姿态结果和组合的结果很接近,完全可以使用滤波后重力矢量数据计算手机姿态,实际效果并不比组合导航差。
mlx导出的pdf文件:
test_gravity_sensor.pdf