Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit b3378b35 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

Extend Driver functionality: if no operating point can be found because the...

Extend Driver functionality: if no operating point can be found because the vehicle already stopped and no acceleration > 0 can be achieved (e.g. because steep uphill and the gearbox is disengaged), insert a 'halt' action and drive off again
parent 67b6a212
No related branches found
No related tags found
No related merge requests found
...@@ -181,6 +181,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -181,6 +181,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
response); response);
} }
if (nextOperatingPoint == null && absTime > 0 && DataBus.VehicleStopped) {
Log.Info(
"No operating point found! Vehicle stopped! trying HALT action");
DataBus.BrakePower = 1.SI<Watt>();
retVal = DrivingActionHalt(absTime, operatingPoint.SimulationInterval, 0.SI<MeterPerSecond>(), gradient);
retVal.SimulationDistance = 0.SI<Meter>();
retVal.Acceleration = 0.SI<MeterPerSquareSecond>();
retVal.SimulationInterval = operatingPoint.SimulationInterval;
retVal.OperatingPoint = new OperatingPoint() {
Acceleration = retVal.Acceleration,
SimulationDistance = retVal.SimulationDistance,
SimulationInterval = operatingPoint.SimulationInterval
};
return retVal;
}
var limitedOperatingPoint = nextOperatingPoint; var limitedOperatingPoint = nextOperatingPoint;
if (!(retVal is ResponseEngineSpeedTooHigh || DataBus.ClutchClosed(absTime))) { if (!(retVal is ResponseEngineSpeedTooHigh || DataBus.ClutchClosed(absTime))) {
limitedOperatingPoint = LimitAccelerationByDriverModel(nextOperatingPoint, limitedOperatingPoint = LimitAccelerationByDriverModel(nextOperatingPoint,
...@@ -746,12 +763,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -746,12 +763,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
retVal.Acceleration = tmp.Acceleration; retVal.Acceleration = tmp.Acceleration;
retVal.SimulationInterval = tmp.SimulationInterval; retVal.SimulationInterval = tmp.SimulationInterval;
retVal.SimulationDistance = tmp.SimulationDistance; retVal.SimulationDistance = tmp.SimulationDistance;
} else {
retVal.Acceleration = acc;
retVal.SimulationDistance = 0.SI<Meter>();
} }
IterationStatistics.Increment(this, "SearchOperatingPoint"); IterationStatistics.Increment(this, "SearchOperatingPoint");
DriverAcceleration = acc; DriverAcceleration = acc;
var response = NextComponent.Request(absTime, retVal.SimulationInterval, acc, gradient, true); var response = NextComponent.Request(absTime, retVal.SimulationInterval, acc, gradient, true);
response.OperatingPoint = retVal; response.OperatingPoint = retVal;
return response; return response;
}, },
criterion: response => { criterion: response => {
var r = (ResponseDryRun)response; var r = (ResponseDryRun)response;
...@@ -768,6 +791,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -768,6 +791,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
var r = (ResponseDryRun)response; var r = (ResponseDryRun)response;
return r != null && !actionRoll && !ds.IsEqual(r.OperatingPoint.SimulationDistance); return r != null && !actionRoll && !ds.IsEqual(r.OperatingPoint.SimulationDistance);
}); });
return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance);
} catch (VectoSearchAbortedException) { } catch (VectoSearchAbortedException) {
// search aborted, try to go ahead with the last acceleration // search aborted, try to go ahead with the last acceleration
} catch (Exception) { } catch (Exception) {
...@@ -779,7 +803,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -779,7 +803,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
DriverData.AccelerationCurve.MaxAcceleration())) { DriverData.AccelerationCurve.MaxAcceleration())) {
Log.Info("Operating Point outside driver acceleration limits: a: {0}", retVal.Acceleration); Log.Info("Operating Point outside driver acceleration limits: a: {0}", retVal.Acceleration);
} }
return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance); return null;
} }
private static Watt GetOrigDelta(IResponse initialResponse, bool coastingOrRoll, bool actionRoll) private static Watt GetOrigDelta(IResponse initialResponse, bool coastingOrRoll, bool actionRoll)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment