%% 滑模控制2用于制导
% 原模型是二体相对运动,这道题简化为目标是静止的,导弹从高处往下投
% 为简化计算过程,预先将目标物相关量置0
% 假设控制系统无滞后am = ac
% ac只用于改变导弹速度方向,不改变导弹速度大小
% TODO: 加速度图与PPT不同
clear all;
clc;
%% 参数初始化
% dX = AX + Bc*ac + Bt*at
% 普通滑膜s=x2+c(x1-lambdaD), ds=-k*s-epsilon*sgn(s)
% 自适应滑膜s=x2+k1*(x1-lambdaD)/tgo, ds=[-k2*s-kappa*sgn(s)]/tgo
gainc = 0.2;
gaink = 0.2;
epsilon = 0.002;
gaink1 = 1;
gaink2 = 1;
kappa = 0.01;
disx = 6000; %导弹与目标水平距离(m)
disy = 3000; %导弹与目标高度距离(m)
disr = norm([disx, disy]); %导弹与目标的直线距离(m)
velM = 260; %导弹初始速度(m/s)
thetaM = 0; %导弹速度与水平夹角(rad)
etaM = -atan(disy/disx); %导弹速度与MT连线夹角(rad)
accelM = 0; %导弹加速度(m/s^2)
lambda = -atan(disy/disx); %视线角(rad)
lambdaDesire = -30/180*pi; %期望视线角(rad)
dLambda = velM*sin(etaM)/disr;
X = [lambda; dLambda]; %初始状态
dt = 0.01; %仿真步长(s)
T = 30; %仿真周期(s)
%% 画图记录量
time = 0:dt:T;
xyLog1 = zeros(2, T/dt+1);
xyLog2 = zeros(2, T/dt+1);
accelLog = zeros(2, T/dt+1);
lambdaLog = zeros(2, T/dt+1);
sLog = zeros(2, T/dt+1);
%% 普通滑模控制
for i = 1:1:T/dt+1
% 滑模控制量s和加速度accelC
dDisr = -velM*cos(etaM);
matA = [0, 1; 0, -2*dDisr/disr];
matBc = [0; -cos(etaM)/disr];
matC = [gainc, 1];
s = matC*X - matC(1)*lambdaDesire;
accelC = (-matC*matA*X -epsilon*sat(s) -gaink*s) / (matC*matBc);
% 状态方程
dX = matA*X + matBc*accelC;
% 状态递推
X = X + dX*dt;
lambda = X(1);
dLambda = X(2);
accelM = accelC;
dThetaM = accelM / velM;
thetaM = thetaM + dThetaM*dt;
etaM = lambda - thetaM;
disr = disr -velM*cos(etaM)*dt;
if disr <= 0
disr = 0;
% 写入剩下的数
for j = i:1:T/dt+1
xyLog1(:, j) = [disr*cos(lambda); disr*sin(lambda)];
accelLog(1, j) = accelM;
lambdaLog(1, j) = lambda*180/pi;
sLog(1, j) = s;
end
break;
end
% 记录
xyLog1(:, i) = [-disr*cos(lambda); -disr*sin(lambda)];
accelLog(1, i) = accelM;
lambdaLog(1, i) = lambda*180/pi;
sLog(1, i) = s;
end
%% 自适应滑模控制
disr = norm([disx, disy]); %导弹与目标的直线距离(m)
thetaM = 0; %导弹速度与水平夹角(rad)
etaM = -atan(disy/disx); %导弹速度与MT连线夹角(rad)
lambda = -atan(disy/disx); %视线角(rad)
dLambda = velM*sin(etaM)/disr;
X = [lambda; dLambda]; %初始状态
for i = 1:1:T/dt+1
% 滑模控制量s和加速度accelC
dDisr = -velM*cos(etaM);
tgo = -disr/dDisr;
matA = [0, 1; 0, -2*dDisr/disr];
matBc = [0; -cos(etaM)/disr];
matC = [gaink1/tgo, 1];
s = matC*X - matC(1)*lambdaDesire;
accelC = disr*( dLambda*(-2*dDisr/disr + (gaink1+gaink2)/tgo) +...
gaink1*(gaink2+1)*(lambda-lambdaDesire)/tgo^2 +...
kappa*sat(s)/tgo );
accelC = accelC / cos(etaM);
% 状态方程
dX = matA*X + matBc*accelC;
% 状态递推
X = X + dX*dt;
lambda = X(1);
dLambda = X(2);
accelM = accelC;
dThetaM = accelM / velM;
thetaM = thetaM + dThetaM*dt;
etaM = lambda - thetaM;
%disr = velM*sin(etaM)/dLambda; %不能用这条进行递推
disr = disr -velM*cos(etaM)*dt;
if disr<=0
disr = 0;
% 写入剩下的数
for j = i:1:T/dt+1
xyLog2(:, j) = [disr*cos(lambda); disr*sin(lambda)];
accelLog(2, j) = accelM;
lambdaLog(2, j) = lambda*180/pi;
sLog(2, j) = s;
end
break;
end
% 记录
xyLog2(:, i) = [-disr*cos(lambda); -disr*sin(lambda)];
accelLog(2, i) = accelM;
lambdaLog(2, i) = lambda*180/pi;
sLog(2, i) = s;
end
%% 画图
figure;
plot(xyLog1(1,:), xyLog1(2,:),'linewidth', 1.5);
hold on;
plot(xyLog2(1,:), xyLog2(2,:), 'linewidth', 1.5);
grid on;
title('导弹飞行轨迹图');
xlabel('x(m)');
ylabel('h(m)');
legend('普通', '自适应');
figure;
plot(time, accelLog, 'linewidth', 1.5);
hold on;
grid on;
title('导弹加速度变化图');
xlabel('time(s)');
ylabel('accelM(m/s^2)');
legend('普通', '自适应');
figure;
plot(time, lambdaLog, 'linewidth', 1.5);
hold on;
grid on;
title('视线角变化图');
xlabel('time(s)');
ylabel('lambda(°)');
legend('普通', '自适应');
figure;
plot(time, sLog, 'linewidth', 1.5);
hold on;
grid on;
title('s函数变化图');
xlabel('time(s)');
ylabel('s');
legend('普通', '自适应');
%% 小函数
function y = sat(x)
if x >= 0.1
y = 1;
elseif x <= -0.1
y = -1;
else
y = x/0.1;
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
基于Matlab实现牛顿迭代计算制导和滑模控制制导仿真(源码).rar
共8个文件
m:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 2 下载量 146 浏览量
2023-03-23
09:57:49
上传
评论
收藏 7KB RAR 举报
温馨提示
1、资源内容:基于Matlab实现牛顿迭代计算制导和滑模控制制导仿真(源码).rar 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为“参考资料”参考学习使用。 3、解压说明:本资源需要电脑端使用WinRAR、7zip等解压工具进行解压,没有解压工具的自行百度下载即可。 4、免责声明:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。
资源推荐
资源详情
资源评论
收起资源包目录
基于Matlab实现牛顿迭代计算制导和滑模控制制导仿真(源码).rar (8个子文件)
基于Matlab实现牛顿迭代计算制导和滑模控制制导仿真(源码)
angle
main.m 1KB
NewtonCtrl.m 3KB
slidingModeCtrl_1.m 1KB
slidingModeCtrl_2.m 5KB
Convex
RULER.m 216B
main.m 3KB
Coeff.m 657B
Dynamics.m 388B
共 8 条
- 1
资源评论
- weixin_487808672024-06-22资源不错,很实用,内容全面,介绍详细,很好用,谢谢分享。
- 2301_765382242024-03-01资源值得借鉴的内容很多,那就浅学一下吧,值得下载!
Matlab仿真实验室
- 粉丝: 3w+
- 资源: 2406
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功