MATLAB-卡尔曼滤波简单运用示例

这篇博客介绍了MATLAB中卡尔曼滤波的简单应用和扩展卡尔曼滤波(EKF)在非线性系统中的使用。内容包括角度和弧度转换、加速度计和陀螺仪数据处理、EKF的线性化方法、状态转移矩阵和观测方程的计算,以及EKF在目标追踪中的误差分析和实例演示。
摘要由CSDN通过智能技术生成

1、角度和弧度之间的转换公式? 
设角度为 angle,弧度为 radian 
radian = angle * pi / 180; 
angle = radian * 180 / pi; 
所以在matlab中经常设置一个参数,用于角度与弧度之间的转换:deg_rad=0.01745329252e0;

2、注意下面角度Angint的表示方法: 
Angint=[0,10,0]*deg_rad; 
则:Angint(0) = 0;Angint(1) = 0.0175;Angint(2) = 0; 
这种表示方法可以在四元数中应用: 
例如: 
q=[cos(Angint(3)/2)*sin(Angint(2)/2)*cos(Angint(1)/2)+sin(Angint(3)/2)*cos(Angint(2)/2)*sin(Angint(1)/2) 
cos(Angint(3)/2)*cos(Angint(2)/2)*sin(Angint(1)/2)-sin(Angint(3)/2)*sin(Angint(2)/2)*cos(Angint(1)/2) 
-sin(Angint(3)/2)*cos(Angint(2)/2)*cos(Angint(1)/2)+cos(Angint(3)/2)*sin(Angint(2)/2)*sin(Angint(1)/2) 
cos(Angint(3)/2)*cos(Angint(2)/2)*cos(Angint(1)/2)+sin(Angint(3)/2)*sin(Angint(2)/2)*sin(Angint(1)/2)]; 
可以用q(0)、q(1)、q(2)、q(3)来代入公式计算三轴姿态角。

3、在滤波的过程中,要明确滤波时间和采样频率;

4、IMU数据仿真分析: 
(1)先模拟加速度计和陀螺仪的真实输出: 
[ Angle,Wibb,Fb ] = imu_true_out( tt,ynong,T );%tt=tt+TT;TT=1/f为时间间隔 
注意:加速度计的输出要进行坐标转换: ao=Cnb*([0,0,g]’, 
其中:Cnb 

                

如果你要在加速度计的输出上添加一个随机干扰(可模拟非重力加速度干扰),可以使用函数awgn();  %Add white Gaussian noise to a signal. 
ao=Cnb*([0,0,g]’+[0,awgn(0,ynong),0]’);   %如果在指点的时间内添加这种干扰,可以加一个if函数 
(2)模拟加速度计和陀螺仪的误差: 
[Gyro_b,Gyro_r,Gyro_wg,Acc_r]=imu_err_random(tt,TT,Gyro_b,Gyro_r,Gyro_wg,Acc_r);

function [Gyro_b,Gyro_r,Gyro_wg,Acc_r]=imu_err_random(t,T,Gyro_b,Gyro_r,Gyro_wg,Acc_r)

g=9.7803698;         %重力加速度    (单位:米/秒/秒)
Wie=7.292115147e-5;  %地球自转角速度(单位:弧度/秒)
deg_rad=0.01745329252e0;% Transfer from angle degree to rad

Da_bias=[0.001; 0.001; 0.001]*g;  %加速度零偏(应与非随机性误差中的加速度零偏保持一致)

Ta=1800.0; %加速度一阶马尔可夫过程相关时间
Tg=3600.0; %陀螺一阶马尔可夫过程相关时间

%%%%%%%%%%%%%%%%%%随机性误差%%%%%%%%%%%%%%%
if( t==0 )
  Acc_r=Da_bias.*randn(3,1); %加速度一阶马尔可夫过程1.0e-4g

  Gyro_b=0.01*deg_rad/3600.0*randn(3,1); %随机常数0.1(deg/h)
  Gyro_r=0.01*deg_rad/3600.0*randn(3,1); %陀螺一阶马尔可夫过程0.1(deg/h)
  Gyro_wg=0.01*deg_rad/3600.0*randn(3,1);%陀螺白噪声0.1(deg/h)
else  
  Acc_wa=sqrt(2*T/Ta)*Da_bias.*randn(3,1);%加速度一阶马尔可夫过程白噪声
  Acc_r=exp(-1.0*T/Ta)*Acc_r; %加速度一阶马尔可夫过程

  Gyro_wr=0.01*sqrt(2*T/Tg)*deg_rad/3600.0*randn(3,1);%陀螺一阶马尔可夫过程白噪声0.1(deg/h)
  Gyro_r=exp(-1.0*T/Tg)*Gyro_r+Gyro_wr;%陀螺一阶马尔可夫过程0.1(deg/h)
  Gyro_wg=0.01*deg_rad/3600.0*randn(3,1);%陀螺白噪声0.1(deg/h)
end 

然后再在while(1)中将真实值+误差值按时间序列存储在数组中以备用,如下:

while tt<=T;
    [ Angle,Wibb,Fb ] = imu_true_out( tt,ynong,T );
    [Gyro_b,Gyro_r,Gyro_wg,Acc_r]=imu_err_random(tt,TT,Gyro_b,Gyro_r,Gyro_wg,Acc_r);
    Ture_Angle(:,kk)=Angle/deg_rad;%模拟输出的三轴姿态角
    gyro(:,kk)=Wibb+Gyro_b+Gyro_r+Gyro_wg;%模拟输出的陀螺仪输出
    acc(:,kk)=Fb+Acc_r;%模拟输出的加速度计输出
    tt=tt+TT;
    kk=kk+1;%这里TT=1/f=1/100为采样时间间隔,f为采样频率,T为采样时间,文中设置为30s
end

5、函数randn的意思: 
R = randn(3,1);%产生3行1列的随机R矩阵,R矩阵满足方差为1,均值为0;注意这里不是说这三个数的方差为1,均值为0,而是每次运行randn时,当运行的量足够大时,所有的R(0)的方差为1,均值为0,R(1)、R(2)同理。 
例如1. randn(1) ;%生成一个随机数,要想满足方差为1,均值为0,也必须运行足够多的次数 
例如2. x = .6 + sqrt(0.1) * randn(1);%产生均值为0.6,方差为0.1的一个5*5的随机数;sqrt(0.1)对0.1进行开方,直接写0.1那这里就是表示标准差了

randi([m,n],a,b)    %[m,n] 的  a*b 随机数

6、axis()函数的用法:
axis([xmin xmax ymin ymax]);%定义x轴和y轴之间的间距

7、set()函数的用法:
plot(t,acc(2,:),'linewidth',1.3); set(gcf,'Position',[100 100 400 300]); %这里的100是指生成的图片距离左下角的距离,400和300分别表示长和宽 axis([0 T -4.9 2.0]); set(gca, 'YTick', [-4.9 -2.4 -0.1 2.0]) set(gca,'fontname','宋体','fontsize',10); %用于改变坐标轴坐标大小,10代表坐标大小; xlabel('时间/s','fontname','
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值