【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 惯性测量组件的温度误差补偿模型研究

相关推荐

  1. 智能驾驶IMU标定流程及接口使用说明

    2024-07-09 22:18:01       44 阅读
  2. img标签的奇怪问题

    2024-07-09 22:18:01       42 阅读
  3. HTML中的<img标签使用指南

    2024-07-09 22:18:01       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 22:18:01       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 22:18:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 22:18:01       43 阅读
  4. Python语言-面向对象

    2024-07-09 22:18:01       54 阅读

热门阅读

  1. 【Rust入门】猜数游戏

    2024-07-09 22:18:01       23 阅读
  2. NVIDIA H100 Tensor Core GPU摘要

    2024-07-09 22:18:01       17 阅读
  3. 释放计算潜能:Mojo模型与分布式训练的融合之道

    2024-07-09 22:18:01       18 阅读
  4. 环境构建大师:精通Conda中的conda create命令

    2024-07-09 22:18:01       19 阅读
  5. 我的创作4096天纪念日

    2024-07-09 22:18:01       20 阅读
  6. python 高级技巧 0706

    2024-07-09 22:18:01       16 阅读
  7. 前端面试基础html/js/css

    2024-07-09 22:18:01       17 阅读
  8. crontab定时任务不执行原因排查

    2024-07-09 22:18:01       16 阅读
  9. RTOS系统 -- ARM Cortex-M4 RPMSG之通道初始化函数

    2024-07-09 22:18:01       16 阅读
  10. shell中不常见的命令

    2024-07-09 22:18:01       20 阅读
  11. 直播APP开发源码搭建

    2024-07-09 22:18:01       17 阅读
  12. 自己写个简单的vite插件

    2024-07-09 22:18:01       23 阅读
  13. ROS melodic版本卸载---Ubuntu18.04

    2024-07-09 22:18:01       17 阅读
  14. Ubuntu手动编译源码安装Python

    2024-07-09 22:18:01       17 阅读