From c978835eae259978b282ab5de47cc30caf3c2f5e Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Mon, 13 Jul 2020 18:05:06 +0200 Subject: [PATCH] driver strategy: handle the case engine is off during first accelerate action (overspeed), hybrid strategy: try to stay in the same gear if no best solution is found --- .../VectoCommon/Models/OperatingPoint.cs | 12 ++++++++++ .../Impl/DefaultDriverStrategy.cs | 4 ++++ .../Models/SimulationComponent/Impl/Driver.cs | 23 ++++++++++--------- .../Strategies/HybridStrategy.cs | 16 ++++++++----- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/VectoCommon/VectoCommon/Models/OperatingPoint.cs b/VectoCommon/VectoCommon/Models/OperatingPoint.cs index 639ce72bbf..ddcd47f3e6 100644 --- a/VectoCommon/VectoCommon/Models/OperatingPoint.cs +++ b/VectoCommon/VectoCommon/Models/OperatingPoint.cs @@ -40,6 +40,18 @@ namespace TUGraz.VectoCommon.Models public MeterPerSquareSecond Acceleration; public Meter SimulationDistance; public Second SimulationInterval; + + + public OperatingPoint(OperatingPoint operatingPoint) + { + Acceleration = operatingPoint.Acceleration; + SimulationDistance = operatingPoint.SimulationDistance; + SimulationInterval = operatingPoint.SimulationInterval; + } + + public OperatingPoint() + { + } public override string ToString() { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index 1635e547bd..cffac5072d 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -1001,6 +1001,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); debug.Add(new { action = "Coast:(Success & Acc<0) -> Accelerate", first }); } + if (!DataBus.EngineInfo.EngineOn && first is ResponseOverload) { + first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); + debug.Add(new { action = "Coast:(Overload & ICE off) -> Accelerate", first }); + } } else { if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && DataBus.GearboxInfo.DisengageGearbox) { first = Driver.DrivingActionCoast(absTime, ds, velocityWithOverspeed, gradient); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs index eb07caafaa..94ae6f8030 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs @@ -922,30 +922,31 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl LimitationMode limits) { var limitApplied = false; - var originalAcceleration = operatingPoint.Acceleration; + var retVal = new OperatingPoint(operatingPoint); + var originalAcceleration = retVal.Acceleration; //if (((limits & LimitationMode.LimitDecelerationLookahead) != 0) && - // operatingPoint.Acceleration < DriverData.LookAheadCoasting.Deceleration) { - // operatingPoint.Acceleration = DriverData.LookAheadCoasting.Deceleration; + // retVal.Acceleration < DriverData.LookAheadCoasting.Deceleration) { + // retVal.Acceleration = DriverData.LookAheadCoasting.Deceleration; // limitApplied = true; //} var accelerationLimits = DriverData.AccelerationCurve.Lookup(DataBus.VehicleInfo.VehicleSpeed); - if (operatingPoint.Acceleration > accelerationLimits.Acceleration) { - operatingPoint.Acceleration = accelerationLimits.Acceleration; + if (retVal.Acceleration > accelerationLimits.Acceleration) { + retVal.Acceleration = accelerationLimits.Acceleration; limitApplied = true; } if (((limits & LimitationMode.LimitDecelerationDriver) != 0) && - operatingPoint.Acceleration < accelerationLimits.Deceleration) { - operatingPoint.Acceleration = accelerationLimits.Deceleration; + retVal.Acceleration < accelerationLimits.Deceleration) { + retVal.Acceleration = accelerationLimits.Deceleration; limitApplied = true; } if (limitApplied) { - operatingPoint.SimulationInterval = - ComputeTimeInterval(operatingPoint.Acceleration, operatingPoint.SimulationDistance) + retVal.SimulationInterval = + ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance) .SimulationInterval; Log.Debug("Limiting acceleration from {0} to {1}, dt: {2}", originalAcceleration, - operatingPoint.Acceleration, operatingPoint.SimulationInterval); + retVal.Acceleration, retVal.SimulationInterval); } - return operatingPoint; + return retVal; } /// <summary> diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index 5bd6a91359..a1fe968e5a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -150,7 +150,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies return response; } - if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Brake) { + if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Brake && (DataBus.GearboxInfo.GearEngaged(absTime) || ElectricMotorCanPropellDuringTractionInterruption)) { var tmp = MaxRecuperationSetting(absTime, dt, outTorque, outAngularVelocity); var outTorqueWithoutBraking = outTorque - 2 * DataBus.Brakes.BrakePower / (PreviousState.AngularVelocity + outAngularVelocity); @@ -159,7 +159,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies DryRunAction = DataBus.DriverInfo.DrivingAction; DryRunResult = tmp; var brakeRetVal = CreateResponse(tmp, currentGear); - DebugData.Add(new { Best = tmp, RetVal = brakeRetVal, DryRun = dryRun }); + DebugData.Add(new { DrivingAction = DataBus.DriverInfo.DrivingAction, Best = tmp, RetVal = brakeRetVal, DryRun = dryRun }); return brakeRetVal; } } @@ -227,7 +227,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies CurrentState.GearshiftTriggerTstmp = absTime; } - DebugData.Add(new { Evaluations = eval, Best = best, RetVal = retVal, DryRun = dryRun }); + DebugData.Add(new { DrivingAction = DataBus.DriverInfo.DrivingAction, Evaluations = eval, Best = best, RetVal = retVal, DryRun = dryRun }); return retVal; } @@ -237,7 +237,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies { var best = eval.Where(x => !double.IsNaN(x.Score)).OrderBy(x => x.Score).FirstOrDefault(); if (best == null) { - best = eval.FirstOrDefault(x => !DataBus.EngineCtl.CombustionEngineOn || !x.IgnoreReason.InvalidEngineSpeed()); + best = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).FirstOrDefault(x => !DataBus.EngineCtl.CombustionEngineOn || !x.IgnoreReason.InvalidEngineSpeed()); if (best == null /*&& dryRun*/) { var emEngaged = (!ElectricMotorCanPropellDuringTractionInterruption || (DataBus.GearboxInfo.GearEngaged(absTime) && eval.First().Response.Gearbox.Gear != 0)); @@ -300,14 +300,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies GearboxInNeutral = false, MechanicalAssistPower = ElectricMotorsOff }; - var firstResponse = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, DataBus.GearboxInfo.Gear, first); + var currentGear = PreviousState.GearboxEngaged ? DataBus.GearboxInfo.Gear : Controller.ShiftStrategy.NextGear.Gear; + var firstResponse = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, currentGear, first); var allowICEOff = PreviousState.ICEStartTStmp == null || PreviousState.ICEStartTStmp.IsSmaller(absTime + MIN_ICE_ON_TIME); var emPos = ModelData.ElectricMachinesData.First().Item1; - var currentGear = PreviousState.GearboxEngaged ? DataBus.GearboxInfo.Gear : Controller.ShiftStrategy.NextGear.Gear; + var emTorque = !ElectricMotorCanPropellDuringTractionInterruption && (firstResponse.Gearbox.Gear == 0 || !DataBus.GearboxInfo.GearEngaged(absTime)) ? null : firstResponse.ElectricMotor.MaxRecuperationTorque; return TryConfiguration(absTime, dt, outTorque, outAngularVelocity, currentGear, emPos, emTorque, double.NaN, allowICEOff); } @@ -607,6 +608,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies TestPowertrain.CombustionEngine.PreviousState.EngineTorqueOut = (DataBus.EngineInfo as CombustionEngine).PreviousState.EngineTorqueOut; TestPowertrain.CombustionEngine.PreviousState.DynamicFullLoadTorque = (DataBus.EngineInfo as CombustionEngine).PreviousState.DynamicFullLoadTorque; + TestPowertrain.Clutch.PreviousState.InAngularVelocity = + (DataBus.ClutchInfo as SwitchableClutch).PreviousState.InAngularVelocity; + if (/*nextGear != DataBus.GearboxInfo.Gear && */TestPowertrain.ElectricMotorP2 != null) { TestPowertrain.ElectricMotorP2.PreviousState.OutAngularVelocity = DataBus.ElectricMotorInfo(PowertrainPosition.HybridP2).ElectricMotorSpeed; -- GitLab