Skip to content

Instantly share code, notes, and snippets.

@sjoelund
Created September 5, 2019 14:09
Show Gist options
  • Save sjoelund/6a1e18c890c51aee8534733a584eea80 to your computer and use it in GitHub Desktop.
Save sjoelund/6a1e18c890c51aee8534733a584eea80 to your computer and use it in GitHub Desktop.
class VehicleInterfaces.Drivers.MinimalDriver "Constant acceleration Driver"
VehicleInterfaces.Mechanics.NormalisedRotational.Interfaces.Flange driverInterface.steeringWheel "virtual variable in expandable connector";
VehicleInterfaces.Mechanics.NormalisedTranslational.Interfaces.Flange driverInterface.acceleratorPedal "virtual variable in expandable connector";
VehicleInterfaces.Mechanics.NormalisedTranslational.Interfaces.Flange driverInterface.brakePedal "virtual variable in expandable connector";
Integer driverInterface.ignition "virtual variable in expandable connector";
Integer driverInterface.requestedGear "virtual variable in expandable connector";
Integer driverInterface.gearboxMode "virtual variable in expandable connector";
parameter Real initialAccelRequest(min = 0.0, max = 1.0) = 1.0 "Initial accelerator pedal position";
parameter Real initialBrakeRequest(min = 0.0, max = 1.0) = 0.0 "Initial brake pedal position";
parameter Real finalAccelRequest(min = 0.0, max = 1.0) = 1.0 "Final accelerator pedal position";
parameter Real finalBrakeRequest(min = 0.0, max = 1.0) = 0.0 "Final brake pedal position";
parameter Real accelTime(quantity = "Time", unit = "s") = 10.0 "Time of accel apply";
parameter Real brakeTime(quantity = "Time", unit = "s") = 10.0 "Time of brake apply";
parameter Integer selectedGearboxMode(min = 1, max = 6) = 2 "Current gearbox mode";
parameter Integer manualGearRequest(quantity = "gear") = 0 "Requested gear in manual mode";
parameter Real brakeDemand.height = finalBrakeRequest "Height of step";
Real brakeDemand.y "Connector of Real output signal";
parameter Real brakeDemand.offset = initialBrakeRequest "Offset of output signal y";
parameter Real brakeDemand.startTime(quantity = "Time", unit = "s") = brakeTime "Output y = offset for time < startTime";
parameter Real acceleratorDemand.height = finalAccelRequest "Height of step";
Real acceleratorDemand.y "Connector of Real output signal";
parameter Real acceleratorDemand.offset = initialAccelRequest "Offset of output signal y";
parameter Real acceleratorDemand.startTime(quantity = "Time", unit = "s") = accelTime "Output y = offset for time < startTime";
parameter Real steeringAngle.k(start = 1.0) = 0.0 "Constant output value";
Real steeringAngle.y "Connector of Real output signal";
parameter Integer gearboxMode.k(start = 1) = selectedGearboxMode "Constant output value";
Integer gearboxMode.y "Connector of Integer output signal";
parameter Integer requestedGear.k(start = 1) = manualGearRequest "Constant output value";
Integer requestedGear.y "Connector of Integer output signal";
final parameter Boolean steeringWheelAngle.exact = true "True/false exact treatment/filtering the input signal";
parameter Real steeringWheelAngle.f_crit(quantity = "Frequency", unit = "Hz") = 50.0 "If exact=false: critical frequency of filter to filter input signal";
Real steeringWheelAngle.flange_b.phi(quantity = "", unit = "1", displayUnit = "1", min = 0.0, max = 1.0) "Normalized rotation of flange";
Real steeringWheelAngle.flange_b.tau(quantity = "Torque", unit = "N.m") "Cut torque directed in the flange";
Real steeringWheelAngle.phi_ref "position to be applied";
Real steeringWheelAngle.phi(quantity = "", unit = "1", displayUnit = "1", min = 0.0, max = 1.0);
protected parameter Real steeringWheelAngle.w_crit = 6.283185307179586 * steeringWheelAngle.f_crit "critical frequency in [1/s]";
protected constant Real steeringWheelAngle.af = 1.3617 "Coefficient s of Bessel filter";
protected constant Real steeringWheelAngle.bf = 0.618 "Coefficient s*s of Bessel filter";
protected Real steeringWheelAngle.w;
protected Real steeringWheelAngle.a;
final parameter Boolean brakePosition.exact = true "True/false exact treatment/filtering the input signal";
parameter Real brakePosition.f_crit(quantity = "Frequency", unit = "Hz") = 50.0 "If exact=false: critical frequency of filter to filter input signal";
Real brakePosition.flange_b.s(quantity = "", unit = "1", displayUnit = "1", min = 0.0, max = 1.0) "Normalized position of flange";
Real brakePosition.flange_b.f(quantity = "Force", unit = "N") "Cut force directed into flange";
Real brakePosition.position "position to be applied";
Real brakePosition.s(quantity = "", unit = "1", displayUnit = "1", min = 0.0, max = 1.0) "Normalized position";
protected parameter Real brakePosition.w_crit = 6.283185307179586 * brakePosition.f_crit "Critical frequency in [1/s]";
protected constant Real brakePosition.af = 1.3617 "Coefficient s of Bessel filter";
protected constant Real brakePosition.bf = 0.618 "Coefficient s*s of Bessel filter";
protected Real brakePosition.v;
protected Real brakePosition.a;
final parameter Boolean acceleratorPosition.exact = true "True/false exact treatment/filtering the input signal";
parameter Real acceleratorPosition.f_crit(quantity = "Frequency", unit = "Hz") = 50.0 "If exact=false: critical frequency of filter to filter input signal";
Real acceleratorPosition.flange_b.s(quantity = "", unit = "1", displayUnit = "1", min = 0.0, max = 1.0) "Normalized position of flange";
Real acceleratorPosition.flange_b.f(quantity = "Force", unit = "N") "Cut force directed into flange";
Real acceleratorPosition.position "position to be applied";
Real acceleratorPosition.s(quantity = "", unit = "1", displayUnit = "1", min = 0.0, max = 1.0) "Normalized position";
protected parameter Real acceleratorPosition.w_crit = 6.283185307179586 * acceleratorPosition.f_crit "Critical frequency in [1/s]";
protected constant Real acceleratorPosition.af = 1.3617 "Coefficient s of Bessel filter";
protected constant Real acceleratorPosition.bf = 0.618 "Coefficient s*s of Bessel filter";
protected Real acceleratorPosition.v;
protected Real acceleratorPosition.a;
parameter Integer ignition.height = -1 "Height of step";
Integer ignition.y "Connector of Integer output signal";
parameter Integer ignition.offset = 3 "Offset of output signal y";
parameter Real ignition.startTime(quantity = "Time", unit = "s") = 0.5 "Output y = offset for time < startTime";
equation
steeringAngle.y = steeringWheelAngle.phi_ref;
brakeDemand.y = brakePosition.position;
acceleratorDemand.y = acceleratorPosition.position;
gearboxMode.y = driverInterface.gearboxMode;
requestedGear.y = driverInterface.requestedGear;
ignition.y = driverInterface.ignition;
brakePosition.flange_b.s = driverInterface.brakePedal.s;
acceleratorPosition.flange_b.s = driverInterface.acceleratorPedal.s;
steeringWheelAngle.flange_b.phi = driverInterface.steeringWheel.phi;
steeringWheelAngle.flange_b.tau + (-driverInterface.steeringWheel.tau) = 0.0;
brakePosition.flange_b.f + (-driverInterface.brakePedal.f) = 0.0;
acceleratorPosition.flange_b.f + (-driverInterface.acceleratorPedal.f) = 0.0;
brakeDemand.y = brakeDemand.offset + (if time < brakeDemand.startTime then 0.0 else brakeDemand.height);
acceleratorDemand.y = acceleratorDemand.offset + (if time < acceleratorDemand.startTime then 0.0 else acceleratorDemand.height);
steeringAngle.y = steeringAngle.k;
gearboxMode.y = gearboxMode.k;
requestedGear.y = requestedGear.k;
steeringWheelAngle.phi = steeringWheelAngle.flange_b.phi;
steeringWheelAngle.w = der(steeringWheelAngle.phi);
steeringWheelAngle.a = der(steeringWheelAngle.w);
steeringWheelAngle.phi = steeringWheelAngle.phi_ref;
brakePosition.s = brakePosition.flange_b.s;
brakePosition.s = brakePosition.position;
brakePosition.v = 0.0;
brakePosition.a = 0.0;
acceleratorPosition.s = acceleratorPosition.flange_b.s;
acceleratorPosition.s = acceleratorPosition.position;
acceleratorPosition.v = 0.0;
acceleratorPosition.a = 0.0;
ignition.y = ignition.offset + (if time < ignition.startTime then 0 else ignition.height);
end VehicleInterfaces.Drivers.MinimalDriver;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment