From 1b0206641ffcb68e1378177fd81bc3e71960ed4d Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Mon, 19 Oct 2015 22:55:55 +0200 Subject: [PATCH] - distinguish between current driving behavior for estimating next simulation interval in case the vehicle accelerates - new testcase for accelerating during coasting before brake (due to slope change) --- .../Impl/DefaultDriverStrategy.cs | 60 ++++++++++++------- .../DriverStrategy/DriverStrategyTestTruck.cs | 15 +++++ 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index 46600df4d8..1f6e03036c 100644 --- a/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -93,30 +93,46 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } - Meter newds; - switch (NextDrivingAction.Action) { - case DrivingBehavior.Coasting: - var coastingDistance = Formulas.DecelerationDistance(v2, NextDrivingAction.NextTargetSpeed, - Driver.DriverData.LookAheadCoasting.Deceleration); - - // if the distance at the end of the simulation interval is smaller than the new ActionDistance - // we are safe - go ahead... - if ((Driver.DataBus.Distance + ds).IsSmallerOrEqual(NextDrivingAction.TriggerDistance - coastingDistance, - Constants.SimulationSettings.DriverActionDistanceTolerance)) { + Meter newds = 0.SI<Meter>(); + if (CurrentDrivingMode == DrivingMode.DrivingModeDrive) { + switch (NextDrivingAction.Action) { + case DrivingBehavior.Coasting: + var coastingDistance = Formulas.DecelerationDistance(v2, NextDrivingAction.NextTargetSpeed, + Driver.DriverData.LookAheadCoasting.Deceleration); + + // if the distance at the end of the simulation interval is smaller than the new ActionDistance + // we are safe - go ahead... + if ((Driver.DataBus.Distance + ds).IsSmallerOrEqual(NextDrivingAction.TriggerDistance - coastingDistance, + Constants.SimulationSettings.DriverActionDistanceTolerance)) { + return retVal; + } + newds = EstimateAccelerationDistanceBeforeBrake(retVal, NextDrivingAction); + break; + case DrivingBehavior.Braking: + var brakingDistance = Driver.DriverData.AccelerationCurve.ComputeAccelerationDistance(v2, + NextDrivingAction.NextTargetSpeed); + if ((Driver.DataBus.Distance + ds).IsSmaller(NextDrivingAction.TriggerDistance - brakingDistance)) { + return retVal; + } + newds = (NextDrivingAction.TriggerDistance - brakingDistance) - Driver.DataBus.Distance; + break; + default: return retVal; - } - newds = EstimateAccelerationDistanceBeforeBrake(retVal, NextDrivingAction); - break; - case DrivingBehavior.Braking: - var brakingDistance = Driver.DriverData.AccelerationCurve.ComputeAccelerationDistance(v2, - NextDrivingAction.NextTargetSpeed); - if ((Driver.DataBus.Distance + ds).IsSmaller(NextDrivingAction.TriggerDistance - brakingDistance)) { + } + } + if (CurrentDrivingMode == DrivingMode.DrivingModeBrake) { + switch (NextDrivingAction.Action) { + case DrivingBehavior.Coasting: + var brakingDistance = Driver.DriverData.AccelerationCurve.ComputeAccelerationDistance(v2, + NextDrivingAction.NextTargetSpeed); + if ((Driver.DataBus.Distance + ds).IsSmaller(NextDrivingAction.TriggerDistance - brakingDistance)) { + return retVal; + } + newds = (NextDrivingAction.TriggerDistance - brakingDistance) - Driver.DataBus.Distance; + break; + default: return retVal; - } - newds = (NextDrivingAction.TriggerDistance - brakingDistance) - Driver.DataBus.Distance; - break; - default: - return retVal; + } } if (newds.IsEqual(0, 1e-3) || ds.IsEqual(newds, 1e-3.SI<Meter>())) { return retVal; diff --git a/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestTruck.cs b/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestTruck.cs index 4731983b2c..4c96b6609c 100644 --- a/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestTruck.cs +++ b/VectoCoreTest/Integration/DriverStrategy/DriverStrategyTestTruck.cs @@ -334,6 +334,21 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy @"..\..\TestData\Integration\DriverStrategy\Vecto2.2\40t Truck\40t_Long_Haul_Truck_Cycle_Decelerate_80_0_uphill_3.vmod"); } + [TestMethod] + public void Truck_Decelerate_80_0_SlopeChangeDuringCoast() + { + var data = new string[] { + // <s>,<v>,<grad>,<stop> + " 0, 60, -1.15, 0", + " 70, 60, -1.85, 0", + "300, 0, -1.85, 2", + }; + + var cycle = SimpleDrivingCycles.CreateCycleData(data); + Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck_DriverStrategy_Decelerate_80_0_SlopeChangeDuringCoast.vmod") + .Run(); + } + [TestMethod, Ignore] public void Truck_Decelerate_80_0_uphill_5() { -- GitLab