implemented presets til sortdata, seasonal presets still need to be adapted
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								app2.mlapp
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app2.mlapp
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							@ -1,43 +1,44 @@
 | 
			
		||||
function [pltData] = sortdata(data,start,stop)
 | 
			
		||||
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(start:stop)-time_s(start);
 | 
			
		||||
    pltData.time_hms = time_hms(start:stop);
 | 
			
		||||
    pltData.time_s = time_s -time_s(1);
 | 
			
		||||
    pltData.time_hms = time_hms;
 | 
			
		||||
 | 
			
		||||
    % distance calculation
 | 
			
		||||
    speed_mps = movmean(data.ABX_Driver_ABX_Speed(start:stop),50); % TODO: test different speed filters for distance calculation
 | 
			
		||||
    speed_mps = movmean(data.ABX_Driver_ABX_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)*(pltData.time_s(i)-pltData.time_s(i-1)) + pltData.distance(i-1);
 | 
			
		||||
        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.ABX_Driver_ABX_APPS_percent(start:stop);
 | 
			
		||||
    pltData.speed_kph = 3.6*movmean(data.ABX_Driver_ABX_Speed(start:stop),50);  % same filter as for distance calculation ???
 | 
			
		||||
    pltData.steering_deg = data.ABX_Driver_ABX_Steering_Angle(start:stop);
 | 
			
		||||
    pltData.app_percent = data.ABX_Driver_ABX_APPS_percent;
 | 
			
		||||
    pltData.speed_kph = 3.6*movmean(data.ABX_Driver_ABX_Speed,50);  % same filter as for distance calculation ???
 | 
			
		||||
    pltData.steering_deg = data.ABX_Driver_ABX_Steering_Angle;
 | 
			
		||||
 | 
			
		||||
    %% AMS:
 | 
			
		||||
    pltData.ams_soc = data.AMS_Status_SOC(start:stop);
 | 
			
		||||
    pltData.ams_tmax = data.AMS_Status_Max_cell_temp(start:stop);
 | 
			
		||||
    pltData.ams_utot = data.Shunt_Voltage1_Shunt_Voltage1(start:stop);
 | 
			
		||||
    pltData.ams_itot = data.Shunt_Current_Shunt_Current(start:stop);
 | 
			
		||||
    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.ABX_Driver_ABX_BrakeP_F(start:stop);
 | 
			
		||||
    pltData.brakePRear_bar = data.ABX_Driver_ABX_BrakeP_R(start:stop);
 | 
			
		||||
    pltData.brakePFront_bar = data.ABX_Driver_ABX_BrakeP_F;
 | 
			
		||||
    pltData.brakePRear_bar = data.ABX_Driver_ABX_BrakeP_R;
 | 
			
		||||
    % brake disc temperatures
 | 
			
		||||
    pltData.brakeTFrontLeft_degC = data.ABX_BrakeT_ABX_BrakeT_FL(start:stop);
 | 
			
		||||
    pltData.brakeTFrontRight_degC = data.ABX_BrakeT_ABX_BrakeT_FR(start:stop);
 | 
			
		||||
    pltData.brakeTRearLeft_degC = data.ABX_BrakeT_ABX_BrakeT_RL(start:stop);
 | 
			
		||||
    pltData.brakeTRearRight_degC = data.ABX_BrakeT_ABX_BrakeT_RR(start:stop);
 | 
			
		||||
    pltData.brakeTFrontLeft_degC = data.ABX_BrakeT_ABX_BrakeT_FL;
 | 
			
		||||
    pltData.brakeTFrontRight_degC = data.ABX_BrakeT_ABX_BrakeT_FR;
 | 
			
		||||
    pltData.brakeTRearLeft_degC = data.ABX_BrakeT_ABX_BrakeT_RL;
 | 
			
		||||
    pltData.brakeTRearRight_degC = data.ABX_BrakeT_ABX_BrakeT_RR;
 | 
			
		||||
    % calculate brake bias [%]
 | 
			
		||||
    minBrakeP = 5;  % minimum brake pressure to avoid artifacts due to sensor noise near 0 bar
 | 
			
		||||
    brakePFront = pltData.brakePFront_bar;
 | 
			
		||||
@ -50,73 +51,74 @@ function [pltData] = sortdata(data,start,stop)
 | 
			
		||||
 | 
			
		||||
    %% Dampers
 | 
			
		||||
    % damper positions
 | 
			
		||||
    pltData.damperHeaveFront_mm = data.ABX_Dampers_ABX_DamperHeave_F(start:stop);
 | 
			
		||||
    pltData.damperRollFront_mm = data.ABX_Dampers_ABX_DamperRoll_F(start:stop);
 | 
			
		||||
    pltData.damperHeaveRear_mm = data.ABX_Dampers_ABX_DamperHeave_R(start:stop);
 | 
			
		||||
    pltData.damperRollRear_mm = data.ABX_Dampers_ABX_DamperRoll_R(start:stop);
 | 
			
		||||
    pltData.damperHeaveFront_mm = data.ABX_Dampers_ABX_DamperHeave_F;
 | 
			
		||||
    pltData.damperRollFront_mm = data.ABX_Dampers_ABX_DamperRoll_F;
 | 
			
		||||
    pltData.damperHeaveRear_mm = data.ABX_Dampers_ABX_DamperHeave_R;
 | 
			
		||||
    pltData.damperRollRear_mm = data.ABX_Dampers_ABX_DamperRoll_R;
 | 
			
		||||
    % calculate damper velocities
 | 
			
		||||
    pltData.velocityHeaveFront_mmps(1) = 0;
 | 
			
		||||
    pltData.velocityRollFront_mmps(1) = 0;
 | 
			
		||||
    pltData.velocityHeaveRear_mmps(1) = 0;
 | 
			
		||||
    pltData.velocityRollRear_mmps(1) = 0;
 | 
			
		||||
    for i = 2:length(pltData.time_s)
 | 
			
		||||
        timestep = pltData.time_s(i)-pltData.time_s(i-1);
 | 
			
		||||
    for i = 2:length(time_s)
 | 
			
		||||
        timestep = time_s(i)-time_s(i-1);
 | 
			
		||||
        pltData.velocityHeaveFront_mmps(i) = pltData.damperHeaveFront_mm(i)-pltData.damperHeaveFront_mm(i-1)/timestep;
 | 
			
		||||
        pltData.velocityRollFront_mmps(i) = pltData.damperRollFront_mm(i)-pltData.damperRollFront_mm(i-1)/timestep;
 | 
			
		||||
        pltData.velocityHeaveRear_mmps(i) = pltData.damperHeaveRear_mm(i)-pltData.damperHeaveRear_mm(i-1)/timestep;
 | 
			
		||||
        pltData.velocityRollRear_mmps(i) = pltData.damperRollRear_mm(i)-pltData.damperRollRear_mm(i-1)/timestep;
 | 
			
		||||
    end
 | 
			
		||||
    % filter damper velocities ??? bessere Berechnung über mittelwert aus mehreren werten? Vorfilterung?
 | 
			
		||||
    pltData.velocityHeaveFront_mmps = movmean(pltData.velocityHeaveFront_mmps,100);
 | 
			
		||||
    pltData.velocityRollFront_mmps = movmean(pltData.velocityRollFront_mmps,100);
 | 
			
		||||
    pltData.velocityHeaveRear_mmps = movmean(pltData.velocityHeaveRear_mmps,100);
 | 
			
		||||
    pltData.velocityRollRear_mmps = movmean(pltData.velocityRollRear_mmps,100);
 | 
			
		||||
    pltData.velocityHeaveFront_mmps = movmean(pltData.velocityHeaveFront_mmps,100).';
 | 
			
		||||
    pltData.velocityRollFront_mmps = movmean(pltData.velocityRollFront_mmps,100).';
 | 
			
		||||
    pltData.velocityHeaveRear_mmps = movmean(pltData.velocityHeaveRear_mmps,100).';
 | 
			
		||||
    pltData.velocityRollRear_mmps = movmean(pltData.velocityRollRear_mmps,100).';
 | 
			
		||||
 | 
			
		||||
    %% IMU
 | 
			
		||||
    % Acceleration
 | 
			
		||||
    pltData.acc_long_g = movmean(data.XSens_Acceleration_XSens_accX(start:stop),100)/9.81;
 | 
			
		||||
    pltData.acc_lat_g = movmean(data.XSens_Acceleration_XSens_accY(start:stop),100)/9.81;
 | 
			
		||||
    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(start:stop),100);
 | 
			
		||||
    pltData.rot_pitch_degps = movmean(data.XSens_RateOfTurn_XSens_gyrY(start:stop),100);
 | 
			
		||||
    pltData.rot_yaw_degps = movmean(data.XSens_RateOfTurn_XSens_gyrZ(start:stop),100);
 | 
			
		||||
    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_L_TxPDO_1_T_Inv_L(start:stop);
 | 
			
		||||
    pltData.invR_temp = data.INV_R_TxPDO_1_T_Inv_R(start:stop);
 | 
			
		||||
    pltData.invL_temp = data.INV_L_TxPDO_1_T_Inv_L;
 | 
			
		||||
    pltData.invR_temp = data.INV_R_TxPDO_1_T_Inv_R;
 | 
			
		||||
    % motor temperatures
 | 
			
		||||
    pltData.motL_temp = data.INV_L_TxPDO_1_T_Mot_L(start:stop);
 | 
			
		||||
    pltData.motR_temp = data.INV_R_TxPDO_1_T_Mot_R(start:stop);
 | 
			
		||||
    pltData.motL_temp = data.INV_L_TxPDO_1_T_Mot_L;
 | 
			
		||||
    pltData.motR_temp = data.INV_R_TxPDO_1_T_Mot_R;
 | 
			
		||||
    % motor velocities
 | 
			
		||||
    pltData.motL_vel_rpm = 60*data.INV_L_TxPDO_4_Velocity_L(start:stop);
 | 
			
		||||
    pltData.motR_vel_rpm = 60*data.INV_R_TxPDO_4_Velocity_R(start:stop);
 | 
			
		||||
    pltData.motL_vel_rpm = 60*data.INV_L_TxPDO_4_Velocity_L;
 | 
			
		||||
    pltData.motR_vel_rpm = 60*data.INV_R_TxPDO_4_Velocity_R;
 | 
			
		||||
    % inverter torque demand
 | 
			
		||||
    pltData.invL_torqueDemand = data.INV_L_TxPDO_3_DemandedTorque_L(start:stop)/10; % /10 to match autobox torque
 | 
			
		||||
    pltData.invR_torqueDemand = data.INV_R_TxPDO_3_DemandedTorque_R(start:stop)/10;
 | 
			
		||||
    pltData.invL_torqueDemand = data.INV_L_TxPDO_3_DemandedTorque_L/10; % /10 to match autobox torque
 | 
			
		||||
    pltData.invR_torqueDemand = data.INV_R_TxPDO_3_DemandedTorque_R/10;
 | 
			
		||||
    % inverter actual torque
 | 
			
		||||
    pltData.invL_torqueActual = data.INV_L_TxPDO_3_ActualTorque_L(start:stop)/10;
 | 
			
		||||
    pltData.invR_torqueActual = data.INV_R_TxPDO_3_ActualTorque_R(start:stop)/10;
 | 
			
		||||
    pltData.invL_torqueActual = data.INV_L_TxPDO_3_ActualTorque_L/10;
 | 
			
		||||
    pltData.invR_torqueActual = data.INV_R_TxPDO_3_ActualTorque_R/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;
 | 
			
		||||
    pltData.energy_kwh = trapz(pltData.time_s, pltData.ams_ptot)/3600;
 | 
			
		||||
    pltData.energy_regen_kwh = trapz(pltData.time_s, power_regen_kw)/3600;
 | 
			
		||||
    pltData.energy_used_kwh = trapz(pltData.time_s, power_used_kw)/3600;
 | 
			
		||||
    pltData.distanceTotal_km = trapz(pltData.time_s, pltData.speed_kph./3.6)/1000; % 1/3.6 for km/h to m/s and /1000 for km output
 | 
			
		||||
    pltData.peakPower_kw = max(pltData.ams_ptot);
 | 
			
		||||
    pltData.peakPowerMean_kw = max(movmean(pltData.ams_ptot,500));
 | 
			
		||||
    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));
 | 
			
		||||
 | 
			
		||||
    pltData.maxSpeed_kph = max(pltData.speed_kph);
 | 
			
		||||
    pltData.startTime = time_hms(start);
 | 
			
		||||
    pltData.stopTime = time_hms(stop);
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user