diff options
-rw-r--r-- | uav.m | 108 | ||||
-rw-r--r-- | uav_model.m | 2 | ||||
-rw-r--r-- | uav_performance.m (renamed from uav_requirements.m) | 4 | ||||
-rw-r--r-- | uav_uncertainty.m | 28 |
4 files changed, 82 insertions, 60 deletions
@@ -12,39 +12,27 @@ fprintf('Generating system parameters...\n') params = uav_params(); ctrl = struct(); +% Flags to speed up running for debugging do_plots = true; +do_lqr = false; % unused +do_hinf = false; % midterm +do_musyn = true; % endterm % ------------------------------------------------------------------------ %% Define performance requirements -fprintf('Generating performance requirements...\n') -perf = uav_requirements(params, do_plots); +if do_hinf | do_musyn + fprintf('Generating performance requirements...\n') + perf = uav_performance(params, do_plots); +end % ------------------------------------------------------------------------ %% Define stability requirements -W_malpha = tf(1,1); -W_momega = tf(1,1); -W_mState = tf(1,1); - -% if do_plots -% figure; hold on; -% -% bodemag(W_malpha); -% bodemag(W_momega); -% bodemag(W_mState); -% -% grid on; -% legend('$W_{m,\alpha}$', '$W_{m,\omega}$', ... -% '$W_{m,\Theta}$', '$W_{m,\Omega}$', ... -% 'Interpreter', 'latex', 'fontSize', 8); -% title('Uncertainties') -% end - -uncert = struct(... - 'FlapAngle', W_malpha * eye(4), ... - 'Thrust', W_momega, ... - 'StateLinApprox', W_mState * eye(12)); +if do_musyn + fprintf('Generating stability requirements...\n') + uncert = uav_uncertainty(params, do_plots); +end % ------------------------------------------------------------------------ %% Create UAV model @@ -55,52 +43,61 @@ model = uav_model(params, perf, uncert); % ------------------------------------------------------------------------ %% Perform LQR design -% fprintf('Performing LQR controller design...\n') -% ctrl.lqr = uav_ctrl_lqr(params, model); +if do_lqr + fprintf('Performing LQR controller design...\n') + ctrl.lqr = uav_ctrl_lqr(params, model); +end % ------------------------------------------------------------------------ %% Perform H-infinity design -fprintf('Performing H-infinty controller design...\n') +if do_hinf + fprintf('Performing H-infinty controller design...\n') -idx = model.uncertain.index; -P = model.uncertain.StateSpace; + idx = model.uncertain.index; + P = model.uncertain.StateSpace; -% Get nominal system without uncertainty (for lower LFT) -P_nom = minreal(P([idx.OutputError; idx.OutputNominal], ... - [idx.InputExogenous; idx.InputNominal])); + % Get nominal system without uncertainty (for lower LFT) + P_nom = minreal(P([idx.OutputError; idx.OutputNominal], ... + [idx.InputExogenous; idx.InputNominal])); -nmeas = max(size(idx.OutputNominal)); % size of y -nctrl = max(size(idx.InputNominal)); % size of u + nmeas = max(size(idx.OutputNominal)); % size of y + nctrl = max(size(idx.InputNominal)); % size of u -hinfopt = hinfsynOptions('Display', 'on', 'Method', 'RIC', ... - 'AutoScale', 'off', 'RelTol', 1e-3); -[K_inf, ~, gamma, info] = hinfsyn(P_nom, nmeas, nctrl, hinfopt); -ctrl.hinf = struct('Name', '$\mathcal{H}_{\infty}$', 'K', K_inf); + hinfopt = hinfsynOptions('Display', 'on', 'Method', 'RIC', ... + 'AutoScale', 'off', 'RelTol', 1e-3); + [K_inf, ~, gamma, info] = hinfsyn(P_nom, nmeas, nctrl, hinfopt); + ctrl.hinf = struct('Name', '$\mathcal{H}_{\infty}$', 'K', K_inf); -if gamma >= 1 - fprintf('Failed to syntesize controller (closed loop is unstable).\n') -end + if gamma >= 1 + fprintf('Failed to syntesize controller (closed loop is unstable).\n') + end % ------------------------------------------------------------------------ -%% Measure Performance +%% Measure Performance of H-infinity design -fprintf('Simulating closed loop...\n'); + fprintf('Simulating closed loop...\n'); -nsamples = 500; -do_noise = true; -% uav_sim_step(params, model, ctrl.lqr, nsamples, do_plots); + nsamples = 500; + do_noise = true; + simout = uav_sim_step_hinf(params, model, ctrl.hinf, nsamples, do_plots, do_noise); -simout = uav_sim_step_hinf(params, model, ctrl.hinf, nsamples, do_plots, do_noise); + fprintf('Writing simulation results...\n'); + cols = [ + simout.StepX(:, simout.index.Position), ... + simout.StepX(:, simout.index.Velocity), ... + simout.StepX(:, simout.index.FlapAngles) * 180 / pi, ... + simout.StepX(:, simout.index.Angles) * 180 / pi]; -fprintf('Writing simulation results...\n'); -cols = [ - simout.StepX(:, simout.index.Position), ... - simout.StepX(:, simout.index.Velocity), ... - simout.StepX(:, simout.index.FlapAngles) * 180 / pi, ... - simout.StepX(:, simout.index.Angles) * 180 / pi]; + writematrix([simout.TimeXY', cols], 'fig/stepsim.dat', 'Delimiter', 'tab') +end + +% ------------------------------------------------------------------------ +%% Perform mu-Analysis & DK iteration -writematrix([simout.TimeXY', cols], 'fig/stepsim.dat', 'Delimiter', 'tab') +if do_musyn + +end % ------------------------------------------------------------------------ %% Verify performance satisfaction via mu-analysis @@ -134,7 +131,4 @@ writematrix([simout.TimeXY', cols], 'fig/stepsim.dat', 'Delimiter', 'tab') % title('$\mu_\Delta(N)$', 'Interpreter', 'latex'); % end -% ------------------------------------------------------------------------ -% Perform mu-Analysis & DK iteration - % vim: ts=2 sw=2 et: diff --git a/uav_model.m b/uav_model.m index 4fddae9..3b691f4 100644 --- a/uav_model.m +++ b/uav_model.m @@ -11,7 +11,7 @@ % * A uncertain linear model built atop of the linear model using SIMULINK. % The uncertain model contains the performance and weighting transfer % function given in the arguments perf and params, and is stored in the -% SIMULINK fil euav_model_uncertain.xls. +% SIMULINK file uav_model_uncertain.xls. % % [MODEL] = UAV_MODEL(PARAMS, PERF, UNCERT) % diff --git a/uav_requirements.m b/uav_performance.m index 9ccaeea..4857a34 100644 --- a/uav_requirements.m +++ b/uav_performance.m @@ -10,10 +10,10 @@ % performance transfer function % % Return value: -% MODEL Struct performance transfer functions +% PERF Struct performance transfer functions -function [perf] = uav_requirements(params, plot) +function [perf] = uav_performance(params, plot) % Laplace variable s = tf('s'); diff --git a/uav_uncertainty.m b/uav_uncertainty.m new file mode 100644 index 0000000..e1ddf76 --- /dev/null +++ b/uav_uncertainty.m @@ -0,0 +1,28 @@ +% Generate transfer functions for loop shaping stability (uncertainty) +% requirements from parameters specified in uav_params.m +% +% Copyright (C) 2024, Naoki Sean Pross, ETH Zürich +% This work is distributed under a permissive license, see LICENSE.txt +% +% Arguments: +% PARAMS Struct of design parameters and constants generated by uav_params +% PLOT When set to 'true' it plots the inverse magnitude of the +% performance transfer function +% +% Return value: +% UNCERT Struct of uncertainty transfer functions + + +function [uncert] = uav_performance(params, plot) + +W_malpha = tf(1,1); +W_momega = tf(1,1); +W_mState = tf(1,1); + +uncert = struct(... + 'FlapAngle', W_malpha * eye(4), ... + 'Thrust', W_momega, ... + 'StateLinApprox', W_mState * eye(12)); + +end +% vim: ts=2 sw=2 et: |