diff --git a/controls/model/Quadcopter_Model_R2016_B.slx b/controls/model/Quadcopter_Model_R2016_B.slx index 5845d44124f35d4a571cc0f9319c8dc54f693804..9ddda3cdbd05db65d455a676fe14b5b871b4b78c 100644 Binary files a/controls/model/Quadcopter_Model_R2016_B.slx and b/controls/model/Quadcopter_Model_R2016_B.slx differ diff --git a/controls/model/modelParameters.m b/controls/model/modelParameters.m index beb6434884bf008200fd53dbb289c4656bc4991d..afe8eb6e624c655a1b3a0336d1b87ce3f92c560d 100644 --- a/controls/model/modelParameters.m +++ b/controls/model/modelParameters.m @@ -1,91 +1,113 @@ -% Add Library Blocks to Path - path = genpath('Library_blocks'); - addpath(path); +% Add Library Blocks and 3D animation to Path + path_1 = genpath('Library_blocks'); + path_2 = genpath('3D_Animation'); + addpath(path_1, path_2); % 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 = 55; + runtime = 40;%max(time); % Model Parameters - m = 1.216; % Quadrotor + battery mass - g = 9.81; % Acceleration of gravity - Jxx = 0.0130; % Quadrotor and battery motor of inertia around bx (pitch) - Jyy = 0.0140; % Quadrotor and battery motor of inertia around by (roll) - 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 = 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 - rhz = 0.03; % Z-axis distance from center of mass to a rotor hub - r_oc = [0; 0; 0]; % Vector from origin to center of mass - Rm = 0.235; % Motor resistance - 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 - Tc = 0.04; % Camera system sampling period - Tq = 0.005; % Quad sampling period - tau_c = 0; % Camera system total latency - 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 ]; + m = 1.216; % Quadrotor + battery mass + g = 9.81; % Acceleration of gravity + Jxx = 0.0110;%0.0130; % Quadrotor and battery motor of inertia around bx (pitch) + Jyy = 0.0116;%0.0140; % Quadrotor and battery motor of inertia around by (roll) + Jzz = 0.0223;%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 + delta_T = [ 0, 0, 9.404e-04 ]; % Thrust constant adjustment factor + 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 + rhz = 0.03; % Z-axis distance from center of mass to a rotor hub + r_oc = [0; 0; 0]; % Vector from origin to center of mass + Rm = 0.235; % Motor resistance + 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 + Tc = 0.01;%0.04; % Camera system sampling period + Tq = 0.005; % Quad sampling period + tau_c = 0; % Camera system total latency + 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 % Define Biquad Filter Parameters - b0 = 0.020083; - b1 = 0.040167; - b2 = 0.020083; - a0 = 1; - a1 = -1.561; - a2 = 0.6414; - SOS_Matrix = [b0, b1, b2, a0, a1, a2]; + accel_Fc = 10; + Fs = 1/Tq; + accel_K = tan(pi * accel_Fc / Fs); + Q = 0.707; + accel_norm = 1.0 / (1.0 + accel_K/Q + accel_K*accel_K); - % Determine Initial Conditions + accel_b0 = accel_K*accel_K*accel_norm; + accel_b1 = 2.0*accel_b0; + accel_b2 = accel_b0; + accel_a0 = 1; + accel_a1 = 2.0*(accel_K*accel_K -1) * accel_norm; + accel_a2 = (1.0 - accel_K/Q + accel_K*accel_K) * accel_norm; - % Equilibrium rotor speeds - omega0_o = sqrt((m*g)/(4*Kt)); - omega1_o = sqrt((m*g)/(4*Kt)); - omega2_o = sqrt((m*g)/(4*Kt)); - omega3_o = sqrt((m*g)/(4*Kt)); + accel_SOS_Matrix = [accel_b0, accel_b1, accel_b2, accel_a0, accel_a1, accel_a2]; - % Equilibrium height controller output - height_controlled_o = (((Rm*If ... - + (((omega0_o * 2 * Rm * Kv * Kq ... - * Kd + 1)^2) - 1)/(4* Rm*Kv^2*Kq ... - * Kd))/Vb)*(Pmax - Pmin) + Pmin); + OF_Fc = 7; + OF_K = tan(pi * OF_Fc / Fs); + + OF_norm = 1.0 / (1.0 + OF_K/Q + OF_K*OF_K); + + OF_b0 = OF_K*OF_K*OF_norm; + OF_b1 = 2.0*OF_b0; + OF_b2 = OF_b0; + OF_a0 = 1; + OF_a1 = 2.0*(OF_K*OF_K -1) * OF_norm; + OF_a2 = (1.0 - OF_K/Q + OF_K * OF_K) * OF_norm; + + OF_SOS_Matrix = [OF_b0, OF_b1, OF_b2, OF_a0, OF_a1, OF_a2]; + + % Determine Initial Conditions - % Equilibrium positions + % Position Initial Conditions x_o = 0; y_o = 0; z_o = 0; - - % Equilibrium velocities + + % Velocity Initial Conditions x_vel_o = 0; y_vel_o = 0; z_vel_o = 0; - % Equilibrium angles + % Euler Angle Initial Conditions roll_o = 0; pitch_o = 0; yaw_o = 0; - % Equilibrium angular rates + % Euler Rate Initial Conditions rollrate_o = 0; pitchrate_o = 0; yawrate_o = 0; + % Equilibrium rotor speeds + omega0_o = sqrt((m*g)/(4*Kt)); + omega1_o = sqrt((m*g)/(4*Kt)); + omega2_o = sqrt((m*g)/(4*Kt)); + omega3_o = sqrt((m*g)/(4*Kt)); + + % Equilibrium height controller output + height_controlled_o = (((Rm*If ... + + (((omega0_o * 2 * Rm * Kv * Kq ... + * Kd + 1)^2) - 1)/(4* Rm*Kv^2*Kq ... + * Kd))/Vb)*(Pmax - Pmin) + Pmin); + if logAnalysisToggle == 1 %%%%%% Commented out section until logging is .txt file based %%%%%% % FNAME @@ -96,10 +118,10 @@ if logAnalysisToggle == 1 % %fname = 'sampleLogFile.txt'; fname = ''; - fpath = ''; + fpath = 'C:\Users\Andy\Documents\School\MicroCART\GitRepo\MicroCART_17-18\controls\model\logFiles\'; if(isempty(fname)) - [fname, fpath] = uigetfile('.txt','Select log file'); + [fname] = uigetfile('.txt','Select log file', fpath); end params.file.name = fname; % file name only @@ -210,10 +232,7 @@ if logAnalysisToggle == 1 raw_gyro_data_arr = ... [ raw_gyro_data_x , raw_gyro_data_y , raw_gyro_data_z ]; raw_gyro_data = timeseries( raw_gyro_data_arr , time ); - - % Create time series object for z command - throttle_command = timeseries(dataStruct.RC_Throttle_Constant.data, time); - + % Pull the measurements from the complimentary filter pitch_measured_IMU = dataStruct.Pitch_trim_add_Sum.data; roll_measured_IMU = dataStruct.Roll_Constant.data; @@ -222,9 +241,9 @@ if logAnalysisToggle == 1 IMU_angle_data = timeseries( IMU_angle_arr, time); % Pull VRPN pitch and roll - pitch_measured_VRPN = dataStruct.VRPN_Pitch_Constant.data; - roll_measured_VRPN = dataStruct.VRPN_Roll_Constant.data; + pitch_measured_VRPN = dataStruct.Pitch_trim_add_Sum.data; + % Define setpoint timeseries x_setpoint_model = timeseries(x_setpoint, time); y_setpoint_model = timeseries(y_setpoint, time);