diff --git a/VectoCommon/VectoCommon/Models/VehicleCategory.cs b/VectoCommon/VectoCommon/Models/VehicleCategory.cs index e279361998f6b9158e010837c3da81caf70fbb4d..80295afb08048d3d86e672804498cfdb7192e0b5 100644 --- a/VectoCommon/VectoCommon/Models/VehicleCategory.cs +++ b/VectoCommon/VectoCommon/Models/VehicleCategory.cs @@ -127,6 +127,14 @@ namespace TUGraz.VectoCommon.Models } } + public static bool IsBus(this VehicleCategory category) + { + switch (category) { + case VehicleCategory.HeavyBusPrimaryVehicle: return true; + default: return false; + } + } + public static VehicleCategory Parse(string vehicleCategory) { switch (vehicleCategory) { diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs index d3c5e27fa3b1723c57b60ea81e6669fc3a72de25..8e3c253200a6a5b5d3e6e3b705aa8bbb8fd5bd7e 100644 --- a/VectoCore/VectoCore/Configuration/Constants.cs +++ b/VectoCore/VectoCore/Configuration/Constants.cs @@ -201,6 +201,8 @@ namespace TUGraz.VectoCore.Configuration public static readonly Meter HeightLuggageCompartment = 0.5.SI<Meter>(); public static readonly SIBase<Meter> EntranceHeight = 0.27.SI<Meter>(); + public static readonly MeterPerSecond MaxBusSpeed = 103.KMPHtoMeterPerSecond(); + public static class Auxiliaries { public static class SteeringPump diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index 9f240291e7dce344de8ad6b51cfc17e12c352f95..62c4a9c8fe454b91f59d5181b4bd65e6e200a8d1 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -89,6 +89,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl DrivingModes.Add(DrivingMode.DrivingModeBrake, new DriverModeBrake() { DriverStrategy = this }); CurrentDrivingMode = DrivingMode.DrivingModeDrive; + VehicleCategory = container?.RunData.VehicleData.VehicleCategory ?? VehicleCategory.Unknown; + var data = container?.RunData; ADAS = data?.VehicleData?.ADAS ?? new VehicleData.ADASData() { EcoRoll = EcoRollType.None, @@ -118,6 +120,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } } + public VehicleCategory VehicleCategory { get; set; } + public IDriverActions Driver { get; set; } protected internal DrivingBehaviorEntry BrakeTrigger { get; set; } @@ -426,7 +430,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var accelerationPedalIdle = EcoRollState.AcceleratorPedalIdle; var brakeActive = !EcoRollState.PreviousBrakePower.IsEqual(0); var vehcleSpeedBelowMax = dBus.VehicleSpeed <= - dBus.CycleData.LeftSample.VehicleTargetSpeed + GetOverspeed() - 2.KMPHtoMeterPerSecond(); + (ApplyOverspeed(dBus.CycleData.LeftSample.VehicleTargetSpeed) - 2.KMPHtoMeterPerSecond()); EcoRollState.AllConditionsMet = vehicleSpeedAboveLowerThreshold && vehcleSpeedBelowMax && slopeNegative && accelerationWithinLimits && accelerationPedalIdle && !brakeActive; @@ -562,6 +566,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } } + public MeterPerSecond ApplyOverspeed(MeterPerSecond targetSpeed) + { + return (targetSpeed + GetOverspeed()).LimitTo( + 0.KMPHtoMeterPerSecond(), VehicleCategory.IsBus() ? Constants.BusParameters.MaxBusSpeed : 500.KMPHtoMeterPerSecond()); + + } + protected internal MeterPerSecond GetOverspeed() { return ADAS.PredictiveCruiseControl == PredictiveCruiseControlType.Option_1_2_3 && Driver.DataBus.CycleData.LeftSample.Highway @@ -583,7 +594,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var nextActions = new List<DrivingBehaviorEntry>(); foreach (var entry in lookaheadData) { var nextTargetSpeed = OverspeedAllowed(entry.VehicleTargetSpeed) - ? entry.VehicleTargetSpeed + GetOverspeed() + ? ApplyOverspeed(entry.VehicleTargetSpeed) : entry.VehicleTargetSpeed; if (nextTargetSpeed >= currentSpeed) { // acceleration is not relevant @@ -689,7 +700,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return Driver.DriverData.OverSpeed.Enabled && velocity > Driver.DriverData.OverSpeed.MinSpeed - && (velocity + GetOverspeed()) < + && ApplyOverspeed(velocity) < (Driver.DataBus.MaxVehicleSpeed ?? 500.KMPHtoMeterPerSecond()); } } @@ -828,8 +839,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Driver.DriverBehavior = DrivingBehavior.Driving; var velocityWithOverspeed = targetVelocity; if (DriverStrategy.OverspeedAllowed(targetVelocity, prohibitOverspeed)) { - velocityWithOverspeed += DriverStrategy.GetOverspeed(); + velocityWithOverspeed = DriverStrategy.ApplyOverspeed(velocityWithOverspeed); } + if (DataBus.GearboxType.AutomaticTransmission() || DataBus.ClutchClosed(absTime)) { for (var i = 0; i < 3; i++) { var retVal = HandleRequestEngaged(