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)

 数据格式

结果

结尾 

能力有限,欢迎指正

作者:爱学习的草履虫

物联沃分享整理
物联沃-IOTWORD物联网 » IMU加速度计误差标定方法+代码实现

发表回复