论文复现:导弹滑模制导律

1 论文

Ebrahimi B, Bahrami M, Roshanian J. Optimal sliding-mode guidance with terminal velocity constraint for fixed-interval propulsive maneuvers[J]. Acta Astronautica, 2008, 62(10-11): 556-562.

文中类比Zero-Effect-Miss提出Zero-Effect-Velocity

2 程序

主函数

clear;
close all;
global flag tf tb km kv epsilon g
flag=3;
% 1: Optimal guidance law (OGL)
% 2: Optimal fixed interval guidance law (OFIGL), tb=30
% 3: Silde mode fixed interval guidance law (SMGL), tb=30
tf=35; tb=30; km=6; kv=-2; epsilon=60;
g=[0,0,-9.8]';
rt0=[35,50,30]'*1e+3; vt0=[-500,-400,0]';
% rt0=[35,35,30]'*1e+3; vt0=[-500,-500,0]';
rm0=[0,0,0]'; vm0=[0,0,1000]';
state0=[rt0;vt0;rm0;vm0]; % 
tspan=[0,tf];
[tout,stateout]=ode45('re_paper_1_equ',tspan,state0);
zem=stateout(:,1:3)-stateout(:,7:9);
zev=stateout(:,4:6)-stateout(:,10:12);
am=[];
for i=2:size(tout,1)
    am=[am;norm((stateout(i,10:12)-stateout(i-1,10:12))/(tout(i)-tout(i-1)))];
end
am=[am;am(end,:)];
figure
plot3(stateout(:,1),stateout(:,2),stateout(:,3),'r','linewidth',2); hold on;
plot3(stateout(:,7),stateout(:,8),stateout(:,9),'b','linewidth',2); hold off;
grid on; 
switch (flag)
    case 1
        title('Optimal guidance law (OGL)');
    case 2
        title('Optimal fixed interval guidance law (OFIGL)');
    case 3
        title('Silde mode fixed interval guidance law (SMGL)');
end
figure
subplot(1,2,1); plot(tout,zem,'linewidth',2); grid on; legend('x','y','z'); title('ZEM');
subplot(1,2,2); plot(tout,zev,'linewidth',2); grid on; legend('vx','vy','vz'); title('ZEV');
figure
plot(tout,am,'linewidth',2); grid on;

子函数

function out = re_paper_1_equ(t,state)
global g tf km kv flag tb epsilon
tg=tf-t;
rt=state(1:3); vt=state(4:6);
rm=state(7:9); vm=state(10:12);
rmf=rt;
vmf=vt;
% zem=rmf-rm-vm*tg-tf*tg*g+(tf^2-t^2)/2*g;
f=@(x)(tf-x)*g; % integral, F1 for help
zem=rmf-rm-vm*tg-integral(f,t,tf,'arrayvalued',true);
zev=vmf-vm-tg*g;
omega=pi/3;
d=5*g*sin(omega*t); % disturbance or perturbation
dotrt=vt; dotvt=g+d;
dotrm=vm;
% calculate dotvm %
switch (flag)
    case 1 % Optimal guidance law (OGL)
        dotvm=kv/tg*zev+km/tg^2*zem;  % without tbg
    case 2 % Optimal fixed interval guidance law (OFIGL), tb=30
        if t>=tb
            dotvm=g;
        else
            tbg=tb-t;
            dotvm=((kv+km)*tbg-km*tg)/tbg^2*zev+km/tbg^2*zem; % with tbg
        end
    case 3 % Silde mode fixed interval guidance law (SMGL), tb=30
        if t>=tb
            dotvm=g;
        else
            tbg=tb-t; % t=30,tbg=0 ???
            n1=1+kv+km+sqrt((1+kv+km)^2-4*km)/2; % n1 and n2 are both right
            lambda=n1/tbg;
%             n2=1+kv+km-sqrt((1+kv+km)^2-4*km)/2;
%             lambda=n2/tbg;
            s=zem+(1/lambda-tg)*zev;
            dotvm=((kv+km)*tbg-km*tg)*zev/tbg^2 + km*zem/tbg^2 + epsilon/tbg*sign(s); % with tbg
        end
end
out=[dotrt;dotvt;dotrm;dotvm];
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
制导率是指导弹飞行过程中导引系统对目标的精确度,通常用偏差偏角(Miss Distance Angle,MDA)表示。下面是一个简单的制导率实验的Matlab代码示例: ```matlab % 制导率实验 clear all; close all; clc; % 目标位置 x_target = 1000; % 目标距离(m) y_target = 500; % 目标高度(m) % 初始导弹位置 x_missile = 0; % 导弹距离(m) y_missile = 0; % 导弹高度(m) % 每秒更新一次导弹位置和速度 dt = 1; % 时间步长(s) v_missile = 1000; % 导弹速度(m/s) theta = 30; % 初始发射角(度) theta = theta*pi/180; % 角度转弧度 % 导弹制导 Kp = 0.1; % 比例增益 Ki = 0.01; % 积分增益 Kd = 0.01; % 微分增益 e_sum = 0; % 误差积分 e_prev = 0; % 上一时刻误差 while y_missile >= 0 % 计算误差 e = atan2(y_target-y_missile, x_target-x_missile) - theta; if e > pi e = e - 2*pi; elseif e < -pi e = e + 2*pi; end % PID控制 e_sum = e_sum + e*dt; de = (e - e_prev)/dt; theta = theta + Kp*e + Ki*e_sum + Kd*de; e_prev = e; % 更新导弹位置 x_missile = x_missile + v_missile*cos(theta)*dt; y_missile = y_missile + v_missile*sin(theta)*dt; % 绘制导弹轨迹 plot(x_missile, y_missile, 'r.') axis([0 x_target*1.2 0 y_target*1.2]) xlabel('x (m)') ylabel('y (m)') title('Missile Trajectory') grid on drawnow % 等待一段时间再更新 pause(dt) end % 计算制导率 MDA = sqrt((x_target-x_missile)^2 + y_target^2); disp(['Miss Distance Angle = ' num2str(MDA) ' rad']) ``` 在上面的代码中,我们首先定义了目标位置和初始导弹位置。然后,我们设置了每秒更新一次导弹位置和速度的时间步长,并定义了导弹的初始速度和发射角。接着,我们实了一个简单的PID控制器来控制导弹的飞行方向。最后,我们在绘图中绘制了导弹的轨迹,并计算了制导率(即MDA)。在实际使用中,我们可以通过修改PID参数来优化导弹制导性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值