差生文具多。买了一把水平尺,还带倾角数显。试用了一下,我体感水平的时候数显是-2.25度,于是照着数显调到0度水平。但不知道为何,仅看数显0度我是不太相信的,我还是觉得这样是有点歪,但看到气泡也是居中我就立马信了。
水平尺的数显倾角如何才能做到的呢,最可靠的办法就是获得加速度的矢量。因为水平尺在静止状态下合外力产生的加速度为零,但重力加速度方向是垂直于水平面,所以可以通过测量重力加速度的方向来得到水平尺于水平面的夹角(严格来说,测量的是“比力”)。
我们很难直接测量加速度的“方向”,但矢量是可以分解的,所以可以测量XYZ三轴下的加速度分量,从而计算出水平尺的“姿态”。而能做这件事的传感器叫做“三轴加速度计”。
得益于 MEMS 技术,加速度计可以把体积做得非常小型,封装在一颗小芯片里面。世界上第一款单芯片集成的 MEMS 加速度计一般认为是1991年ADI推出的ADXL50,而 MEMS 技术得到广泛应用离不开汽车安全气囊的发展。感应撞击的传感器换成 MEMS 加速度计后,具备了体积小、反应快、成本低等显著优势。
虽然只依赖三轴加速度计就可以完成水平尺数显角度的功能,但我还是想再拓展一下。一般这类单芯片传感器被称作IMU,除了三轴加速度计还会有三轴陀螺仪和三轴磁力计,合起来一般就称作9轴传感器。
这是因为三轴加速度计有一些“缺陷”,它无法感知绕重力轴旋转的动作(偏航),而且在运动状态下无法分辨重力加速度和惯性加速度。因此,如果想要获得更加稳定、更全的姿态监测,9轴IMU就成了标配。
三轴陀螺仪测量的是角速度,动态响应很好地弥补了加速度计在振动或移动时的数据波动。而三轴磁力计测量地磁场,相当于一个电子指南针,能够锁定偏航角。


有这么多类型的传感器集成在一颗芯片中,那监测“姿态”应该是比较轻松的事情。那要如何在数学层面表达物体姿态呢?最直观的是欧拉角,把姿态分解成Roll、Pitch、Yaw三个维度,如图1所示,似乎只要给出Roll、Pitch、Yaw,大家都能想象出飞机的姿态。但实际上用欧拉角表达姿态可能会遇到一个万向节死锁(Gimbal Lock)的问题,如图2所示,当某个轴旋转到 90 度时,会丢失一个自由度。
为了规避万向节死锁的问题,以及提升姿态解算的效率,很多底层算法会在高维空间中使用四元数q=(w,x,y,z)进行运算。虽然四元数并不直观,但能够很平滑地描述空间中任意角度的旋转。
如果我这个水平尺底层使用的是欧拉角,那么在做垂直测量的时候,因为欧拉角的计算涉及tan的计算,这时候分母就可能无限接近于0,如果这时候再扭动尺子,可能会出现数据发疯似的乱跳动。不过还好,我试了一下,并没有发疯,所以底层的计算应该还是基于四元数的。
如果这把尺子求解出来的姿态可以通过无线传出,那么我就可以在屏幕上渲染一把3D的水平尺,把姿态实时展示出来。以前为了让算法的同事更好理解姿态,我就这么做过,把IMU安装在飞机模型上,用 Processing 写了个实时展示姿态的界面。
关于欧拉角与四元数的学问还蛮深的,我只是简单讲讲,就不继续展开了。感兴趣的朋友可以去了解一下w