本帖最后由 friend0720 于 2016-7-29 09:52 编辑
【转】四轴 - 加速度计标定
js200300953的博客http://blog.sina.com.cn/js200300953
这几天都在标定加速度计,终于完成了。 - 方案
传感器总会有缺陷,测量的值有误差,所以要校正。要校正加速度计,最简单有效的办法就是利用重力了。以不同方向在静止状态测量加速度,然后把数据拟合到当地重力加速度,就完成对加速度计的标定了,直接无视Datasheet上的精度参数。 - 采集数据
采集数据就要用到上次做的“黑匣”了,测量到的部分数据如下。
里面的0x55AA是帧开始符,表示一组测量数据的开始,紧接着就是3个double类型的值,小端格式,表示x,y,z方向的原始测量值。
- 理论依据
这次标定加速度计,最大的收获是——把困扰多年的“最小二乘法”弄懂了。
设x‘,y’,z‘为实际加速度分量,G0为当地重力加速度值。理想情况下有下面的等式:
但测量有误差,设测量值为[x,y,z],则测量值和实际值可以用下面的公式拟合。拟合方式为线性拟合,其中a',b',c'是比例因子,d',e',f'为偏移因子。通过这条公式,可以把测量值“变成”实际值(下面称作“估计值”),标定加速度计的目标,就是确定[a',b',c',d',e',f']这六个参数(下面称作“参数”),使估计值更接近实际值。
代入理想情况的等式,有:
这分明是椭球嘛,展开得:
为方便推导和运算,写成如下形式:
比较以上两式,有:(注意要加上系数k)
反过来有:
现在已经在静止状态测量出一些数据,记作[xn,yn,zn],表示第n组测量值,对应的实际值都是重力G0。为了衡量参数的合适程度,引入误差函数Δn,表示第n个估计值与实际值的偏差,如果硬要说出具体意义,就是:估计值和实际值的平方差的1/k倍。
Δn是第n组数据的偏差,我们的目标是整体偏差最小,所以引入整体偏差指数I,等于全部数据的偏差的平方和(“最小二乘法”的“二乘”就是指平方)。
再次强调,我们的目标是找出一组参数,使整体的估计值最接近实际值。换句话说,就是:已知[xn,yn,zn],求使I最小的[a',b',c',d',e',f']。直接求[a',b',c',d',e',f']有困难,要利用[a,b,c,d,e,f,g],不废话吗?这就是我们引入abc的原因啊。所以不用犹豫了,动用高数中的偏导吧,用I分别对[a,b,c,d,e,f,g]求偏导,然后通通都要是0,这是I最小的必要条件。于是得到下面7条方程,对于[a,b,c,d,e,f,g],都是线性方程,组合起来就是一组7*7的齐次线性方程组。
仔细观察上面的方程,很有规律。其实可以写成更简洁(传说中的数学的优雅啊)的形式。引入列向量v和pn,v为变量组,pn为系数组,单个偏差可以写成它们的点积。
神奇的一刻到了,方程组可以用一条式表示!再经过一些变换(向量点积交换,证明不出,归纳出来的。),得到终极的矩阵形式。而且矩阵A相当利于程序实现,算法复杂度甚至是完美的“online”!
呵呵,一不小心,把最小二乘法的一般形式推导出来了。
至此,问题归结到线性方程组的求解,理论上已经没有任何障碍(那是当然的,都已经用了上百年了)。
- 编写软件
先梳理一下思路。现在有一个原始的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位有效数字。
|
|
2015-6-12 20:31:23
评论
举报
|
|
|