【IMU】 温度零偏标定

温度标定

IMU的零偏随着温度的变化而变化,在全温范围内形状各异,有些可能是单调的,有些可能出现拐点。

多项式误差温度标定

目的是对估计的参数进行温度补偿,获取不同温度时的参数值(零偏、尺度、正交),绘制成曲线。

  • soak method:控制恒温室的温度,然后读取传感器数据进行标定。
  • ramp method:记录一段时间内线性升温、降温时传感器的数据进行标定

温度误差模型,B是bias,T是温度, ∆T 是变温率(温度变化快慢)

B=f(T,∆T)

f靠尝试,通常多项式即可

 

通过改变温度,得到对应温度下的标定参数,用上面的多项式模型进行拟合即可。或者这些数据绘制曲线,用最小二乘多项式去拟合。如果曲线不规则,也可以分段拟合。

拟合是解方程的过程。构建方程时,各未知量的系数要提供足够的变化,这个方程才可解,才能解的好,或者说,才能正确辨识。

如果模型里有变温率的因素存在,而拟合时只提供一组升温的数据,那效果不会太好,因为提供的数据里,每一个温度点只对应一个变温率。

因此,要反复升温降温,而且使用不同的升降温速率,提供丰富变化的数据,才是一个好的样本数据。

图 1为bias在0~60摄氏度温度区间的变化情况。红色线为rawdata,蓝色线为多项式拟合值。

图 1

图2为温漂补偿后的输出:

参考matlab代码如下:

clear;								% 删除工作区中项目,释放系统内存
clc;								% 清空命令行窗口
close all;							% 关闭句柄可见的所有图窗
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function y = tFun(a,X)
  y = a(1)*X(:,1).^2+a(2)*X(:,1)+a(3)*X(:,2).^2+a(4)*X(:,2)+a(5)*X(:,2).*X(:,1)+a(6);;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Read in our toolboxes
addpath('tool');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

mat_path = './IMUDATA/03#/20240408am1101_static_3#_0.csv';

fprintf('opening the mat file.\n')
data_imu = csvread(mat_path);

imu_wy = data_imu(:,5);
imu_T = data_imu(:,7);
time = data_imu(:,8);
deta_T = data_imu(:,9);


x = imu_T(1:1:end);
y = deta_T(1:1:end);
z = imu_wy(1:1:end);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
aveX = ImuDataSum(x, 500)';
N = length(aveX);
aveX = aveX(1:1:N-1);
aveY = ImuDataSum(y, 500)';
aveY = aveY(1:1:N-1);
aveZ = ImuDataSum(z, 500)';
aveZ = aveZ(1:1:N-1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
input = [aveX,aveY] ;
output = aveZ;

a0=rand(1,6);
func=@(a,X)a(1)*X(:,1).^2+a(2)*X(:,1)+a(3)*X(:,2).^2+a(4)*X(:,2)+a(5)*X(:,2).*X(:,1)+a(6);;
a=lsqcurvefit(func,a0,input,output);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
testVal = tFun(a,input);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[aveXX,aveYY]=meshgrid(aveX, aveY);%三维绘图
testValZZ = a(1)*aveXX.^2+a(2)*aveXX+a(3)*aveYY.^2+a(4)*aveYY+a(5)*aveYY.*aveXX+a(6);
##figure;
mesh(aveXX, aveYY, testValZZ);
hold on;

%散点图
plot3(aveX,aveY,aveZ,"b-",'LineWidth',1);
hold on;
plot3(aveX,aveY,testVal,"r*",'LineWidth',1);
hold on;


M = length(testVal);
##% 计算均方根误差
RMSE = sqrt(sum((aveZ - testVal).^2) / M);
fprintf('RMSE:  %d\n', RMSE);

tool

%Purpose:average
%Author name:Yanjh
%date:2024.02.06

function aveData = ImuDataSum(data, fs)
  leng = length(data);
  %%aveData=zeros(floor(leng/200));

  for i=1:floor(leng/fs)
  aveData(i) = sum(data(fs*(i-1)+1:fs*i))/fs;% 每200行取一次平均
end

  endl = floor(leng/fs) + 1;
  aveData = [aveData, mean(data(endl:end))];
end

多项误差温度标定

考虑到将加速度计、陀螺的零偏和标度因数统一进行温度建模,那么可以认为加速度、角速度测量误差为陀螺输出电压 V、器件温度 Ti、器件温度变化率 Ti、环境温度 To 和环境温度变化率 ∆To 的函数,即 ω=g(Vg,Ti,∆Ti,To,∆To);加速度测量误差为加速度计输出电压和温度的函数 a=g(Va,Ti,∆Ti,To,∆To),假设二者都是四输入一输出的高阶多项式,这样就可以转化为多因素回归问题标定. 如果多项式中温度和加速度计、陀螺输出电压和温度最高都取二阶,则多因素回归模型中有21 个因素,加速度计和陀螺相应的模型为:

每个惯性元件温度误差模型中需要标定的参数恰巧为 21 项,总共需要做 21 次完整的标定编排。因此,温度误差模型中温度 T 和输出电压 V 都取二阶。 至于 21 次试验数据是否足够能辨识出 21 项参数,这需要通过试验的结果来验证. 如果标定结果发散,那只能再降低 T 和 V 的阶次。

在处理陀螺、加速度计测量数据时,大多按经验直接选择模型变量进行建模,从统计意义而言这样的模型并不一定是最优的. 一般来说,系统所要求的精度不同,需要的误差模型也不同,随着要求精度的提高,需要考虑的误差模型项数也得增多. 因此,需要对模型方程进行优化,从而使 MIMU 的测量模型更趋合理. 从统计学角度出发,对实验数据的处理,应采用 一种有效的方法从众多的影响因素中,挑选对响应 变量贡献大的因素,从而建立最优模型. 由于复相关系数反映了响应变量与回归变量之间的密切程度,因此可以把 R2值最大作为寻优条件来选择自变量,以此选择最优变量,从而建立最优回归方程。

在对加速度计、陀螺温度误差模型进行优化时,考虑到程序设计的简便性和计算量等因素采用逐步回归分析方法,得IMU的加速度计和陀螺分段优化模型(以X轴为例)。

该方法利用R2值来裁剪参数,是一个可以借鉴的方法,具体还未测试过。

参考文献:

MEMS 惯性测量组件的温度误差补偿模型研究

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值