diff --git a/controls/model/logAnalysis.m b/controls/model/logAnalysis.m index 6433cba477c8487f74f4ac715579d79d5cef6140..ab699fbf2b87a485b3c08b32fab780b2f9637a51 100644 --- a/controls/model/logAnalysis.m +++ b/controls/model/logAnalysis.m @@ -131,7 +131,7 @@ linkaxes([ax1, ax2, ax3, ax4], 'x'); %% Plot z control structure % Plot z controller command -figure(3); ax1 = subplot(2, 1, 1); +figure(3); stairs(time, z_command, '.-'); hold on; grid minor; stairs(time_model_40ms, z_command_model_data, '.-'); hold off; title('Z Command'); @@ -139,21 +139,10 @@ xlabel('Time (s)'); ylabel('Command'); legend('Log', 'Model', 'location', 'northwest'); -% Plot z position -ax2 = subplot(2, 1, 2); -stairs(time, z_pos_raw, '.-'); hold on; grid minor; -stairs(time_model_40ms, z_position_model_data, '.-'); hold off; -title('Z Position'); -xlabel('Time (s)'); -ylabel('Position (m)'); -legend('Log', 'Model', 'location', 'northwest'); - -linkaxes([ax1, ax2], 'x'); - %% Plot yaw control structure % Plot yaw controller output -figure(4); ax1 = subplot(2, 2, 1); +figure(4); ax1 = subplot(2, 1, 1); stairs(time, yawrate_setpoint,'.-'); hold on; grid minor; stairs(time_model_40ms, yawrate_setpoint_model_data, '.-'); hold off; title('Yaw Controller Output'); @@ -162,7 +151,7 @@ ylabel('d\psi/dt (rad/s)'); legend('Log', 'Model', 'location', 'northwest'); % Plot yaw controller command -ax2 = subplot(2, 2, 2); +ax2 = subplot(2, 1, 2); stairs(time, yaw_command, '.-'); hold on; grid minor; stairs(time_model_5ms, yaw_command_model_data, '.-'); hold off; title('Yaw Command'); @@ -170,16 +159,7 @@ xlabel('Time (s)'); ylabel('Command'); legend('Log', 'Model', 'location', 'northwest'); -% Plot yaw position -ax3 = subplot(2, 2, 3); -stairs(time, yaw_angle_raw, '.-'); hold on; grid minor; -stairs(time_model_40ms, yaw_value_model_data, '.-'); hold off; -title('Yaw Position'); -xlabel('Time (s)'); -ylabel('Value (rad)'); -legend('Log', 'Model', 'location', 'northwest'); - -linkaxes([ax1, ax2, ax3], 'x'); +linkaxes([ax1, ax2], 'x'); %% Plot PWM Commands figure(5); ax1 = subplot(2, 2, 1); @@ -241,9 +221,9 @@ linkaxes([ax1, ax2], 'x'); %% Plot VRPN Position -figure(9); ax1 = subplot(3, 1, 1); +figure(10); ax1 = subplot(3, 1, 1); stairs(time, x_pos_raw, '.-'); hold on; grid minor; -%stairs(time_model_40ms, x_position_model_data, '.-'); +stairs(time_model_40ms, x_position_model_data, '.-'); stairs(time, x_setpoint, '.-'); title('X position'); xlabel('Time (s)'); @@ -252,7 +232,7 @@ legend('X position', 'X position model', 'X setpoint'); ax2 = subplot(3, 1, 2); stairs(time, y_pos_raw, '.-'); hold on; grid minor; -%stairs(time_model_40ms, y_position_model_data, '.-'); +stairs(time_model_40ms, y_position_model_data, '.-'); stairs(time, y_setpoint, '.-'); title('Y position'); xlabel('Time (s)'); @@ -262,10 +242,11 @@ legend('Y position', 'Y position model', 'Y setpoint'); ax3 = subplot(3, 1, 3); stairs(time, z_pos_raw, '.-'); hold on; grid minor; stairs(time_model_40ms, z_position_model_data, '.-'); +stairs(time, z_setpoint, '.-'); title('Z position'); xlabel('Time (s)'); ylabel('Z position'); -legend('Z position', 'Z position model', 'Y setpoint'); +legend('Z position', 'Z position model', 'Z setpoint'); linkaxes([ax1, ax2, ax3], 'x'); diff --git a/controls/model/modelParameters.m b/controls/model/modelParameters.m index a2bf10fe3427cc99d218f81d16c12bb12e72c0a1..9a0694366b23315e7dd7c7d36f4e6be5d3c3b01a 100644 --- a/controls/model/modelParameters.m +++ b/controls/model/modelParameters.m @@ -3,14 +3,14 @@ addpath(path); % Log Analysis Toggle - logAnalysisToggle = 1; % 1 for log analysis, 0 for normal operation + logAnalysisToggle = 0; % 1 for log analysis, 0 for normal operation % Physics Verification Toggle physicsVerificationToggle = 1; % Define Simulink Runtime (if logAnalysisToggle is selected, this will be % automatically set based on the log files time) - runtime = 30; + runtime = 55; % Model Parameters m = 1.216; % Quadrotor + battery mass @@ -20,7 +20,7 @@ Jzz = 0.0285; % Quadrotor and battery motor of inertia around bz (yaw) Jreq = 4.2012e-05; % Rotor and motor moment of inertia around axis of rotation Kt = 1.2007e-05; % Rotor thrust constant - Kh = 0; % Rotor in-plane drag constant + Kh = 3.4574e-04; % Rotor in-plane drag constant Kd = 1.4852e-07; % Rotor drag constant rhx = 0.16; % X-axis distance from center of mass to a rotor hub rhy = 0.16; % Y-axis distance from center of mass to a rotor hub @@ -30,17 +30,18 @@ Kq = 96.3422; % Motor torque constant Kv = 96.3422; % Motor back emf constant If = 0.3836; % Motor internal friction current - Pmin = 0; % Minimum zybo output duty cycle command - Pmax = 1; % Maximum zybo output duty cycle command + Pmin = 0; % Minimum zybo output duty cycle command + Pmax = 1; % Maximum zybo output duty cycle command Tc = 0.04; % Camera system sampling period Tq = 0.005; % Quad sampling period tau_c = 0; % Camera system total latency - Vb = 11.4; % Nominal battery voltage (V) + Vb = 12.3; % Nominal battery voltage (V) x_controlled_o = 0; % Equilibrium lateral controller output y_controlled_o = 0; % Equilibrium longitudinal controller output yaw_controlled_o = 0; % Equilibrium yaw controller output Kp_mahony = 0.4; % Proportional term for mahony filter Ki_mahony = 0.001; % Integral term for mahony filter + delta_T = 4 * [ 0, 0, 2.351e-4 ]; % Define Biquad Filter Parameters b0 = 0.020083; @@ -112,7 +113,7 @@ if logAnalysisToggle == 1 time_indices = length(time); runtime = max(time); - + % Determine x position error x_setpoint = dataStruct.X_Setpoint_Constant.data; x_pos_raw = dataStruct.VRPN_X_Constant.data; @@ -156,7 +157,7 @@ if logAnalysisToggle == 1 roll_angle = timeseries(roll_angle_raw, time); % Determine yaw error - yaw_setpoint = zeros(length(time), 1); % NEEDS UPDATED WHEN LOG FILE INCLUDES YAW SETPOINT + yaw_setpoint = dataStruct.Yaw_Setpoint_Constant.data; yaw_angle_raw = dataStruct.Yaw_Constant.data; yaw_error = timeseries(yaw_setpoint - yaw_angle_raw, time); yaw_angle = timeseries(yaw_angle_raw, time); @@ -224,38 +225,10 @@ if logAnalysisToggle == 1 pitch_measured_VRPN = dataStruct.VRPN_Pitch_Constant.data; roll_measured_VRPN = dataStruct.VRPN_Roll_Constant.data; -% % Set height_controlled_o to initial throttle command -% height_controlled_o = dataStruct.RC_Throttle_Constant.data(1); -% -% % Set rotor speed initial conditions to there calculated values based on -% % initial throttle control -% omega0_o = (sqrt(((height_controlled_o ... -% - Pmin)/(Pmax - Pmin)* Vb - Rm * If) * 4 * ... -% Rm * Kv^2 * Kq * Kd + 1) - 1) / (2 * Rm * ... -% Kv * Kq * Kd); -% omega1_o = omega0_o; -% omega2_o = omega0_o; -% omega3_o = omega0_o; -% -% % Set initial positions -% x_o = x_position(1); -% y_o = y_position(1); -% z_o = z_position(1); -% -% % Set initial velocities -% x_vel_o = (x_position(1) - x_position(2))/(time(1) - time(2)); -% y_vel_o = (y_position(1) - y_position(2))/(time(1) - time(2)); -% z_vel_o = (z_position(1) - z_position(2))/(time(1) - time(2)); -% -% % Equilibrium angles -% roll_o = roll_measured_VRPN(1); -% pitch_o = pitch_measured_VRPN(1); -% yaw_o = 0; -% -% % Equilibrium angular rates -% rollrate_o = (roll_measured_VRPN(1) - roll_measured_VRPN(2))/(time(1) - time(2)); -% pitchrate_o = (pitch_measured_VRPN(1) - pitch_measured_VRPN(2))/(time(1) - time(2)); -% yawrate_o = 0; + % Define setpoint timeseries + x_setpoint_model = timeseries(x_setpoint, time); + y_setpoint_model = timeseries(y_setpoint, time); + z_setpoint_model = timeseries(z_setpoint, time); end @@ -308,15 +281,15 @@ for i = 1:4 % rotor thrust constants K_T{i} = 1.2007e-05; % rotor H-force coefficeint - K_H{i} = 0; + K_H{i} = 3.4574e-04; % rotor drag constant K_d{i} = 1.4852e-07; % rotor b_z axis velocity thrust adjustment factor - Delta_T{i} = 0; + Delta_T{i} = 0.5*[ 0 0 2.351e-4 ]; % equivalent rotor + motor moment of inertia J_r{i} = 4.2012e-05; % h-force xy-plane selection matrix - Gamma_H{i} = [ 0 0 0 ; 0 0 0 ; 0 0 0 ]; + Gamma_H{i} = [ 1 0 0 ; 0 1 0 ; 0 0 0 ]; end @@ -380,6 +353,6 @@ d_V = 0; % DISTURBANCE PARAMETERS -F_D = 0; -Q_D = 0; +F_D = 1*randn(3,1); +Q_D = 0.05*randn(3,1); end \ No newline at end of file diff --git a/controls/model/test_model.slx b/controls/model/test_model.slx index dd12b5cc5903054e32c16d022fa90f62cff22876..35a8b396d018cd92f55e5327af5b488dbafddcaf 100644 Binary files a/controls/model/test_model.slx and b/controls/model/test_model.slx differ