欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IMU和GPS数据融合估计位置与速度(MATLAB实现)

程序员文章站 2022-04-20 11:47:18
...

简介

假设小车在一个方向上以 2cm/s2 的加速度运动了 100s,使用加速度计和GPS测量小车位置。GPS定位误差为高斯分布,方差为4m;加速度计的误差也为高斯分布,方差为0.01m/s2,并且由于加速度计放置不是完全水平的,有 0.03m/s2 的偏移。采用卡尔曼滤波,融合加速度计和GPS数据,估计小车的位置与速度。


1. 问题

如果只使用GPS数据估计,卡尔曼滤波器MATLAB实现(从一维到三维)一文给出了基本理论与测试效果。如果只使用加速度计数据,理论上系统是不可观的,也即不能稳定估计小车的速度[1],偏移误差将不断累积。

在小车运动中,已知加速度计数据和GPS定位数据,加速度计和GPS数据都有一定误差,如何融合数据,估算出小车的位置与速度?融合传感器数据真的能提高数据精确度吗?本文将作简单测试验证。


2. 卡尔曼滤波及参数

2.1 定义系统:

IMU和GPS数据融合估计位置与速度(MATLAB实现)2.2 卡尔曼滤波公式:

IMU和GPS数据融合估计位置与速度(MATLAB实现)
2.3 在此例子中各变量取值:

IMU和GPS数据融合估计位置与速度(MATLAB实现)
可见,在预测过程使用加速度计获取的数据,在滤波过程使用GPS数据。


3. 代码与效果

% ==================== 系统描述 ====================
% GPS精度为4m
% 加速度计的精度为 1cm/s^2,且有 3cm/s^2 的偏移
% 真实的加速度为 2cm/s^2
% 数据采集频率皆为 10Hz

% ================== 模拟产生数据 ==================
clear all
rng(0);                                 % 设置随机数种子
dt = 0.1;                               % 0.1s采集一次数据
T = 0:dt:100;                           % 0~100s
N = length(T);                          % 采样点数

a = 2e-2;                               % 真实加速度
s = 1/2 * a * T.^2;                     % 真实位移(实际上不可知)

aa = a + 1e-2*randn(size(s)) + 3e-2;    % 加速度计测量数据,有噪声,有偏移1
R = 4;                                  % GPS 测量精度
z = s + sqrt(R)*randn(size(s));         % GPS 测量数据,开根号得到

% ================= 变量定义与初始化 =================
A = [1 dt; 0 1];                        % 状态转移矩阵
H = [1 0];                              % 转换矩阵
B = [1/2*dt^2; dt];                     % 输入控制矩阵
Q = [0.001 0; 0 0.01];                  % 过程噪声协方差,估计一个

P = eye(2);                             % 初始值为 1(可为非零任意数) 
x = zeros(2, N);                        % 存储滤波后的数据,分别为位移、速度信息
k = 1;                                  % 采样点计数

% ================= 卡尔曼滤波过程 ==================
for t = dt:dt:100
    k = k + 1;                  
    x(:,k) = A * x(:,k-1) + B*aa(k);                % 卡尔曼公式1
    P = A * P * A' + Q;                         % 卡尔曼公式2
    K = P*H' * inv(H*P*H' + R);                 % 卡尔曼公式3                                       
    x(:,k) = x(:,k) + K * (z(:,k)-H*x(:,k));    % 卡尔曼公式4
    P = (eye(2)-K*H) * P;                       % 卡尔曼公式5
end
 
% ==================== 结果绘图 =====================
figure(1);                               
plot(T, z(1,:),'b.');hold on;                   % GPS测量数据
plot(T, x(1,:),'r.');                           % 滤波后数据
plot(T, s ,'k-');                               % 绘制真实值
legend('滤波前','滤波后','理想值');              % 标注
xlabel('时间: s');                         
ylabel('距离: m');hold off; 
axis([0 100 -20 120])
text(2, 110, ['滤波前方差: ' num2str(var(z - s))])            % 滤波前方差
text(2, 100, ['滤波后方差: ' num2str(var(x(1,:) - s))])       % 滤波后方差

figure(2);
plot(T(1:end-1), (x(1,2:end)-x(1,1:end-1))/dt, 'b.');hold on% 将滤波后位移差分结果
plot(T, x(2,:), 'r.');                                      % 滤波估计速度
plot(T, a*T, 'k-');                                         % 真实速度
legend('滤波位移差分','卡尔曼估计值','真实值')
xlabel('时间: s');                         
ylabel('速度: m');hold off; 
axis([0 100 -8 10])
text(2, 9, ['位移差分方差: ' ...
    num2str(var((x(1,2:end)-x(1,1:end-1))/dt - a*T(1:end-1)))])  % 滤波前方差
text(2, 7.6, ['速度滤波方差: ' ...
    num2str(var(x(2,:) - a*T))])       % 滤波后方差

位移结果如下,滤波后方差变为原来 1/10.

IMU和GPS数据融合估计位置与速度(MATLAB实现)
速度估计结果如下图。图中蓝色点为使用滤波后位移直接差分得到的结果,但是误差很大。其实,这样是不科学的,因为随着采样频率增加,单位时间内位移 dt 滤波的误差不会变化,但是 v=ds/dtdt 随采样频率减小,误差会越大。而采用卡尔曼滤波的结果,误差较小。

IMU和GPS数据融合估计位置与速度(MATLAB实现)


4. 比较

只使用GPS数据或者加速度计的计算会如何呢?只使用GPS时,程序直接将矩阵 B 变为零矩阵即可。最终结果如下:

位移 速度
IMU和GPS数据融合估计位置与速度(MATLAB实现) IMU和GPS数据融合估计位置与速度(MATLAB实现)

效果和GPS与IMU数据融合结果几乎没有差异。

只使用加速度计结果暂未写出,直观感受是有很大偏移。因为小车真实加速度为 2cm/s2,但是偏移量为3cm/s2,误差累加严重。


参考文献

[1]《多旋翼飞行器设计与控制》第八讲:可观性与卡尔尔曼滤波. 全权著.

相关标签: 算法