updated motor consumption with a more realistic model, based on potential energy
This commit is contained in:
parent
1b39d85cb5
commit
a14d37582c
2886
simulator/package-lock.json
generated
2886
simulator/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -7,23 +7,24 @@ namespace Simulator {
|
||||
solarPanelEfficiency: number = 0.15;
|
||||
solarPanelArea: number = 1.0; // in square meters
|
||||
|
||||
emptyVehicleWeight: number = 80; // kg
|
||||
driverWeight: number = 60; // kg
|
||||
additionalWeight: number; // additional weight, not counting cyclist and empty vehicle weight, in kg
|
||||
|
||||
motorConsumption(distance: number, ascendingElevation: number): number {
|
||||
const g = 9.8;
|
||||
let totalWeight = this.emptyVehicleWeight + this.driverWeight + this.additionalWeight;
|
||||
let potentialEnergy = totalWeight * g * ascendingElevation; // Ep = m*g*h (result in Joules)
|
||||
potentialEnergy = potentialEnergy / 3600; // convert joules to watt-hour
|
||||
|
||||
// empirical measures
|
||||
let maxWeight = 200; // in kg
|
||||
let maxWeightAdditionalConsumption = 4; // in Wh/km
|
||||
let maxTestedElevation = 500; // in meters
|
||||
let maxTestedElevationConsumption = 7; // in Wh/m
|
||||
let baseConsumption = 14; // in Wh/km
|
||||
let baseConsumption = 13; // in Wh/km
|
||||
let maxWeight = 300; // in kg
|
||||
let additionalConsumptionAtMaxWeight = 5; // in Wh/km (without accounting for ascending elevation, only accelerations and additional friction)
|
||||
|
||||
let weightRelatedConsumption = MathUtils.clamp(this.additionalWeight * maxWeightAdditionalConsumption / maxWeight, 0, maxWeightAdditionalConsumption);
|
||||
let weightRelatedConsumption = MathUtils.clamp(totalWeight * additionalConsumptionAtMaxWeight / maxWeight, 0, additionalConsumptionAtMaxWeight);
|
||||
|
||||
// TODO: should not be multiplied by distance
|
||||
// TODO: should be multiplied by total vehicle weight
|
||||
let elevationRelatedConsumption = MathUtils.clamp(ascendingElevation * maxTestedElevationConsumption / maxTestedElevation, 0, maxTestedElevationConsumption);
|
||||
|
||||
return distance * (baseConsumption + weightRelatedConsumption + elevationRelatedConsumption)
|
||||
return distance * (baseConsumption + weightRelatedConsumption) + potentialEnergy;
|
||||
}
|
||||
|
||||
solarPower(irradiance: number): number {
|
||||
@ -55,7 +56,7 @@ namespace Simulator {
|
||||
}
|
||||
|
||||
outing.distance = dailyRatio * this.dailyDistance;
|
||||
outing.ascendingElevation = this.dailyAscendingElevation;
|
||||
outing.ascendingElevation = dailyRatio * this.dailyAscendingElevation;
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,7 +93,7 @@ namespace Simulator {
|
||||
|
||||
planning.getOuting(day % 7, hour, outing);
|
||||
|
||||
let consumption = vehicle.motorConsumption(outing.distance, outing.ascendingElevation);
|
||||
let consumption = outing.distance > 0 ? vehicle.motorConsumption(outing.distance, outing.ascendingElevation) : 0;
|
||||
let production = vehicle.solarPower(solarIrradiance[hourIdx]) * 1.0; // produced energy in Wh is equal to power (W) multiplied by time (h)
|
||||
|
||||
result.totalProducedSolarEnergy += production;
|
||||
|
Loading…
Reference in New Issue
Block a user