IMU加速度计误差标定方法+代码实现
方法思路
加速度是由力产生的,由于重力的影响,加速度计在静止状态下一直受重力加速度的影响,当加速度不同面朝上时,加速度计的不同轴所受的重力是不一样的,例如正面朝上的时候加速度计读数应该是(0,0,g),侧面朝上应该是(0,g,0)。因此可以使用六面法构造方程,然后使用最小二乘法求解
误差模型
不必多言,一搜便知
步骤
将IMU的六个面分别朝上采集数据,各采集1分钟,然后保存下来
代码实现
python代码
import numpy
import numpy as np
import pandas as pd
from scipy.optimize import least_squares
g = 9.7985 #这里是你所在位置的重力加速度,网上搜一搜就知道是多少了
data = pd.read_csv('biaoding_a2.csv')
# 提取数据
faces = data['Face'].values
acc_data = data[['AccX', 'AccY', 'AccZ']].values
def objective_function(params, faces, acc_data):
# 提取参数
acc_bias = params[0:3]
acc_scale = params[3:6]
acc_cross = params[6:12]
# 构造比例因子矩阵
S_a = np.diag(acc_scale)
# 构造非正交性误差矩阵
R_a = np.array([
[1, acc_cross[0], acc_cross[1]],
[acc_cross[2], 1, acc_cross[3]],
[acc_cross[4], acc_cross[5], 1]
])
# 计算校正后的加速度计数据
residuals = []
for i, face in enumerate(faces):
if face == 'Top':
a_true = np.array([0, 0, g])
elif face == 'Bottom':
a_true = np.array([0, 0, -g])
elif face == 'Left':
a_true = np.array([0, -g, 0])
elif face == 'Right':
a_true = np.array([0, g, 0])
elif face == 'Front':
a_true = np.array([g, 0, 0])
elif face == 'Back':
a_true = np.array([-g, 0, 0])
a_meas = acc_data[i]
a_corrected = np.dot(S_a, np.dot(R_a, (a_true + acc_bias)))
residuals.append(np.sqrt((a_meas - a_corrected) * (a_meas - a_corrected)))
# print(np.concatenate(residuals))
return np.concatenate(residuals)
# 初始化参数(偏差、尺度因子、非正交性误差)
initial_params = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 运行最小二乘法优化
result = least_squares(objective_function, initial_params, args=(faces, acc_data))
# 提取优化后的参数
optimized_params = result.x
acc_bias = optimized_params[0:3]
acc_scale = optimized_params[3:6]
acc_cross = optimized_params[6:12]
print("零偏:", acc_bias)
print("尺度因子:", acc_scale)
print("非正交性误差:", acc_cross)
数据格式
结果
结尾
能力有限,欢迎指正
作者:爱学习的草履虫