blekenbleu

signal processing, XR, sims, microscopes, STM32, ESP32


back

Oversteer

Whatever it is, let us agree that understeer is its opposite.
Wikipedia:  “Understeer Angle is the amount of additional steering (at road wheels)
  that must be added in any given steady-state maneuver beyond the Ackermann steer angle”


by Wikipedia definition, B and D would represent understeer

tangential speed v vs yaw velocity ω

  • straight line speed is tangential speed with infinite radius and zero yaw velocity
  • yaw velocity ω (SimHub OrientationYawVelocity) is already vehicle center of gravity angular velocity;  v = ω*R
  • SimHub AccelerationSway is lateral acceleration required to follow a curve of some radius R:  v*v/R
  • vehicles lack perfect grip for generating lateral acceleration to follow ideal curves
  • side slip rate is the difference between AccelerationSway and v*ω
  • lateral velocity is time integral of side slip rate
  • center of gravity (body) slip angle is ratio of lateral velocity / tangential speed
  • rear wheel slip angles sum vehicle yaws relative to trajectories and body slip angles
  • front wheel slip angles sum steering angles, vehicle yaws relative to trajectories, and center of gravity slip angles

lateral velocity wants numerical integration;  simplifying approximations?

Front tire slip ~ (steering angle + yaw velocity) - (side slip rate / tangential speed))
Rear tire Slip ~ yaw velocity - (side slip rate / tangential speed)

  • alternative (1) for oversteer:  more slip at rear tires than front
  • alternative (2):  vehicle yaw relative to vehicle direction (B, C, D, E)
  • alternative (3):  vehicle side slip rate with steering changes

Assetto Corsa wheel slip telemetry for alternative (1):

DataCorePlugin.GameRawData.Physics.WheelSlip04 + DataCorePlugin.GameRawData.Physics.WheelSlip03 - (DataCorePlugin.GameRawData.Physics.WheelSlip02 + DataCorePlugin.GameRawData.Physics.WheelSlip01)
At least one issue:  locked brakes in a straight line presents as massive over- or understeer,
    depending on which end locks up first/most.

SimHub telemetry for alternative (3):

AccelerationSway - rescale * OrientationYawVelocity
where rescale zeroes average differences for small AccelerationSway values.

@rangerover estimates Wikipedia’s oversteer

// Angular velocities in radians per second var angle1 = $prop(‘GameRawData.mAngularVelocity01’); // [ UNITS = Radians per-second ] (roll rate) var angle2 = $prop(‘GameRawData.mAngularVelocity02’); // [ UNITS = Radians per-second ] (yaw rate) var angle3 = $prop(‘GameRawData.mAngularVelocity03’); // [ UNITS = Radians per-second ] (pitch rate)

// Normalized steering input var steeringInput = $prop(‘GameRawData.mSteering’); // [ RANGE = -1.0f->1.0f ] var steeringAngleDeg = steeringInput * 24; //Typical steering angle 24 degrees, match to what is set in game

// Convert normalized steering input to actual steering angle in radians var steeringAngleRad = steeringAngleDeg * degreeRad;

// Local velocities in metres per second var local1 = $prop(‘GameRawData.mLocalVelocity01’); // [ UNITS = Metres per-second ] (Lateral velocity) var local2 = $prop(‘GameRawData.mLocalVelocity02’); // [ UNITS = Metres per-second ] (Vertical velocity, not used in slip angle calculations) var local3 = $prop(‘GameRawData.mLocalVelocity03’); // [ UNITS = Metres per-second ] (Longitudinal velocity)

// Assumed distances to front and rear axles in meters not available in game var L_f = 1.2; // Distance to front axle [ UNITS = Metres ] var L_r = 1.6; // Distance to rear axle [ UNITS = Metres ]

// Extract yaw rate, lateral and longitudinal velocities var yaw_rate = angle2; // Yaw rate in rad/s var v_y = local1; // Lateral velocity in m/s var v_x = local3; // Longitudinal velocity in m/s

// Calculate front slip angle in radians from simplified equation var alpha_f = steeringAngleRad - Math.atan((v_y + L_f * yaw_rate) / v_x);

// Calculate rear slip angle in radians from simplified equation var alpha_r = -Math.atan((v_y - L_r * yaw_rate) / v_x);

// Convert slip angles from radians to degrees var alpha_f_deg = alpha_f * (180 / Math.PI); var alpha_r_deg = alpha_r * (180 / Math.PI);

//Output Oversteer in degrees var over = Math.abs(alpha_r_deg) - Math.abs(alpha_f_deg); //Oversteer if(over<=0){ over = 0; } var pit = $prop(‘IsInPit’); var game = NewRawData().mGameState; if(pit !=1 && game!=4 ){ return Math.abs(over) * 10; } return 0 ```

Plugin derivative of RangeRover slip angle calculator

  • ignores center of gravity
  • arctan only of 1000 * (game-independent) AccelerationSway divided by SpeedKmh
    • steering and yaw are already angles

SimHub AccelerationSway

  • By observation, does not change sign while steering stays one side of center
  • some games have local velocity X and local acceleration X properties…
    • but acceleration plot does not zero when velocity plot has zero slope:

          local acceleration plots match AccelerationSway

slip angle properties - mostly from Load.cs SlipAngle()

  • YawRate:  OrientationYawVelocity radians per second
  • LPdiff:  LPyaw - View.Model.SlipGain * LPsway
  • RangeRover:  slip angle including steering
  • SlipAngle:  *slip angle without steering ayaw - View.Model.SlipGain * asway
  • SwayAcc:  AccelerationSway really, lateral velocity
  • Steering:  game0dependent steering wheel telemetry converted to radians
  • SwayRate:  Math.Atan(1000 * SwayAcc / SpeedKmh)
  • Vsway:  game-dependent lateral velocity
  • YawRate:  OrientationYawVelocity vehicle angle relative to trajectory