最近做四轴,用到HMC5883l,发现严重不准,主要是零偏和三轴比例相差较大。
由于没有精密磁场线圈来进行自动校准,琢磨了个校准的方法,供大家参考。
地磁场强度基本是恒定不变的,而我们的HMC5883l磁场计可以在空间任意旋转。
因此,磁场计上的真实磁强度矢量,其模应该是相等的,方向是任意的,会形成一个球。
我们知道,零偏和三轴比例误差可以看做是一次函数。由于误差的存在,测得的磁强度矢量会畸变成一个椭球。
椭球可以用方程AX^2+BY^2+CZ^2+DX+EY+FZ=1表示,对于确定的椭球和点,AX^2+BY^2+CZ^2+DX+EY+FZ可以描述点到椭球的距离。我们想要所有测量点到椭球都尽可能近,有:
设F(A,B,C,D,E,F)=AX^2+BY^2+CZ^2+DX+EY+FZ-1,有∑(F^2)最小。
求∑(F^2)梯度,有:▽(∑(F^2))=∑(2F▽F)=∑(2F(X^2,Y^2,Z^2,X,Y,Z));
令其等于零向量,有:
∑FX^2=0;
∑FY^2=0;
∑FZ^2=0;
∑FX=0;
∑FY=0;
∑FZ=0;
解方程,得到ABCDEF。将其化为椭球的标准形式,就可以得到修正函数了。
用matlab表示:
%先导入校准用磁场计测量值mag
%测量值尽可能均匀,可以拿着磁场计随机晃动
%如果测量值不均匀,可能产生的图形不是椭圆而是双曲线抛物线等
f=[mag.^2 mag ones(size(mag,1),1)];
mat=[
sum(f.*(f(:,1)*ones(1,7)),1);
sum(f.*(f(:,2)*ones(1,7)),1);
sum(f.*(f(:,3)*ones(1,7)),1);
sum(f.*(f(:,4)*ones(1,7)),1);
sum(f.*(f(:,5)*ones(1,7)),1);
sum(f.*(f(:,6)*ones(1,7)),1);
];
answ=rref(mat);
answ=answ(:,7);
jl=[d/(2*a) e/(2*b) f/(2*c) 1/a 1/b 1/c 1-(d/(2*a))^2-(e/(2*b))^2-(f/(2*c))^2];
jl(4:7)=jl(4:7)/jl(7);
a=jl(1);b=jl(1);c=jl(1);d=jl(1);e=jl(1);f=jl(1);
%测量值:x y z 修正得到实际值:X Y Z
% X=(x+a)/d
% Y=(y+b)/e
% Z=(z+c)/f
%得到的是方向向量,如果要得到具体值请查当地地磁场准确值并乘以所得向量
%对于加速度计也可以采用相同的方式进行校准
200字以内,仅用于支线交流,主线讨论请采用回复功能。