任何传感器都会有误差,有误差就需要进行标定,对于加速度的标定,幸运的是我们有重力加速度作为真实值去参考,只要我们在前期测得的数据能够接近这个值就OK了,然后开始数学建模。参考了一些文章,发现js200300953讲的最清楚,给了我很多启发,由于高等数学不是很扎实,有些地方不是很明白。博客文章如下地址:
http://blog.sina.com.cn/s/blog_81f1e26801017aji.html 具体文章内容我也一并贴出来,别说我是抄袭!
- 方案
传感器总会有缺陷,测量的值有误差,所以要校正。要校正加速度计,最简单有效的办法就是利用重力了。以不同方向在静止状态测量加速度,然后把数据拟合到当地重力加速度,就完成对加速度计的标定了,直接无视Datasheet上的精度参数。 - 采集数据
采集数据就要用到上次做的“黑匣”了,测量到的部分数据如下。
里面的0x55AA是帧开始符,表示一组测量数据的开始,紧接着就是3个double类型的值,小端格式,表示x,y,z方向的原始测量值。
- 理论依据
这次标定加速度计,最大的收获是——把困扰多年的“最小二乘法”弄懂了。
设x‘,y’,z‘为实际加速度分量,G0为当地重力加速度值。理想情况下有下面的等式:
至此,问题归结到线性方程组的求解,理论上已经没有任何障碍(那是当然的,都已经用了上百年了)。
- 编写软件
先梳理一下思路。现在有一个原始的RCD格式的数据,首先要提取出[xn,yn,zn],然后用[xn,yn,zn]算出向量pn,再用pn转置自乘,累加成矩阵A,接着求以A为系数矩阵的齐次线性方程组,算出[a,b,c,d,e,f,g],这样就可以得到最佳的[a',b',c',d',e',f']了。
第一步需要了解RCD文件的结构,那是做黑匣的时候自己设计的,没问题;然后加加减减得到A,这个也不难;以前混ACM的时候,对着《线性代数》写过解线性方程组的库,解方程组小意思;最后再次加加减减,[a',b',c',d',e',f']就出来啦。关键代码如下:
输入数据循环。
累加生成矩阵。
解方程,vp就是[a,b,c,d,e,f,g]啦。
[a,b,c,d,e,f,g]转[a',b',c',d',e',f']。
- 校验结果
一共14339组数据,左边是原始采样值,中间是标定后的加速度,右边是估计值与实际值的误差。
重力加速度取广州的9.7883m/s²,大多数误差在0.5%以下,结果还算满意。
后来试过周期性忽略某些采样点,得出不同的参数,发现参数只有3~4位有效数字。