一级倒立摆状态空间建模,离散化,Matlab仿真,添加高斯噪声并采用卡尔曼滤波去噪

最近做了一个和一级倒立摆有关的作业,做的时候在网上查阅了很多的资料,但是发现CSDN的很多资料文件都需要付费才能下载。本着开源的精神,搞一波分享,求点赞收藏。

代码直接放在开头,转载表明出处谢谢。当然,文中可能有很多错误,尤其是卡尔曼滤波部分,因为我对卡尔曼滤波一窍不通,只是任务需要去照猫画虎接进去罢了,仅供参考,轻喷。

1.先上代码,能跑才有下一步

(1)倒立摆建模部分:“Filter.m”

clc;
clear;

% 输入状态空间建模信息
A = [0 1 0 0;
    0 -0.0883 0.6293 0;
    0 0 0 1;
    0 -0.2357 27.8285 0];
B = [0;
    0.8832;
    0;
    2.3566];
C = [1 0 0 0;
    0 0 1 0];
D = 0;

% 模型离散化
T = 0.02;
[AA,BB] = c2d(A, B, T);

% 倒立摆引入LQR控制算法
Q = [1 0 0 0;
    0 1 0 0;
    0 0 2 0;
    0 0 0 2];
R = 1;
K = lqr(AA, BB, Q, R);
Ac = AA - BB*K;

% 确定模型初态、模型输入,并求解模型运动状态
x0=[0;
    2;
    0;
    1];
t = 0:0.01:9.99;
u = zeros(size(t));
[y, x] = lsim(Ac, BB, C, D, u, t, x0);
figure(1);
plot(t, y(:, 1), "b", "LineWidth", 1);
hold on;
plot(t, y(:, 2), "r", "LineWidth", 1);
legend('位移', '角度');
xlabel('时间/s');

figure(2);
% 提取位移信息
y_position = y(:,1);  
plot(t, y_position, "LineWidth", 1);
xlabel('时间/s');

% 假设位移信息读取受到严重噪声干扰,加入高斯噪声
Z = y_position;
for i = 1:length(Z)
	Z(i) = y_position(i) + normrnd(0,0.4);
end
figure(3);
plot(t, Z);
xlabel('时间/s');

% 以下是我一窍不通的卡尔曼滤波部分
r = 0.017;
D = Z-y_position;
X = Z(1);
T = 0.03;
V = 0.1;
Q = T^2*V^2;
R = r^2;
P = X^2;
A = 1;
H = 1;
Xn = KalmanFilter(X, Z, A, Q, H, R, P, y_position);



(2)卡尔曼滤波函数部分:“KalmanFilter.m”

function  Xkf = KalmanFilter(InitX, Z, F, Q, H, R, P0, y)

% 参数说明: InitX:初始值
%           Z:输入测量得到的数据
%           F:状态转移矩阵
%           H:观测矩阵
%           Q:协方差矩阵
%           R:测量协方差矩阵

X = InitX;
% 数据点数目
[l, s] = size(X);
L = length(Z);
% 初始化观测值矩阵 
Xkf = zeros(L,s);
Xkf(:,1) = X(:,1);
P = P0;
% 滤波 
for i = 2:L
    Xn = F*(Xkf(i-1,:)');
   P = F*P*F' + Q;
    K = P*H'*inv(H*P*H' + R);
    Xkf(i, :) = Xn + K*(Z(i,:) - H*Xn);
    P = (eye(s)-K*H)*P;
end 
fig = figure(10);
set(fig, 'position', [200 200 1200 500]);
hold on;
plot(Z(:,1),'-b.','MarkerSize',1);
hold on;
plot(Xkf(:,1),'-r','MarkerSize',1);
hold on;
plot(y(:,1),'-g','MarkerSize',1);
legend('带有噪声信号', '滤波后信号', '原信号');
xlabel('时间/ms');
end

2.倒立摆的状态空间建模

3.实验和实验效果

使用Matlab建立模型,使用LQR算法控制算法实现倒立摆实验,设置初态为[0; 2; 0; 1],设置输入为0,得到角度和位移曲线如图所示。

提取其中的位移曲线,如图所示。

假设位移信息读取受到严重噪声干扰,加入均值为0、方差为0.4的高斯噪声以模拟此干扰。受到干扰后的位移曲线如图所示。

合理设置参数,使用卡尔曼滤波处理被噪声干扰的信号,滤波效果如图4所示。

效果非常一般,但至少是有效的哈哈。

另外,卡尔曼滤波部分转载自:(23条消息) MATLAB的卡尔曼滤波函数与实例_苏小泉的博客-CSDN博客_matlab中卡尔曼滤波函数https://blog.csdn.net/m0_37953670/article/details/89528002

另外,我把截图的Word文件和代码也上传了CSDN,链接:(23条消息) 一级倒立摆状态空间建模,离散化,Matlab仿真,添加高斯噪声并采用卡尔曼滤波去噪-其它文档类资源-CSDN文库https://download.csdn.net/download/weixin_46143765/85321804

设置所需积分为0,不知道是不是能直接下载。如果不能且需要文件,可以留下邮箱,我要是看到了会发一波。求赞。

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值