diff --git a/controls/DataAnalysisTool/Tool/simplePlots.m b/controls/DataAnalysisTool/Tool/simplePlots.m index 2e9e261cd7d67182e2a4d1a96d71c40fcd56b065..c4e5497f18cc3d64bd6ad9fc487fc4f29a8719d6 100644 --- a/controls/DataAnalysisTool/Tool/simplePlots.m +++ b/controls/DataAnalysisTool/Tool/simplePlots.m @@ -221,9 +221,15 @@ ax1 = subplot(2, 1, 1); plot(expData.Time.data, expData.Lidar_Constant.data); hold on; plot(expData.Time.data, expData.VRPN_Alt_Constant.data); legend('lidar', 'vrpn'); +title('Z axis'); +ylabel('meters'); +xlabel('time (s)'); ax2 = subplot(2, 1, 2); plot(expData.Time.data, expData.Altitude_PID_Correction.data); +title('Altitude PID Correction'); +ylabel('PWM values'); +xlabel('time (s)'); linkaxes([ax1, ax2], 'x'); %% @@ -246,3 +252,57 @@ hold off; linkaxes([ax1, ax2]); +%% Remove sonar outliers +sonar = expData.Flow_Distance_Constant.data; +filtered_sonar = zeros(length(sonar), 1); +last_sonar = sonar(1); +for i = 1:length(sonar) + this_sonar = sonar(i); + if abs(this_sonar - last_sonar) < 0.3 + filtered_sonar(i) = this_sonar; + last_sonar = this_sonar; + else + filtered_sonar(i) = last_sonar; + end +end +plot(expData.Time.data, sonar); hold on; +plot(expData.Time.data, filtered_sonar); +%% Better sonar outlier removal +sonar = expData.Flow_Distance_Constant.data; +running_med = ApproxMedFilt(sonar, 0.001); +filtered_sonar = zeros(size(sonar)); +for i = 1:length(sonar) + if abs(sonar(i) - running_med(i)) < 0.15 + filtered_sonar(i) = sonar(i); + else + filtered_sonar(i) = filtered_sonar(i-1); + end +end +plot(expData.Time.data, sonar); hold on; +%plot(expData.Time.data, running_med); +plot(expData.Time.data, filtered_sonar); +legend('Raw', 'Median thresholded'); +%% complementary filter of accelerometer and sonar +alpha = 0.9975; +dt = 0.005; +fc = 15; + +% Remove bias and scale to m/s +z_acceleration = BiquadFilter(-9.8 * (expData.accel_z.data + 0.9968), 200, fc); + +sonar_comp = zeros(size(sonar)); +sonar_vel = zeros(size(sonar)); +sonar_vel(1) = 0; +sonar_comp(1) = filtered_sonar(1); +for n = [2:length(sonar)] + sonar_vel(n) = alpha * (sonar_vel(n-1) + z_acceleration(n)*dt) + (1 - alpha) * (filtered_sonar(n) - filtered_sonar(n-1)) / dt; + sonar_comp(n) = alpha * (sonar_comp(n-1) + sonar_vel(n)*dt) + (1 - alpha) * (filtered_sonar(n)); +end + +figure; +plot(expData.Time.data, sonar_comp); hold on; +plot(expData.Time.data, -expData.VRPN_Alt_Constant.data - 0.025); +title('Massively filtered sonar vs. VRPN'); +legend('Filtered sonar', 'VRPN'); +ylabel('height (m)'); +xlabel('time (s)');