function [pltData, stats] = sortdata(data) date = dateshift(data.Time(1),'start','day'); time_hms = data.Time-date; time_s = seconds(time_hms); time_s = time_s - time_s(1); % set beginning of session to 0 % x-Axis: pltData.time_s = time_s; pltData.time_hms = time_hms; % distance calculation speed_mps = movmean(data.FTCU_Driver_FTCU_Speed,50); % TODO: test different speed filters for distance calculation pltData.distance(1) = 0; for i = 2:length(speed_mps) pltData.distance(i) = speed_mps(i)*(time_s(i)-time_s(i-1)) + pltData.distance(i-1); end pltData.distance = pltData.distance.'; pltData.xAxis = pltData.time_s; % set time as default x-Axis for plotting %% Misc pltData.app_percent = data.FTCU_Driver_FTCU_APPS_Percent; pltData.speed_kph = 3.6*movmean(data.FTCU_Driver_FTCU_Speed,50); % same filter as for distance calculation ??? pltData.steering_deg = data.FTCU_Driver_FTCU_Steering_Angle; %% AMS: pltData.ams_soc = data.AMS_Status_SOC; pltData.ams_tmax = data.AMS_Status_Max_cell_temp; pltData.ams_utot = data.Shunt_Voltage1_Shunt_Voltage1; pltData.ams_itot = data.Shunt_Current_Shunt_Current; % calculations: pltData.ams_ptot = pltData.ams_utot.*pltData.ams_itot/1000; %% Brakes % brake pressure pltData.brakePFront_bar = data.FTCU_Driver_FTCU_Brake_Pressure_F; pltData.brakePRear_bar = data.FTCU_Driver_FTCU_Brake_Pressure_R; % brake disc temperatures pltData.brakeTFrontLeft_degC = data.Sensornode_F_10Hz_BDTS_FL; pltData.brakeTFrontRight_degC = data.Sensornode_F_10Hz_BDTS_FR; pltData.brakeTRearLeft_degC = data.Sensornode_R_10Hz_BDTS_RL; pltData.brakeTRearRight_degC = data.Sensornode_R_10Hz_BDTS_RR; % calculate brake bias [%] minBrakeP = 5; % minimum brake pressure to avoid artifacts due to sensor noise near 0 bar brakePFront = pltData.brakePFront_bar; brakePFront(brakePFront < minBrakeP) = minBrakeP; brakePRear = pltData.brakePRear_bar; brakePRear(brakePRear < minBrakeP) = minBrakeP; pltData.brakeBias_perc = 100*brakePFront./brakePRear; % check calculation! %% Cooling system %% Dampers % damper positions pltData.damper_FL_mm = data.Sensornode_F_100Hz_2_DS_FL; %Heave_F pltData.damper_FR_mm = data.Sensornode_F_100Hz_2_DS_FR; %Roll_F pltData.damper_RL_mm = data.Sensornode_R_100Hz_DS_RL; %Heave_R pltData.damper_RR_mm = data.Sensornode_R_100Hz_DS_RR; %Roll_R % calculate damper velocities pltData.velocity_FL_mmps(1) = 0; pltData.velocity_FR_mmps(1) = 0; pltData.velocity_RL_mmps(1) = 0; pltData.velocity_RR_mmps(1) = 0; for i = 2:length(pltData.time_s) timestep = pltData.time_s(i)-pltData.time_s(i-1); pltData.velocity_FL_mmps(i) = pltData.damper_FL_mm(i)-pltData.damper_FL_mm(i-1)/timestep; pltData.velocity_FR_mmps(i) = pltData.damper_FR_mm(i)-pltData.damper_FR_mm(i-1)/timestep; pltData.velocity_RL_mmps(i) = pltData.damper_RL_mm(i)-pltData.damper_RL_mm(i-1)/timestep; pltData.velocity_RR_mmps(i) = pltData.damper_RR_mm(i)-pltData.damper_RR_mm(i-1)/timestep; end % filter damper velocities ??? bessere Berechnung über mittelwert aus mehreren werten? Vorfilterung? pltData.velocity_FL_mmps = movmean(pltData.velocity_FL_mmps,100).'; pltData.velocity_FR_mmps = movmean(pltData.velocity_FR_mmps,100).'; pltData.velocity_RL_mmps = movmean(pltData.velocity_RL_mmps,100).'; pltData.velocity_RR_mmps = movmean(pltData.velocity_RR_mmps,100).'; %% IMU - VN200, no need to implement didnt work well anyway % Acceleration pltData.acc_long_g = movmean(data.XSens_Acceleration_XSens_accX,100)/9.81; pltData.acc_lat_g = movmean(data.XSens_Acceleration_XSens_accY,100)/9.81; % Rate of turn pltData.rot_roll_degps = movmean(data.XSens_rateofturn_XSens_gyrX,100); pltData.rot_pitch_degps = movmean(data.XSens_rateofturn_XSens_gyrY,100); pltData.rot_yaw_degps = movmean(data.XSens_rateofturn_XSens_gyrZ,100); %% Inverters % inverter temperatures pltData.invL_temp = data.INV_1_TxPDO_1_T_Inv_1; % not sure if 1 is left and 2 is right pltData.invR_temp = data.INV_2_TxPDO_1_T_Inv_2; % motor temperatures pltData.motL_temp = data.INV_1_TxPDO_1_T_Mot_1; % not sure if 1 is left and 2 is right pltData.motR_temp = data.INV_2_TxPDO_1_T_Mot_2; % motor velocities pltData.motL_vel_rpm = 60*data.INV_1_TxPDO_4_Velocity_1; % not sure if 1 is left and 2 is right pltData.motR_vel_rpm = 60*data.INV_2_TxPDO_4_Velocity_2; % inverter torque demand pltData.invL_torqueDemand = data.INV_1_TxPDO_3_DemandedTorque_1/10; % /10 to match autobox torque % not sure if 1 is left and 2 is right pltData.invR_torqueDemand = data.INV_2_TxPDO_3_DemandedTorque_2/10; % inverter actual torque pltData.invL_torqueActual = data.INV_1_TxPDO_3_DemandedTorque_1/10; % not sure if 1 is left and 2 is right pltData.invR_torqueActual = data.INV_2_TxPDO_3_DemandedTorque_2/10; %% Wheelspeed %% Statistics: power_regen_kw = pltData.ams_ptot; power_regen_kw(power_regen_kw > 0) = 0; power_used_kw = pltData.ams_ptot; power_used_kw(power_used_kw < 0) = 0; stats.energy_kwh = trapz(time_s, pltData.ams_ptot)/3600; stats.energy_regen_kwh = trapz(time_s, power_regen_kw)/3600; stats.energy_used_kwh = trapz(time_s, power_used_kw)/3600; stats.distanceTotal_km = trapz(time_s, pltData.speed_kph./3.6)/1000; % 1/3.6 for km/h to m/s and /1000 for km output stats.peakPower_kw = max(pltData.ams_ptot); stats.peakPowerMean_kw = max(movmean(pltData.ams_ptot,500)); stats.maxSpeed_kph = max(pltData.speed_kph); % pltData.startTime = time_hms(1); % pltData.stopTime = time_hms(end); %% struct2timetable pltData = table2timetable(struct2table(pltData), "RowTimes", data.Time); end