public void OnAllFast(
            CarTimestamp ct,
            double wheelFL,
            double wheelFR,
            double wheelRR,
            double wheelRL,
            double rpm,
            double steerAngle,
            TransmissionGear transGear,
            int transDir,
            double actTorque,
            double reqTorque,
            int cylinderDeactivation,
            int pedalPos,
            double brakePressure)
        {
            OnWheelspeed(wheelFL, wheelFR, wheelRR, wheelRL, ct);
            OnBrake(brakePressure, ct);

            if (transGear != lastRecvTransmissionGear)
            {
                Services.Dataset.ItemAs <DateTime>("trans gear change time").Add(HighResDateTime.Now, ct);
                lastRecvTransmissionGear = transGear;
            }
        }
        public OperationalSimVehicleState GetOperationalSimVehicleState(WorldService service)
        {
            TransmissionGear g = TransmissionGear.Neutral;

            switch (gear)
            {
            case '1': g = TransmissionGear.First; break;

            case '2': g = TransmissionGear.Second; break;

            case '3': g = TransmissionGear.Third; break;

            case '4': g = TransmissionGear.Fourth; break;

            case 'r': g = TransmissionGear.Reverse; break;
            }

            double rps2rpm          = 60.0 / (2.0 * Math.PI);
            double bleed_off_torque = TahoeParams.bleed_off_power / engine_speed;

            return(new OperationalSimVehicleState(
                       simVehicleState.Position, simVehicleState.Speed, simVehicleState.Heading.ArcTan, steering_wheel,
                       g, engine_torque + bleed_off_torque, master_cylinder_pressure, engine_speed * rps2rpm, carMode,
                       0, false, SimulatorClient.GetCurrentTimestamp));
        }
		public void SetTransmissionGear(TransmissionGear g) {
			if (g >= TransmissionGear.First && g <= TransmissionGear.Fourth) {
				gear = TransmissionGear.First;
			}
			else if (g == TransmissionGear.Reverse) {
				gear = TransmissionGear.Reverse;
			}
		}
 public TrackingData(double? engineTorque, double? brakePressure, TransmissionGear? gear, double? steeringAngle, CompletionResult result)
 {
     this.engineTorque = engineTorque;
     this.brakePressure = brakePressure;
     this.gear = gear;
     this.steeringAngle = steeringAngle;
     this.result = result;
 }
示例#5
0
        public TransmissionGear GetGear()
        {
            var gear = new TransmissionGear();

            gear.Name  = gearName.Text;
            gear.Ratio = ratioBox.Value;
            return(gear);
        }
示例#6
0
        /// <summary>
        /// Gets the engine RPM based on truck speed, and other variables.
        /// </summary>
        /// <param name="speed">
        /// The truck speed in MPH or KPH depending on the <see cref="UnitSystem"/> configured
        /// </param>
        /// <param name="gear">The current gear the truck is in</param>
        /// <returns></returns>
        private int GetRpmFromSpeed(int speed, TransmissionGear gear)
        {
            decimal axelRatio = diffRatio.Value;
            decimal distance  = (Program.Config.UnitSystem == UnitSystem.Imperial)
                ? DISTANCE_MILES
                : DISTANCE_KILOS;

            return((int)Math.Round((axelRatio * speed * gear.Ratio * distance) / TIRE_DIAMETER, 0));
        }
示例#7
0
 public EditGearForm(TransmissionGear gear = null)
 {
     InitializeComponent();
     if (gear != null)
     {
         gearName.Text = gear.Name;
         ratioBox.SetValueInRange(gear.Ratio);
     }
 }
示例#8
0
        /// <summary>
        /// Gets the truck speed based off of Engine RPM, and a few other variables.
        /// </summary>
        /// <param name="rpm">The current engine RPM</param>
        /// <param name="gear">The current gear the truck is in</param>
        /// <returns>The truck speed in MPH or KPH depending on the <see cref="UnitSystem"/> configured</returns>
        private int GetSpeedFromRpm(int rpm, TransmissionGear gear)
        {
            decimal axelRatio = diffRatio.Value;
            decimal distance  = (Program.Config.UnitSystem == UnitSystem.Imperial)
                ? DISTANCE_MILES
                : DISTANCE_KILOS;

            // Now the real math starts
            distance = (distance * axelRatio * gear.Ratio) / TIRE_DIAMETER;
            return((int)Math.Round(rpm / distance, 0));
        }
示例#9
0
 /// <summary>
 /// Gets the gear name, or if the gear does not have a name, generates a name based off
 /// of the gear index.
 /// </summary>
 /// <param name="index">The index of the gear in the list (sorted by ratio desc)</param>
 /// <param name="gear">The gear we are fetching the name for</param>
 /// <returns></returns>
 private string GetGearNameAtIndex(int index, TransmissionGear gear)
 {
     if (gear.IsReverse)
     {
         return(Transmission.GetGearNameAtIndex(index, gear, ReverseGears));
     }
     else
     {
         return(Transmission.GetGearNameAtIndex(index, gear, ForwardGears));
     }
 }
 public override void SetTransmissionGear(TransmissionGear g)
 {
     if (g >= TransmissionGear.First && g <= TransmissionGear.Fourth)
     {
         gear = '1';
     }
     else if (g == TransmissionGear.Reverse)
     {
         gear = 'r';
     }
 }
 public OperationalVehicleState(double speed, double steeringAngle, TransmissionGear transGear, double pitch, double brakePressure, double engineTorque, double engineRPM, double pedalPosition, CarTimestamp timestamp)
 {
     this.speed = speed;
     this.steeringAngle = steeringAngle;
     this.transGear = transGear;
     this.pitch = pitch;
     this.engineTorque = engineTorque;
     this.engineRPM = engineRPM;
     this.brakePressure = brakePressure;
     this.pedalPosition = pedalPosition;
     this.timestamp = timestamp;
 }
示例#12
0
 public OperationalVehicleState(double speed, double steeringAngle, TransmissionGear transGear, double pitch, double brakePressure, double engineTorque, double engineRPM, double pedalPosition, CarTimestamp timestamp)
 {
     this.speed         = speed;
     this.steeringAngle = steeringAngle;
     this.transGear     = transGear;
     this.pitch         = pitch;
     this.engineTorque  = engineTorque;
     this.engineRPM     = engineRPM;
     this.brakePressure = brakePressure;
     this.pedalPosition = pedalPosition;
     this.timestamp     = timestamp;
 }
示例#13
0
        /// <summary>
        /// Adds a gear to the Gear List View
        /// </summary>
        /// <param name="gear"></param>
        /// <param name="index"></param>
        private void AddGear(TransmissionGear gear, int index)
        {
            string name = (showPlaceholdersBox.Checked) ? GetGearNameAtIndex(index, gear) : gear.Name;

            ListViewItem item = new ListViewItem((index + 1).ToString());

            item.SubItems.Add(name);
            item.SubItems.Add($"{gear.Ratio}:1");
            item.Tag = index;

            index = (gear.IsReverse) ? 0 : 1;
            gearListView.Groups[index].Items.Add(item);
            gearListView.Items.Add(item);
        }
 public OperationalSimVehicleState(Coordinates position, double speed, double heading, double steeringAngle, TransmissionGear transGear, double engineTorque, double brakePressure, double engineRPM, CarMode carMode, double stopLineDistance, bool stoplineFound, CarTimestamp timestamp)
 {
     this.position         = position;
     this.speed            = speed;
     this.heading          = heading;
     this.steeringAngle    = steeringAngle;
     this.transGear        = transGear;
     this.engineTorque     = engineTorque;
     this.brakePressure    = brakePressure;
     this.engineRPM        = engineRPM;
     this.carMode          = carMode;
     this.stopLineDistance = stopLineDistance;
     this.stoplineFound    = stoplineFound;
     this.timestamp        = timestamp;
 }
 public OperationalSimVehicleState(Coordinates position, double speed, double heading, double steeringAngle, TransmissionGear transGear, double engineTorque, double brakePressure, double engineRPM, CarMode carMode, double stopLineDistance, bool stoplineFound, CarTimestamp timestamp)
 {
     this.position = position;
     this.speed = speed;
     this.heading = heading;
     this.steeringAngle = steeringAngle;
     this.transGear = transGear;
     this.engineTorque = engineTorque;
     this.brakePressure = brakePressure;
     this.engineRPM = engineRPM;
     this.carMode = carMode;
     this.stopLineDistance = stopLineDistance;
     this.stoplineFound = stoplineFound;
     this.timestamp = timestamp;
 }
		public TahoeSim(Coordinates loc, double heading, double speed, TransmissionGear gear, double throttle, double steering_wheel, double engine_torque, double master_cylinder_pressure, double engine_speed) {
			InitializeState();

			this.x = loc.X;
			this.y = loc.Y;
			this.heading = heading;
			this.speed = speed;
			this.gear = gear;
			this.throttle = throttle;
			this.steering_wheel = steering_wheel;
			this.engine_torque = engine_torque;
			this.master_cylinder_pressure = master_cylinder_pressure;
			this.engine_speed = engine_speed;

			TahoeConstraints();
		}
		// initialise vehicle state and commands
		private void InitializeState() {
			// initialise vehicle state
			this.x = 0;
			this.y = 0;
			this.heading = 0;
			speed = 0;
			gear = TransmissionGear.First;  // gear, 'r', '1', '2', '3', '4'
			throttle = 0.0;                 // throttle (between 0 and 1), the fraction of maximum torque commanded
			steering_wheel = 0.0;           // steering wheel angle (rad., positive left)
			engine_torque = 0.0;            // engine torque (N-m)
			master_cylinder_pressure = 0.0; // master cylinder pressure (Aarons)
			engine_speed = 0.0;             // engine speed (rad. / sec.)

			// initialise commands
			commanded_steering_wheel = 0.0;
			commanded_engine_torque = 0.0;
			commanded_master_cylinder_pressure = 35; // initialize to something so we don't start moving around

			// make sure initial state is valid
			TahoeConstraints();
		}
示例#18
0
        /// <summary>
        /// Method called whenever a gear is modified. This method will move the gear
        /// to the Forward or Reverse gear depending.
        /// </summary>
        /// <param name="oldGear">The gear before the changes</param>
        /// <param name="newGear">The new gear values</param>
        /// <param name="index">The index the oldGear is at in its corresponding list</param>
        /// <returns></returns>
        private bool OnGearEdit(TransmissionGear oldGear, TransmissionGear newGear, int index)
        {
            // Are we switching from forward to reverse (or vise-versa)?
            if (oldGear.IsReverse != newGear.IsReverse)
            {
                if (newGear.IsReverse)
                {
                    ReverseGears.Add(newGear);
                    ForwardGears.RemoveAt(index);
                }
                else
                {
                    ForwardGears.Add(newGear);
                    ReverseGears.RemoveAt(index);
                }
            }
            else
            {
                var list = (newGear.IsReverse) ? ReverseGears : ForwardGears;
                list[index] = newGear;
            }

            return(true);
        }
        public void OnAllFast(
            CarTimestamp ct,
            double wheelFL,
            double wheelFR,
            double wheelRR,
            double wheelRL,
            double rpm,
            double steerAngle,
            TransmissionGear transGear,
            int transDir,
            double actTorque,
            double reqTorque,
            int cylinderDeactivation,
            int pedalPos,
            double brakePressure)
        {
            OnWheelspeed(wheelFL, wheelFR, wheelRR, wheelRL, ct);
            OnBrake(brakePressure, ct);

            if (transGear != lastRecvTransmissionGear) {
                Services.Dataset.ItemAs<DateTime>("trans gear change time").Add(HighResDateTime.Now, ct);
                lastRecvTransmissionGear = transGear;
            }
        }
 public static TrackingCommand GetShiftTransmissionCommand(TransmissionGear gear, double?steeringAngle, double?rateLimit, bool waitBoth)
 {
     return(new TrackingCommand(new ShiftSpeedCommand(gear), new ConstantSteeringCommandGenerator(steeringAngle, rateLimit, true), waitBoth));
 }
 public ShiftSpeedCommand(TransmissionGear gear)
 {
     this.gear   = gear;
     this.phase  = Phase.Braking;
     this.result = CompletionResult.Working;
 }
        void IChannelListener.MessageArrived(string channelName, object message)
        {
            if (message is OperationalSimVehicleState)
            {
                OperationalTrace.ThreadTraceSource = TraceSource;
                Trace.CorrelationManager.StartLogicalOperation("simstate callback");
                try {
                    OperationalSimVehicleState state = (OperationalSimVehicleState)message;

                    DatasetSource ds = Services.Dataset;

                    OperationalTrace.WriteVerbose("received operational sim state, t = {0}", state.Timestamp);

                    Services.Dataset.MarkOperation("pose rate", LocalCarTimeProvider.LocalNow);

                    CarTimestamp now = state.Timestamp;
                    ds.ItemAs <Coordinates>("xy").Add(state.Position, now);
                    ds.ItemAs <double>("speed").Add(state.Speed, now);
                    ds.ItemAs <double>("heading").Add(state.Heading, now);
                    ds.ItemAs <double>("actual steering").Add(state.SteeringAngle, now);
                    ds.ItemAs <TransmissionGear>("transmission gear").Add(state.TransmissionGear, now);
                    ds.ItemAs <double>("engine torque").Add(state.EngineTorque, now);
                    ds.ItemAs <double>("brake pressure").Add(state.BrakePressure, now);
                    ds.ItemAs <double>("rpm").Add(state.EngineRPM, now);

                    if (state.TransmissionGear != lastRecvTransGear)
                    {
                        ds.ItemAs <DateTime>("trans gear change time").Add(HighResDateTime.Now, now);
                        lastRecvTransGear = state.TransmissionGear;
                    }

                    lastCarMode = state.CarMode;
                    if (CarModeChanged != null)
                    {
                        CarModeChanged(this, new CarModeChangedEventArgs(lastCarMode, now));
                    }

                    // build the current relative pose matrix
                    Matrix4 relativePose = Matrix4.Translation(state.Position.X, state.Position.Y, 0) * Matrix4.YPR(state.Heading, 0, 0);
                    relativePose = relativePose.Inverse();

                    // push on to the relative pose stack
                    Services.RelativePose.PushTransform(now, relativePose);

                    // push the current absolute pose entry
                    AbsolutePose absPose = new AbsolutePose(state.Position, state.Heading, now);
                    Services.AbsolutePose.PushAbsolutePose(absPose);
                }
                finally {
                    Trace.CorrelationManager.StopLogicalOperation();
                    OperationalTrace.ThreadTraceSource = null;
                }
            }
            else if (message is SceneEstimatorUntrackedClusterCollection)
            {
                // push to obstacle pipeline
                Services.ObstaclePipeline.OnUntrackedClustersReceived(((SceneEstimatorUntrackedClusterCollection)message));
            }
            else if (message is SceneEstimatorTrackedClusterCollection)
            {
                Services.ObstaclePipeline.OnTrackedClustersReceived((SceneEstimatorTrackedClusterCollection)message);
            }
        }
 public override void SetTransmissionGear(TransmissionGear g)
 {
     if (g >= TransmissionGear.First && g <= TransmissionGear.Fourth)
     {
         gear = '1';
     }
     else if (g == TransmissionGear.Reverse)
     {
         gear = 'r';
     }
 }
 public static TrackingCommand GetShiftTransmissionCommand(TransmissionGear gear, double? steeringAngle, double? rateLimit, bool waitBoth)
 {
     return new TrackingCommand(new ShiftSpeedCommand(gear), new ConstantSteeringCommandGenerator(steeringAngle, rateLimit, true), waitBoth);
 }
        /// <summary>
        /// Computes the engine torque and brake pressure needed to achieve a specified acceleration.
        /// </summary>
        /// <param name="ra">Requested acceleration in m/s^2</param>
        /// <param name="vs">Vehicle state</param>
        /// <param name="commandedEngineTorque"></param>
        /// <param name="commandedBrakePressure"></param>
        /// <returns>True if the vehicle state allows the acceleration to be achieved, false otherwise.</returns>
        public static bool GetCommandForAcceleration(double ra, OperationalVehicleState vs, out double commandedEngineTorque, out double commandedBrakePressure)
        {
            // speed, positive for forward motion (m/s)
            double v = Math.Abs(vs.speed);

            // current gear (not just shifter but also first, second, etc)
            TransmissionGear gear = vs.transGear;

            // vehicle pitch, from pose (rad)
            double phi = vs.pitch;

            if (gear == TransmissionGear.Reverse)
            {
                phi = -phi;
            }

            CarTimestamp lastTransChangeTimeTS = Services.Dataset.ItemAs <DateTime>("trans gear change time").CurrentTime;
            DateTime     lastTransChangeTime   = Services.Dataset.ItemAs <DateTime>("trans gear change time").CurrentValue;

            if (gear > TransmissionGear.Fourth || gear < TransmissionGear.Reverse || (lastTransChangeTimeTS.IsValid && (HighResDateTime.Now - lastTransChangeTime) < TimeSpan.FromSeconds(1) && (gear == TransmissionGear.First || gear == TransmissionGear.Reverse)))
            {
                // in park or neutral or have not waited sufficient time after shift, just break out of the function
                commandedEngineTorque  = 0;
                commandedBrakePressure = -TahoeParams.bc0;
                return(false);
            }

            // current gear ratio
            double Nt = Math.Abs(TahoeParams.Nt[(int)gear]);

            // initialize to reasonable default values in case all else fails
            commandedEngineTorque  = 0;
            commandedBrakePressure = -TahoeParams.bc0;

            // effective rotating mass
            double mr = TahoeParams.mr1 +
                        TahoeParams.mr2 * Math.Pow(TahoeParams.Nf, 2) +
                        TahoeParams.mr3 * Math.Pow(TahoeParams.Nf, 2) * Math.Pow(Nt, 2);

            // rolling resistance (N)
            double Rr = 2 * TahoeParams.m * TahoeParams.g * (TahoeParams.rr1 + TahoeParams.rr2 * v);

            double rps2rpm = 60.0 / (2.0 * Math.PI);

            // calculate engine speed in rpm
            double rpme = vs.engineRPM;
            // calculate driveshaft rpm post torque converter
            double rpmd = (v / TahoeParams.r_wheel) * TahoeParams.Nf * Nt * rps2rpm;

            // calculate speed ratio, torque ratio, and capacity factor from lookups
            double sr = rpmd / rpme;
            // tr = interp1(srlu, trlu, sr, 'linear', 'extrap');
            double tr = TahoeParams.TorqueRatio(sr);

            //Dataset.Source.DatasetSource ds = Operational.Instance.Dataset;

            // calculate bleed-off torque
            double bleed_torque = TahoeParams.bleed_off_power / (rpme / rps2rpm);

            // requested acceleration in Newtons
            double ra_corr = (TahoeParams.m + mr) * ra;
            // drag force
            double drag = 0.5 * TahoeParams.rho * TahoeParams.cD * TahoeParams.cxa * Math.Pow(v, 2);
            // pitch force
            double pitch_corr = -TahoeParams.m * TahoeParams.g * Math.Sin(phi);

            // needed wheel torque (N-m)
            double wheelTorque = (ra_corr + Rr + drag + pitch_corr) * TahoeParams.r_wheel;

            // commanded engine torque (N-m) to achieve desired acceleration
            commandedEngineTorque = wheelTorque / (Nt * TahoeParams.Nf * TahoeParams.eta * tr);

            DateTime now = DateTime.Now;
            //ds.ItemAs<double>("torque multiplier").Add(tr, now);
            //ds.ItemAs<double>("speed - Rr").Add(Rr, now);
            //ds.ItemAs<double>("speed - ra").Add(ra_corr, now);
            //ds.ItemAs<double>("speed - pitch").Add(pitch_corr, now);
            //ds.ItemAs<double>("speed - drag").Add(drag, now);
            //ds.ItemAs<double>("speed - wheel torque").Add(wheelTorque, now);
            //ds.ItemAs<double>("speed - eng torque").Add(commandedEngineTorque, now);

            // retrieve the current engine torque, brake pressure
            double current_brake_pressure = vs.brakePressure;

            // decide to apply master cylinder pressure or engine torque
            // check if we want to apply less torque than is the minimum
            if (commandedEngineTorque < TahoeParams.Te_min)
            {
                // assume that the current engine torque is just the minimum delivered engine torque
                double current_engine_torque = TahoeParams.Te_min;
                double Btrq = Nt * TahoeParams.Nf * TahoeParams.eta / TahoeParams.r_wheel;

                // actual acceleration with no extra torque applied (m / s^2)
                double aa = -(Rr + 0.5 * TahoeParams.rho * TahoeParams.cD * TahoeParams.cxa * Math.Pow(v, 2) -
                              TahoeParams.m * TahoeParams.g * Math.Sin(phi)) / (TahoeParams.m + mr) +
                            (Btrq * tr * (current_engine_torque - bleed_torque)) / (TahoeParams.m + mr);

                // residual brake acceleration (m / s^2)
                double ba = ra - aa;                 // if ba > 0, engine braking is enough

                // desired master cylinder pressure (GM units, approx 22 to 50)
                double mcp = -TahoeParams.bc0;
                if (ba < 0)
                {
                    // compute braking coefficent (which was empirically determined to be speed dependent)
                    double bc = TahoeParams.bc1 + TahoeParams.bcs * Math.Sqrt(v);
                    mcp = (-(TahoeParams.m + mr) * ba * TahoeParams.r_wheel / bc) - TahoeParams.bc0;
                }

                // set commanded engine torque to 0
                commandedEngineTorque = 0;
                // assign master cylinder pressure
                commandedBrakePressure = Math.Round(mcp, 0);
                return(true);
            }
            else
            {
                // we want to command engine torque
                // check if the brake is off (if not, don't apply engine torque)
                if (current_brake_pressure >= 24)
                {
                    commandedBrakePressure = -TahoeParams.bc0;
                    commandedEngineTorque  = 0;
                    return(false);
                }
                // add in the bleed off torque
                commandedEngineTorque += bleed_torque;
                // zero out the commande brake pressure
                commandedBrakePressure = -TahoeParams.bc0;
                return(true);
            }
        }
 public ShiftSpeedCommand(TransmissionGear gear)
 {
     this.gear = gear;
     this.phase = Phase.Braking;
     this.result = CompletionResult.Working;
 }
 public abstract void SetTransmissionGear(TransmissionGear gear);
        public void SetCommand(double? engineTorque, double? brakePressue, double? steeringAngle, TransmissionGear? gear)
        {
            // break out if we're in test mode
            if (Settings.TestMode) {
                return;
            }

            if (steeringAngle.HasValue) {
                int tempSteeringValue = (int)((steeringAngle.Value * 180 / Math.PI) / 0.0625);
                lastSteeringValue = (short)tempSteeringValue;
            }
            else {
                lastSteeringValue = null;
            }

            if (brakePressue.HasValue) {
                // do a check on brake values
                if (brakePressue.Value < 22)
                    brakePressue = 22;
                if (brakePressue.Value > 65)
                    brakePressue = 65;

                lastBrakeValue = (byte)Math.Round(brakePressue.Value, 0);
            }
            else {
                lastBrakeValue = null;
            }

            if (engineTorque.HasValue) {
                // map the value of throttle to torque
                lastThrottleValue = MapThrottle(engineTorque.Value);
            }
            else {
                lastThrottleValue = null;
            }

            if (gear.HasValue) {
                switch (gear.Value) {
                    case TransmissionGear.First:
                    case TransmissionGear.Second:
                    case TransmissionGear.Third:
                    case TransmissionGear.Fourth:
                        lastTransmissionValue = ActuationCommandInterface.TRANS_GEAR_DRIVE;
                        break;

                    case TransmissionGear.Reverse:
                        lastTransmissionValue = ActuationCommandInterface.TRANS_GEAR_REV;
                        break;

                    case TransmissionGear.Park:
                        lastTransmissionValue = ActuationCommandInterface.TRANS_GEAR_PARK;
                        break;

                    case TransmissionGear.Neutral:
                        lastTransmissionValue = ActuationCommandInterface.TRANS_GEAR_NEUTRAL;
                        break;

                    default:
                        lastTransmissionValue = null;
                        break;
                }
            }
            else {
                lastTransmissionValue = null;
            }
        }
        void IChannelListener.MessageArrived(string channelName, object message)
        {
            if (message is OperationalSimVehicleState) {
                OperationalTrace.ThreadTraceSource = TraceSource;
                Trace.CorrelationManager.StartLogicalOperation("simstate callback");
                try {
                    OperationalSimVehicleState state = (OperationalSimVehicleState)message;

                    DatasetSource ds = Services.Dataset;

                    OperationalTrace.WriteVerbose("received operational sim state, t = {0}", state.Timestamp);

                    Services.Dataset.MarkOperation("pose rate", LocalCarTimeProvider.LocalNow);

                    CarTimestamp now = state.Timestamp;
                    ds.ItemAs<Coordinates>("xy").Add(state.Position, now);
                    ds.ItemAs<double>("speed").Add(state.Speed, now);
                    ds.ItemAs<double>("heading").Add(state.Heading, now);
                    ds.ItemAs<double>("actual steering").Add(state.SteeringAngle, now);
                    ds.ItemAs<TransmissionGear>("transmission gear").Add(state.TransmissionGear, now);
                    ds.ItemAs<double>("engine torque").Add(state.EngineTorque, now);
                    ds.ItemAs<double>("brake pressure").Add(state.BrakePressure, now);
                    ds.ItemAs<double>("rpm").Add(state.EngineRPM, now);

                    if (state.TransmissionGear != lastRecvTransGear) {
                        ds.ItemAs<DateTime>("trans gear change time").Add(HighResDateTime.Now, now);
                        lastRecvTransGear = state.TransmissionGear;
                    }

                    lastCarMode = state.CarMode;
                    if (CarModeChanged != null) {
                        CarModeChanged(this, new CarModeChangedEventArgs(lastCarMode, now));
                    }

                    // build the current relative pose matrix
                    Matrix4 relativePose = Matrix4.Translation(state.Position.X, state.Position.Y, 0)*Matrix4.YPR(state.Heading, 0, 0);
                    relativePose = relativePose.Inverse();

                    // push on to the relative pose stack
                    Services.RelativePose.PushTransform(now, relativePose);

                    // push the current absolute pose entry
                    AbsolutePose absPose = new AbsolutePose(state.Position, state.Heading, now);
                    Services.AbsolutePose.PushAbsolutePose(absPose);
                }
                finally {
                    Trace.CorrelationManager.StopLogicalOperation();
                    OperationalTrace.ThreadTraceSource = null;
                }
            }
            else if (message is SceneEstimatorUntrackedClusterCollection) {
                // push to obstacle pipeline
                Services.ObstaclePipeline.OnUntrackedClustersReceived(((SceneEstimatorUntrackedClusterCollection)message));
            }
            else if (message is SceneEstimatorTrackedClusterCollection) {
                Services.ObstaclePipeline.OnTrackedClustersReceived((SceneEstimatorTrackedClusterCollection)message);
            }
        }
 public ConstantSpeedCommandGenerator(double engineTorque, double brakePressure, TransmissionGear? transGear)
 {
     this.engineTorque = engineTorque;
     this.brakePressure = brakePressure;
     this.transGear = transGear;
 }
		// --------------------------------------------------------------------------------
		// checks whether the gear is consistent with the current throttle and speed setting
		// shifts gears if necessary
		private void CheckGear() {
			// convert speed to mph
			double spd = speed * 2.23693629;

			if (throttle < 0.125) {
				// gentle acceleration
				switch (gear) {
					case TransmissionGear.First:
						// upshift
						if (spd > 10.0)
							gear = TransmissionGear.Second;
						// no downshift
						break;
					case TransmissionGear.Second:
						// upshift
						if (spd > 16.0)
							gear = TransmissionGear.Third;
						// downshift
						if (spd < 7.5)
							gear = TransmissionGear.First;
						break;
					case TransmissionGear.Third:
						// upshift
						if (spd > 24.0)
							gear = TransmissionGear.Fourth;
						// downshift
						if (spd < 7.5)
							gear = TransmissionGear.Second;
						break;
					case TransmissionGear.Fourth:
						// no upshift (no 4-lock)
						// downshift
						if (spd < 20.0)
							gear = TransmissionGear.Third;
						break;
				}
			}
			else if (throttle > 0.875) {
				// jackass acceleration
				switch (gear) {
					case TransmissionGear.First:
						// upshift
						if (spd > 32.5)
							gear = TransmissionGear.Second;
						// no downshift
						break;
					case TransmissionGear.Second:
						// upshift
						if (spd > 63.0)
							gear = TransmissionGear.Third;
						// downshift
						if (spd < 26.0)
							gear = TransmissionGear.First;
						break;
					case TransmissionGear.Third:
						// upshift
						if (spd > 101.0)
							gear = TransmissionGear.Fourth;
						// downshift
						if (spd < 62.0)
							gear = TransmissionGear.Second;
						break;
					case TransmissionGear.Fourth:
						// no upshift (no 4-lock)
						// downshift
						if (spd < 97.0)
							gear = TransmissionGear.Third;
						break;
				}
			}
			else {
				// midrange acceleration
				switch (gear) {
					case TransmissionGear.First:
						// upshift
						if (throttle < (0.875 - 0.125) * (spd - 10.0) / (32.5 - 10.0) + 0.125)
							gear = TransmissionGear.Second;
						// no downshift
						break;
					case TransmissionGear.Second:
						// upshift
						if (throttle < (0.875 - 0.125) * (spd - 16.0) / (63.0 - 16.0) + 0.125)
							gear = TransmissionGear.Third;
						// downshift
						if (speed < 7.5)
							gear = TransmissionGear.First;
						break;
					case TransmissionGear.Third:
						// upshift
						if (throttle < (0.875 - 0.125) * (spd - 24.0) / (101.0 - 24.0) + 0.125)
							gear = TransmissionGear.Fourth;
						// downshift
						if (throttle > (0.875 - 0.375) * (spd - 7.5) / (43.0 - 7.5) + 0.375)
							gear = TransmissionGear.Second;
						else if (speed < 7.5)
							gear = TransmissionGear.First;
						break;
					case TransmissionGear.Fourth:
						// no upshift (no 4-lock)
						// downshift
						if (throttle > (0.875 - 0.125) * (spd - 20.0) / (76.0 - 20.0) + 0.125)
							gear = TransmissionGear.Third;
						break; //
				}
			}
		}
        public void SetCommand(double? engineTorque, double? brakePressue, double? steering, TransmissionGear? gear)
        {
            if (Settings.TestMode)
                return;

            if (steering.HasValue && Math.Abs(steering.Value) > TahoeParams.SW_max) {
                OperationalTrace.WriteWarning("steering out of range: received {0}, limit {1}", steering.Value, TahoeParams.SW_max);
            }

            //Console.WriteLine("command--steering: {0}, torque: {1}, brake: {2}, gear: {3}", steering, engineTorque, brakePressue, gear);

            try {
                dynamicsSim.SetSteeringBrakeThrottle(steering, engineTorque, brakePressue);

                if (gear.HasValue) {
                    dynamicsSim.SetTransmissionGear(gear.Value);
                }
            }
            catch (SocketException) {
                // get the DynamicsSimFacade
                dynamicsSim = (DynamicsSimFacade)CommBuilder.GetObject(DynamicsSimFacade.ServiceName);
                throw;
            }
        }
 public OperationalSpeedCommand(double engineTorque, double brakePressure, TransmissionGear? transGear)
 {
     this.engineTorque = engineTorque;
     this.brakePressure = brakePressure;
     this.transGear = transGear;
 }