%% plot(Time, Cam_Meas_Roll*(180/pi)); hold on; plot(Time, Quad_Meas_Roll*(180/pi)); %% plot(Time, pitch_velocity*(180/pi)); hold on; plot(Time, roll_velocity*(180/pi)); plot(Time, yaw_velocity*(180/pi)); %% figure; plot(expData.Time.data, expData.VRPN_Pitch_Constant.data*(180/pi)); hold on; plot(expData.Time.data, expData.Pitch_trim_add_Sum.data*(180/pi) + 2.2); legend('Camera Pitch', 'Quad Pitch'); xlabel('seconds'); ylabel('degrees'); %% figure; plot(time, (VRPNRollConstant + pi)*(180/pi)); hold on; plot(time, RollConstant*(180/pi)); legend('Camera Roll', 'Quad Roll'); xlabel('seconds'); ylabel('degrees'); %% %plot(Time, X_setpoint); hold on; markerSize = 3; ax1 = subplot(2,1,1); plot(time, (XSetpointConstant - VRPNXConstant), '-o', 'MarkerSize', markerSize); hold on; plot(time, -XposPIDCorrection * (180/pi), '-o', 'MarkerSize', markerSize); hold off; legend('X Error', 'X PID output'); ax2 = subplot(2,1,2); plot(time, (180/pi)*PitchConstant, '-o', 'MarkerSize', markerSize); hold on; plot(time, (180/pi)*PitchPIDCorrection, '-o', 'MarkerSize', markerSize); legend('Pitch Error', 'Pitch PID output'); linkaxes([ax1, ax2], 'x'); %% ax2 = subplot(2,2,1); plot(expData.Time.data, expData.X_Setpoint_Constant.data - expData.VRPN_X_Constant.data); title('X error'); ylabel('meters'); xlabel('time (s)'); ax1 = subplot(2,2,2); plot(expData.Time.data, expData.X_pos_PID_Correction.data); title('x controller output'); ylabel('rad'); xlabel('time (s)'); ax3 = subplot(2,2,3); plot(expData.Time.data, expData.Pitch_PID_Correction.data); hold on; %plot(expData.Time.data, expData.VRPN_Pitch_Constant.data .* 10); title('pitch output'); ylabel('rad/s'); %legend('output', 'Pitch x10'); xlabel('time (s)'); ax4 = subplot(2,2,4); plot(expData.Time.data, expData.Pitch_Rate_PID_Correction.data); hold on; %plot(expData.Time.data, expData.gyro_y.data * 0.1); %legend('output', 'Pitch rate x100000'); ylabel('Normalized PWM'); title('pitch rate output'); xlabel('time (s)'); linkaxes([ax1, ax2, ax3, ax4], 'x'); %% X pos controller flow figure; ax2 = subplot(2,2,1); plot(expData.Time.data, expData.X_Setpoint_Constant.data - expData.OF_Integrate_X_Integrated.data); title('X error'); ax1 = subplot(2,2,2); plot(expData.Time.data, expData.X_pos_PID_Correction.data); title('x output'); ax3 = subplot(2,2,3); plot(expData.Time.data, expData.Pitch_PID_Correction.data); hold on; plot(expData.Time.data, expData.VRPN_Pitch_Constant.data .* 10); title('pitch output'); legend('output', 'Pitch x10'); ax4 = subplot(2,2,4); plot(expData.Time.data, expData.Pitch_Rate_PID_Correction.data); hold on; plot(expData.Time.data, expData.gyro_y.data); legend('output', 'Pitch rate'); title('pitch rate output'); linkaxes([ax1, ax2, ax3, ax4], 'x'); %% plot(time, 1044.26 .* (PitchPIDCorrection - gyro_y));hold on; %plot(time, PitchRatePIDCorrection); %% ax2 = subplot(2, 1, 1); plot(time, YawConstant); ax1 = subplot(2, 1, 2); plot(time, gyro_z); hold on; plot(time, YawRatePIDCorrection); linkaxes([ax1, ax2], 'x'); %% all_motors = expData.Signal_Mixer_MOTOR_0.data + expData.Signal_Mixer_MOTOR_1.data + ... expData.Signal_Mixer_MOTOR_2.data + expData.Signal_Mixer_MOTOR_3.data; ax1 = subplot(1, 2, 1); plot(expData.Time.data, all_motors ./ 4); hold on; %plot(expData.Time.data, expData.RC_Throttle_Constant.data); hold on; plot(expData.Time.data, expData.Pitch_Rate_PID_Correction.data); hold on; plot(expData.Time.data, expData.Roll_Rate_PID_Correction.data); hold on; plot(expData.Time.data, expData.Yaw_Rate_PID_Correction.data); legend('average motors', 'throttle', 'pitch', 'roll', 'yaw'); ax2 = subplot(1, 2, 2); plot(expData.Time.data, -expData.VRPN_Alt_Constant.data); legend('Z, meters'); linkaxes([ax1, ax2], 'x'); %% ax1 = subplot(1, 2, 1); %plot(expData.Time.data, expData.Pitch_Constant.data .* (180 / pi)); hold on; grid minor plot(expData.Time.data, expData.VRPN_Pitch_Constant.data .* (180 / pi)); legend('imu', 'vrpn'); ax2 = subplot(1, 2, 2); %plot(expData.Time.data, expData.Roll_Constant.data .* (180 / pi)); hold on; grid minor plot(expData.Time.data, expData.VRPN_Roll_Constant.data .* (180 / pi)); legend('imu', 'vrpn'); linkaxes([ax1, ax2], 'x'); %% ax1 = subplot(3, 1, 1); plot(expData.Time.data, expData.accel_x.data); ax2 = subplot(3, 1, 2); plot(expData.Time.data, expData.accel_y.data); ax3 = subplot(3, 1, 3); plot(expData.Time.data, expData.accel_z.data); linkaxes([ax1, ax2, ax3], 'x'); %% ax1 = subplot(3, 1, 1); plot(expData.Time.data, expData.gyro_x.data); ax2 = subplot(3, 1, 2); plot(expData.Time.data, expData.gyro_y.data); ax3 = subplot(3, 1, 3); plot(expData.Time.data, expData.gyro_z.data); linkaxes([ax1, ax2, ax3], 'x'); %% figure; ax2 = subplot(2,2,1); raw_derivative = -diff(expData.VRPN_X_Constant.data) / 0.04; plot(expData.Time.data, expData.X_Vel_Correction.data - (expData.RC_Pitch_Constant.data * 5)); hold on; %plot(expData.Time.data, expData.X_Vel_Correction.data); hold on; %plot(expData.Time.data, [0; raw_derivative]); title('X velocity error'); ax1 = subplot(2,2,2); plot(expData.Time.data, expData.X_Vel_PID_Correction.data); title('x vel output'); ax3 = subplot(2,2,3); plot(expData.Time.data, expData.Pitch_PID_Correction.data); hold on; plot(expData.Time.data, expData.VRPN_Pitch_Constant.data .* 10); title('pitch output'); legend('output', 'Pitch x10'); ax4 = subplot(2,2,4); plot(expData.Time.data, expData.Pitch_Rate_PID_Correction.data); hold on; plot(expData.Time.data, expData.gyro_y.data .* 100000); legend('output', 'Pitch rate x100000'); title('pitch rate output'); linkaxes([ax1, ax2, ax3, ax4], 'x'); %% vel flow figure; ax2 = subplot(2,2,1); plot(expData.Time.data, expData.OF_Offset_Angle_Rotated_X.data); hold on; %plot(expData.Time.data, expData.OF_Offset_Angle_Rotated_X.data); hold on; %plot(expData.Time.data, expData.X_Vel_Correction.data); hold on; %plot(expData.Time.data, [0; raw_derivative]); title('X velocity error'); ax1 = subplot(2,2,2); plot(expData.Time.data, expData.X_Vel_PID_Correction.data); title('x vel output'); ax3 = subplot(2,2,3); plot(expData.Time.data, expData.Pitch_PID_Correction.data); hold on; plot(expData.Time.data, expData.Pitch_trim_add_Sum.data .* 10); title('pitch output'); legend('output', 'Pitch x10'); ax4 = subplot(2,2,4); plot(expData.Time.data, expData.Pitch_Rate_PID_Correction.data); hold on; plot(expData.Time.data, expData.gyro_y.data .* 100000); legend('output', 'Pitch rate x100000'); title('pitch rate output'); linkaxes([ax1, ax2, ax3, ax4], 'x'); %% figure; ax1 = subplot(2, 1, 1); plot(expData.Time.data, expData.Alt_Setpoint_Constant.data - expData.VRPN_Alt_Constant.data); hold on; plot(expData.Time.data, expData.Alt_Setpoint_Constant.data); hold on; plot(expData.Time.data, expData.VRPN_Alt_Constant.data); legend('z error', 'z setpoint', 'z position'); xlabel('time (s)'); ylabel('meters'); ax2 = subplot(2, 1, 2); plot(expData.Time.data, expData.Altitude_PID_Correction.data); linkaxes([ax1, ax2], 'x'); legend('z PID output'); xlabel('time (s)'); ylabel('1e-8 seconds'); %% ax1 = subplot(3, 1, 1); plot(expData.Time.data, expData.X_Setpoint_Constant.data - expData.VRPN_X_Constant.data); title('X error'); ax2 = subplot(3, 1, 2); plot(expData.Time.data, expData.Y_Setpoint_Constant.data - expData.VRPN_Y_Constant.data); title('Y error'); ax3 = subplot(3, 1, 3); plot(expData.Time.data, expData.Alt_Setpoint_Constant.data - expData.VRPN_Alt_Constant.data); title('Z error'); linkaxes([ax1, ax2, ax3], 'x'); %% %ax1 = subplot(2, 1, 1); figure; plot(expData.Time.data, expData.Lidar_Constant.data); hold on; plot(expData.Time.data, expData.VRPN_Alt_Constant.data); %angle = sqrt(expData.Roll_Constant.data.^2 + expData.VRPN_Pitch_Constant.data.^2); %corrected = expData.Lidar_Constant.data .* cos(angle); %plot(expData.Time.data, corrected); legend('lidar', 'vrpn'); %linkaxes([ax1, ax2], 'x'); %% Sonar filtered_sonar = []; last_sonar = expData.Flow_Distance_Constant.data(1); for i = [1 : length(expData.Flow_Distance_Constant.data)] this_sonar = expData.Flow_Distance_Constant.data(i); if (abs(this_sonar - last_sonar) < 0.4) filtered_sonar(i) = this_sonar; last_sonar = this_sonar; else filtered_sonar(i) = last_sonar; end end alt_offset = -0.04; plot(expData.Time.data, -expData.Flow_Distance_Constant.data + alt_offset); hold on; plot(expData.Time.data, expData.VRPN_Alt_Constant.data); plot(expData.Time.data, -filtered_sonar + alt_offset); legend('sonar', 'vrpn', 'dumb filter'); %% THE ONE figure; % offsetX = -expData.OF_Integrate_X_Integrated.data(1) - expData.VRPN_X_Constant.data(1); % offsetY = -expData.OF_Integrate_Y_Integrated.data(1) - expData.VRPN_Y_Constant.data(1); offsetX = 0; offsetY = 0; ax1 = subplot(4, 1, 1); plot(expData.Time.data, expData.OF_Integrate_X_Integrated.data - offsetX); hold on; grid minor plot(expData.Time.data, expData.VRPN_X_Constant.data); plot(expData.Time.data, expData.X_Setpoint_Constant.data); legend('OF X Position', 'VRPN X Position', 'X setpoint'); xlabel('Time (s)'); ylabel('Displacement (m)'); hold off; ax2 = subplot(4, 1, 2); plot(expData.Time.data, expData.OF_Integrate_Y_Integrated.data - offsetY); hold on; grid minor plot(expData.Time.data, expData.VRPN_Y_Constant.data); plot(expData.Time.data, expData.Y_Setpoint_Constant.data); legend('OF Y Position', 'VRPN Y Position', 'Y setpoint'); xlabel('Time (s)'); ylabel('Displacement (m)'); hold off; ax3 = subplot(4, 1, 3); plot(expData.Time.data, expData.Lidar_Constant.data); hold on; grid minor plot(expData.Time.data, expData.VRPN_Alt_Constant.data); plot(expData.Time.data, expData.Alt_Setpoint_Constant.data); legend('Lidar Z Position', 'VRPN Z Position', 'Z setpoint'); xlabel('Time (s)'); ylabel('Displacement (m)'); hold off; ax4 = subplot(4, 1, 4); plot(expData.Time.data, expData.Flow_Quality_Constant.data); title('Flow Quality'); linkaxes([ax1, ax2, ax3, ax4], 'x'); %% Error Graphs figure; ax1 = subplot(2,1,1); plot(expData.Time.data, expData.X_Setpoint_Constant.data - expData.OF_Integrate_X_Integrated.data); title('X error'); ax2 = subplot(2,1,2); plot(expData.Time.data, expData.Y_Setpoint_Constant.data - expData.OF_Integrate_Y_Integrated.data); title('Y error'); %% Integarted gyro0.55 yaw figure; gyro_yaw = 0.005 * cumtrapz(expData.gyro_z.data + 0.0073); plot(expData.Time.data, (180/pi) * gyro_yaw); hold on; plot(expData.Time.data, expData.Yaw_Constant.data * 180/pi); hold on; legend('Integrated gyro z', 'actual yaw'); ylabel('Yaw (degrees)'); xlabel('Time (s)'); %% figure; angleOffset = 0.62204 + gyro_yaw; FlowVelX = expData.Flow_Vel_X_Constant.data.*cos(angleOffset) - expData.Flow_Vel_Y_Constant.data.*sin(angleOffset); FlowVelY = expData.Flow_Vel_X_Constant.data.*sin(angleOffset) + expData.Flow_Vel_Y_Constant.data.*cos(angleOffset); fc = 10; FlowVelX = BiquadFilter(FlowVelX, 200, fc); FlowVelY = BiquadFilter(FlowVelY, 200, fc); flowX = zeros(1, length(expData.Time.data)); driftX = 0; driftY = 0; flowX(1) = expData.VRPN_X_Constant.data(1); for n = 2:length(flowX) flowX(n) = flowX(n-1) + 0.005*(FlowVelX(n) - driftX); end flowY = zeros(1, length(expData.Time.data)); flowY(1) = expData.VRPN_Y_Constant.data(1); for n = 2:length(flowY) flowY(n) = flowY(n-1) + 0.005*(FlowVelY(n) - driftY); end ax1 = subplot(2, 1, 1); plot(expData.Time.data, flowX); hold on; plot(expData.Time.data, expData.VRPN_X_Constant.data); %legend('OF Integrated X Position'); legend('OF Integrated X', 'VRPN X'); %legend('OF Integrated X Position', 'Approximate Max X Position (measured with tape measure)'); xlabel('Time (s)'); ylabel('Position (m)'); hold off; ax2 = subplot(2, 1, 2); plot(expData.Time.data, flowY); hold on; plot(expData.Time.data, expData.VRPN_Y_Constant.data); %legend('OF Integrated Y Position'); legend('OF Integrated Y', 'VRPN Y'); %legend('OF Integrated Y Position', 'Approximate Max Y Position (measured with tape measure)'); xlabel('Time (s)'); ylabel('Position (m)'); hold off; linkaxes([ax1 ax2]); %% figure; ax1 = subplot(2, 1, 1); plot(expData.Time.data, expData.Flow_Quality_Constant.data); ax2 = subplot(2, 1, 2); plot(expData.Time.data, expData.Lidar_Constant.data); hold on; plot(expData.Time.data, expData.VRPN_Alt_Constant.data); linkaxes([ax1 ax2], 'x'); %% figure; ax1 = subplot(3, 1, 1); plot(expData.Time.data, expData.mag_x.data); ax2 = subplot(3, 1, 2); plot(expData.Time.data, expData.mag_y.data); ax3 = subplot(3, 1, 3); plot(expData.Time.data, expData.mag_z.data); linkaxes([ax1 ax2 ax3], 'x'); %% figure; filtX = BiquadFilter(expData.mag_x.data+33.9844, 200, 1); filtY = BiquadFilter(expData.mag_y.data-40.4922, 200, 1); magYaw = atan2(-filtY, -filtX); gyroYaw = cumtrapz(expData.gyro_z.data - 0.008) * 0.005; ax1 = subplot(3, 1, 1); plot(expData.Time.data, magYaw*180/pi); ax2 = subplot(3, 1, 2); plot(expData.Time.data, gyroYaw*180/pi); ax3 = subplot(3, 1, 3); plot(expData.Time.data, expData.Mag_Yaw_Constant.data*180/pi); linkaxes([ax1 ax2 ax3], 'x'); %% mag = expData.mag_z.data; count = 0; for n = 2:length(mag) if mag(n) == mag(n-1) count = count + 1; if count >= 10 disp(['Stall detected at index ' num2str(n)]); end else count = 0; end end