% Generate transfer functions for loop shaping performance 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: % PERF Struct performance transfer functions function [perf] = uav_performance_musyn(params, do_plots) % Laplace variable s = tf('s'); % Bandwitdhs bw_alpha = params.actuators.ServoNominalAngularVelocity; bw_omega = 10; bw_xy = .05; bw_z = .05; bw_xydot = .5; bw_zdot = .1; bw_phitheta = .1; bw_psi = .08; % Inverse performance functions W_Palpha = .2 / (s / bw_alpha + 1); W_Pomega = .2 / (s / bw_omega + 1); W_Pxy = 8 * bw_xy^2 / (s^2 + 2 * 1 * bw_xy * s + bw_xy^2); W_Pz = 1 * bw_z^2 / (s^2 + 2 * 1 * bw_z * s + bw_z^2); W_Pxydot = .2 / (s / bw_xydot + 1); W_Pzdot = .5 / (s / bw_zdot + 1); W_Pphitheta = 1 / (s / bw_phitheta + 1); W_Ppsi = .1 / (s / bw_psi + 1); % Construct performance vector by combining xy and z W_PP = blkdiag(W_Pxy * eye(2), W_Pz); W_PPdot = blkdiag(W_Pxydot * eye(2), W_Pzdot); W_PTheta = blkdiag(W_Pphitheta * eye(2), W_Ppsi); perf = struct(... 'FlapAngle', W_Palpha * eye(4), ... 'Thrust', W_Pomega, ... 'Position', W_PP, ... 'Velocity', W_PPdot, ... 'Angles', W_PTheta); if do_plots % Bode plots of performance requirements figure; hold on; bodemag(W_Palpha); bodemag(W_Pomega); bodemag(W_Pxy); bodemag(W_Pz); bodemag(W_Pxydot); bodemag(W_Pzdot); bodemag(W_Pphitheta); bodemag(W_Ppsi); grid on; legend('$W_{P,\alpha}$', '$W_{P,\omega}$', ... '$W_{P,xy}$', '$W_{P,z}$', ... '$W_{P,\dot{x}\dot{y}}$', '$W_{P,\dot{z}}$', ... '$W_{P,\phi\theta}$', '$W_{P,\psi}$', ... 'interpreter', 'latex', 'fontSize', 8); title('Performance Requirements'); % Step response of position requirements figure; hold on; step(W_Palpha); step(W_Pomega); step(W_Pxy); step(W_Pz); step(W_Pxydot); step(W_Pzdot); step(W_Pphitheta); step(W_Ppsi); grid on; legend('$W_{P,\alpha}$', '$W_{P,\omega}$', ... '$W_{P,xy}$', '$W_{P,z}$', ... '$W_{P,\dot{x}\dot{y}}$', '$W_{P,\dot{z}}$', ... '$W_{P,\phi\theta}$', '$W_{P,\psi}$', ... 'interpreter', 'latex', 'fontSize', 8); title('Step responses of performance requirements'); end end % vim: ts=2 sw=2 et: