Polaris Ranger Dynamics#
This page gives the full model of the Polaris Ranger CREW XP 1000 as AcresUtvModel computes it.
The model has the mass properties, the engine, the CVT, the gear lever, the drive modes, the brakes, the steering and the suspension.
Scope and Assumptions#
AcresUtvModel.h and AcresUtvModel.cpp are an engine-free model. The game and ACRES Core compile the same source file.
The model computes these quantities in each physics step.
- The mass, the centre of mass, the inertia and the static corner loads.
- The engine torque, the engine speed, the fuel flow and the energy ledger.
- The capacity of the primary clutch and the ratio of the CVT belt.
- The speed of each wheel for the gear and the drive mode.
- The brake torque of each wheel and the angle of each front wheel.
The model uses three other models.
- The tyre, the soil and the suspension contact come from
AcresSim::PrepareWheel. Refer to Tyre and Soil. - The actuators of the drive-by-wire and the ULC give the pedal, the line pressure, the steering wheel angle and the gear. Refer to Drive-by-Wire and ULC.
- The energy ledger and the fuel line come from
AcresPowerModel. Refer to Energy and Fuel.
The model makes these assumptions.
- The chassis is one rigid body. Chaos integrates the body in the game.
FAcresPolarisintegrates the body in ACRES Core. - Each corner has an independent suspension with a linear spring, a linear damper and a quadratic bump stop.
- The model has no anti-roll bar.
- The front wheels obey the ideal Ackermann geometry.
- The CVT is a quasi-static shift law with a first-order lag. The model has no sheave forces.
- The tyre force on a hard surface has no load sensitivity, no camber effect and no aligning torque.
- The engine has no temperature state and no starter. The engine runs from the start of the session.
The model uses SI units. The fields of the drive-by-wire keep the units of the messages: degrees, percent and bar.
The body frame has x forward, y to the left and z up. A positive steering angle turns the vehicle to the left.
The wheels have the indices 0 (front left), 1 (front right), 2 (rear left) and 3 (rear right).
The positions of the masses start at base_footprint.
Symbols#
| Symbol | Quantity | Unit |
|---|---|---|
| \(m\), \(m_i\) | Total mass and mass of part \(i\) | kg |
| \(\mathbf{r}_i = (x_i, y_i, z_i)\) | Position of part \(i\) from base_footprint |
m |
| \(x_{cg}, y_{cg}, z_{cg}\) | Centre of mass: forward, left, height | m |
| \(k_x, k_y, k_z\) | Radii of gyration of the dry vehicle: roll, pitch, yaw | m |
| \(I_{xx}, I_{yy}, I_{zz}\) | Moments of inertia about the centre of mass | kg·m² |
| \(L\), \(b_f\), \(b_r\) | Wheelbase, front track, rear track | m |
| \(N_j\), \(N_{0,j}\) | Normal load and static load of wheel \(j\) | N |
| \(k_j\), \(c_j\), \(\zeta\) | Spring rate, damper rate and damping ratio of a corner | N/m, N·s/m, - |
| \(k_{tyre}\), \(k_{wheel}\) | Rate of the tyre membrane and wheel rate of the suspension | N/m |
| \(p_i\), \(p_c\), \(b\) | Inflation pressure, carcass pressure and width of a tyre | Pa, Pa, m |
| \(x_s\), \(x_0\), \(x_b\) | Compression of the suspension, static compression, start of the bump stop | m |
| \(k_b\) | Rate of the bump stop | N/m² |
| \(v_n\) | Speed of the contact point along the ground normal | m/s |
| \(R_t\) | Unloaded tyre radius | m |
| \(\theta_{sw}\), \(\theta_c\) | Steering wheel angle and its centre | deg |
| \(i_s\) | Steering ratio | - |
| \(\delta\), \(\delta_{in}\), \(\delta_{out}\) | Bicycle angle, angle of the inner and of the outer front wheel | rad |
| \(r_c\) | Turn radius at the centre of the rear axle | m |
| \(n\), \(\omega_e\) | Engine speed | rev/min, rad/s |
| \(n_k\) | Engine speed in 1000 rev/min | krpm |
| \(n_{idle}\), \(\omega_{idle}\) | Idle speed | rev/min, rad/s |
| \(p\) | Pedal position, 0 to 1 | - |
| \(\gamma\) | Exponent of the pedal map | - |
| \(u\), \(u^*\), \(u_{idle}\) | Torque request of the engine, its target and the request of the idle governor, 0 to 1 | - |
| \(k_{idle}\), \(\tau_e\) | Gain of the idle governor, time constant of the torque request | -, s |
| \(g_v\), \(v_{max}\), \(v_r\) | Factor of the top speed governor, governed speed, speed of the rear wheels | -, m/s, m/s |
| \(T_{wot}\), \(T_{fr}\), \(T_{pu}\) | Full-load torque, friction torque, closed-throttle pumping torque | N·m |
| \(f_0\), \(f_1\), \(f_2\), \(p_{pu}\) | Coefficients of the friction mean effective pressure, pumping mean effective pressure | bar |
| \(V_d\) | Displacement of the engine | L |
| \(T_e\), \(T_{acc}\), \(T_{peak}\) | Brake torque of the engine, accessory drag, peak of the full-load curve | N·m |
| \(\omega_{free}\) | Engine speed at the end of the step without a clutch torque | rad/s |
| \(J_e\), \(J_w\), \(J_s\) | Inertia of the engine, of a wheel and of the secondary clutch | kg·m² |
| \(T_c\) | Torque through the primary clutch. Positive when the engine drives. | N·m |
| \(C\), \(C_{max}\), \(C_{ebs}\) | Capacity of the centrifugal clutch, its maximum, capacity of the EBS | N·m |
| \(C_{fwd}\), \(C_{rev}\) | Capacity of the clutch for drive and for engine braking | N·m |
| \(\omega_{eng}\), \(\omega_{full}\) | Engine speed at which the clutch starts to grip and at which it has full capacity | rad/s |
| \(r\), \(r^*\), \(r_{low}\), \(r_{high}\) | Ratio of the CVT belt (primary speed divided by secondary speed), its target and its limits | - |
| \(n_s\), \(n_{light}\), \(n_{full}\) | Shift speed, shift speed without torque and at peak torque | rev/min |
| \(\sigma\), \(\tau_{cvt}\) | Torque share of the belt, time constant of the belt ratio | -, s |
| \(\omega_s\) | Speed of the secondary clutch | rad/s |
| \(i_r\), \(i_f\), \(i_d\) | Rear reduction, front prop shaft reduction, front drive ratio of the gear | - |
| \(d\) | Direction of the gear: 1, -1 or 0 | - |
| \(R\) | Signed overall ratio: engine speed divided by rear carrier speed | - |
| \(K\) | Speed of the front ring divided by the speed of the rear carrier | - |
| \(c\), \(\bar c\) | Speed of the rear carrier at the end of the step, mean speed of the step | rad/s |
| \(\omega_j\) | Spin of wheel \(j\) | rad/s |
| \(T_j(\omega)\), \(T_{need}(c)\) | Shaft torque that wheel \(j\) needs, torque that all wheels need at the rear carrier | N·m |
| \(T_{roll}\), \(T_{brake}\), \(T_{park}\) | Rolling resistance torque, brake torque, maximum torque of the park pawl | N·m |
| \(\eta\), \(D(T_c)\) | Efficiency of the belt and the gears, torque that the clutch delivers to the rear carrier | -, N·m |
| \(P_{line}\), \(P_{out}\), \(P_{bias}\), \(P_{max}\) | Line pressure, output pressure, pressure bias, full-scale pressure | bar |
| \(G_f\), \(G_r\) | Brake torque for each bar at a front wheel and at a rear wheel | N·m/bar |
| \(\mathbf{v}\), \(v_j\) | Velocity of the vehicle, forward speed of the contact point of wheel \(j\) | m/s |
| \(\rho\), \(C_d A\) | Density of the air, drag area | kg/m³, m² |
| \(F_{shear}\), \(F_{mr}\) | Shear force of the tyre, motion resistance of the soil | N |
| \(P_b\), \(P_{fr}\), \(P_{pu}\), \(P_{fuel}\) | Brake power, friction power, pumping power, fuel power | W |
| \(\eta_i\), \(H_u\), \(\rho_f\) | Indicated efficiency, heating value and density of the fuel | -, J/kg, kg/L |
| \(\bar\omega_e\) | Mean engine speed of the step | rad/s |
Conventions gives \(\Delta t\), \(g\), \(\operatorname{clamp}\) and \(\operatorname{sgn}\).
The function \(\operatorname{lag}\) is the first-order lag of the models (AcresSim::Lag).
Physics Step#
One physics step calls the model in this sequence. The step is 1/120 s in the game.
StepDbw(Dt, P, Command, S); // actuators, ULC, gear
StepUtvSteering(Dt, P, S); // road wheel angles
StepUtvPowertrain(Dt, P, S); // engine, CVT, clutch capacities
for (int I = 0; I < 4; ++I)
PrepareUtvWheel(Dt, I, P, Surface[I], Sample[I], S);
SolveUtvDriveline(Dt, P, S); // wheel spins, engine speed, fuel, ledger
The caller then applies the forces of the wheels to the chassis.
The caller is AAcresVehiclePawn::AsyncPhysicsTickActor in the game and FAcresPolaris::Step in ACRES Core.
Mass and Geometry#
Source: FinalizeUtvParameters.
The model adds the masses of the parts. Each part is a point mass at a position \((x, y, z)\). The dry vehicle also has its own inertia.
| Part | Mass | Position | Mass Key |
|---|---|---|---|
| Dry vehicle | 1063 kg | (1.205, 0, 0.62) m | mass.dry_kg |
| Fluids: fuel, oil, coolant | 40 kg | (0.9, 0, 0.45) m | mass.fluids_kg |
| Roof rack with sensors | 15 kg | (2.3, 0, 1.95) m | mass.roof_equipment_kg |
| Electronics bay | 30 kg | (0.95, -0.45, 0.7) m | mass.bay_equipment_kg |
| Each occupant | 85 kg | The seat position | mass.occupant_kg |
| Cargo in the bed | 0 kg | (-0.2, 0, 0.9) m | mass.cargo_kg |
The total mass and the centre of mass are the sums over all parts.
The inertia is the inertia of the dry vehicle plus the parallel-axis term of each part. The sum includes the dry vehicle. With \(\Delta\mathbf{r}_i = \mathbf{r}_i - \mathbf{r}_{cg}\):
The static axle loads come from the pitch moment balance. The lateral offset of the centre of mass divides each axle load.
The shipped configuration with one occupant gives these values. The test program and the log of the game show the same values.
| Quantity | Value |
|---|---|
| Total mass | 1233.0 kg |
| Centre of mass | 1.243 m forward, 0.014 m to the left, 0.655 m high |
| Front axle share of the weight | 43.3 % |
| Inertia: roll, pitch, yaw | 318, 1374 and 1475 kg·m² |
FinalizeUtvParameters also fills the wheel parameter set (FUtvParameters::Wheel) that the shared tyre code reads.
The body origin of the shared code is 40 % of the wheelbase forward of the rear axle.
Suspension#
Source: ResetUtv in AcresUtvModel.cpp, ResetVehicle and SuspensionLoad in AcresVehicleModel.cpp.
The spring of a corner is the tyre in series with the wheel rate of the suspension. The tyre rate is the rate of the inflated membrane with the inflation pressure \(p_i\), the carcass pressure \(p_c\) and the tyre width \(b\).
The damper gives the damping ratio \(\zeta\) on the mass that the corner carries.
The normal load uses the compression \(x_s\) and the speed \(v_n\) of the contact point along the ground normal.
| Term | Value | Source |
|---|---|---|
| \(x_0\) | 0.1 m | suspension.droop_m. The spring carries the static load at this compression. |
| \(x_b\) | 0.2494 m | \(\max(x_0 + 0.01,\ \text{travel} - \text{bump stop length})\) |
| \(k_b\) | 2 000 000 N/m² | suspension.bump_stop_rate_n_m2 |
The caller gives the extension \(s\) of the ground probe. The compression is \(x_s = 0.5 - s\). The extension is 0.4 m when the vehicle is stationary on level ground. A wheel has no contact when \(s > 0.5\) m. The defaults give corner rates of approximately 17.9 kN/m at the front and 24.7 kN/m at the rear.
Tyres#
Source: PrepareUtvWheel, which calls AcresSim::PrepareWheel with the wheel parameter set of the Polaris.
The Polaris uses the shared tyre and soil model without changes. Tyre and Soil gives the equations. This table shows what the Polaris uses and which keys set it.
| Part of the Shared Model | Use on the Polaris | Keys |
|---|---|---|
| Inflated membrane | The deflection and the contact area on hard ground: \(A = N / (p_i + p_c)\). | tyres.*_inflation_kpa, tyres.carcass_kpa |
| Tyre on soil | The sinkage, the soil thrust and the motion resistance on deformable ground. The sinkage limit is 0.2 m. | tyres.lug_height_m, tyres.lug_area_ratio, tyres.tread_k_m |
| Soil class | The soil class of the mapped soil unit below each wheel. The default class is silt loam. | tractor.json, block soil |
| Hard-surface friction | \(F_x = \mu N \tanh(k_s s)\) with the slip \(s\) and the wet-film friction \(\mu\). | tyres.hard_slip_stiffness |
| Lateral force | \(F_y = -C_\alpha N \alpha\), with a relaxation length and the friction circle. | tyres.cornering_per_load, tyres.relaxation_m |
| Rolling resistance on soil | The coefficient is \(h\, \delta_t / h_s\) with the deflection \(\delta_t\) and the section height \(h_s\). | tyres.hysteresis, tyres.section_height_m |
| Rolling resistance on hard ground | The coefficient of the surface table. | tractor.json, block surfaces |
The slip reference is the unloaded radius \(R_t\) = 0.3429 m. The Polaris does not use the brake law of the tractor. Refer to Brakes.
Steering#
Source: StepUtvSteering, AcresSim::Ackermann.
The steering wheel angle gives the bicycle angle. The centre \(\theta_c\) is the steering wheel angle at which the vehicle moves straight.
The front wheels then obey the ideal Ackermann geometry. For \(|\delta| \ge 10^{-5}\) rad:
The left wheel is the inner wheel in a left turn. In a right turn the two angles are negative and the right wheel is the inner wheel. The rear wheels do not steer.
The steering wheel angle comes from the steering servo or from the driver. Its range is ±487° (dbw.steering.lock_deg).
That range gives a maximum bicycle angle of 40.7°. Drive-by-Wire and ULC gives the servo, its delay and its rate limits.
Engine#
Source: UtvEngineCurves, StepUtvPowertrain.
The engine is the ProStar 999 cm³ twin. Three curves describe it.
The full-load torque \(T_{wot}(n)\) is a linear interpolation of the torque curve. It is 0 at and above engine.max_rpm.
| Speed (rev/min) | 1250 | 2000 | 3000 | 4000 | 5000 | 5750 | 6500 | 7000 | 7500 | 8000 |
|---|---|---|---|---|---|---|---|---|---|---|
| Torque (N·m) | 52 | 62 | 70 | 76 | 81 | 84.1 | 84 | 83.4 | 74 | 0 |
The friction torque and the pumping torque come from mean effective pressures. One bar is 7.95 N·m for the displacement \(V_d\) = 0.999 L.
Here \(n_k\) is the engine speed in 1000 rev/min. The pressures are in bar: \(f_0\) = 0.8, \(f_1\) = 0.12, \(f_2\) = 0.03 and \(p_{pu}\) = 0.8. At idle the friction torque is 7.9 N·m and the pumping torque is 6.4 N·m.
The governor of the top speed limits the request above the maximum speed \(v_{max}\). \(v_r\) is the mean speed of the rear wheels.
The idle governor holds the idle speed \(\omega_{idle}\). Its feed-forward term balances the friction, the pumping and the accessories at idle.
The torque request is the larger of the pedal request and the idle request. The request is 0 when the fuel tank is empty. A first-order lag with the time constant \(\tau_e\) gives the request that the engine uses.
The engine has fuel when \(u > 0\), \(T_{wot} > 0\) and the tank is not empty. With the indicator \(f\) (1 with fuel, 0 without):
Thus \(u = 1\) gives the full-load curve. \(u = 0\) gives the motoring curve without fuel. The rev limiter stops the fuel at engine.max_rpm.
The free engine speed is the speed at the end of the step without a clutch torque.
CVT and Primary Clutch#
Source: StepUtvPowertrain.
The primary clutch is centrifugal. Its capacity grows with the square of the free engine speed between the engagement speed and the full engagement speed.
The Engine Braking System (EBS) couples the belt in the reverse direction. Its capacity decreases to 0 at idle speed.
\(C_{ebs}\) is 0 when cvt.ebs is false. The two capacities of the clutch are:
The two capacities are 0 in park and in neutral.
The belt ratio moves to the ratio that holds the engine at a shift speed. The shift speed increases with the torque that the belt transmits. The model uses the clutch torque \(T_c\) of the previous step.
The secondary speed is \(\omega_s = \left|\tfrac{1}{2}(\omega_2 + \omega_3)\right| i_r\). The belt grips when the transmission is in a gear and one of these conditions is true.
- \(C > 0\).
- \(C_{ebs} > 0\) and \(T_c < 0\).
\(T_{peak}\) is the highest torque of the torque curve, 84.1 N·m.
Gear Lever#
Source: GearRatios and StepUtvPowertrain in AcresUtvModel.cpp.
The gear lever has five positions. The numbers are the values of ds_dbw_msgs/Gear.
| Position | Value | Direction | Rear Reduction | Front Reduction | Ring Ratio |
|---|---|---|---|---|---|
| P (park) | 1 | 0 | 0 | 0 | 0.925 |
| R (reverse) | 2 | -1 | 27.39 | 9.16 × 3.23 | 0.926 |
| N (neutral) | 3 | 0 | 0 | 0 | 0.925 |
| H (high) | 4 | 1 | 13.01 | 4.35 × 3.23 | 0.926 |
| L (low) | 5 | 1 | 28.84 | 9.65 × 3.23 | 0.925 |
The columns are the direction \(d\), the rear reduction \(i_r\), the front reduction \(i_f\, i_d\) and the ring ratio \(K\). The front ring turns at \(K\) times the speed of the rear carrier.
Park and neutral use the ratio of L for \(K\). Park locks the output of the transmission with a pawl. In a gear, the secondary clutch and the gearbox turn with the rear axle. The two rear wheels divide this inertia.
A change of the gear occurs only below 0.3 m/s and has a duration of 1 s. The transmission is in neutral during the change. The gear actuator of Drive-by-Wire and ULC applies this rule to the driver and to a gear command.
Drive Modes#
Source: SolveUtvDriveline.
The AWD switch has three positions.
| Mode | Value | Rear Differential | Front Axle |
|---|---|---|---|
| Turf | 0 | Open | Not driven |
| 2WD | 1 | Locked | Not driven |
| AWD | 2 | Locked | The demand drive engages when the rear wheels slip. |
In AWD, each front wheel has an overrunning clutch. The front ring turns at the speed \(K c\). The clutch of a front wheel locks when that wheel needs torque in the direction of the ring to turn at the ring speed. The front ring is 7.5 % slower than the rear carrier. Thus the front wheels engage when the rear wheels slip more than approximately 7.5 %.
The front axle locks in two directions in these conditions.
- The gear lever is in park and the mode is AWD.
- Active Descent Control is on (
cvt.adc) and the pedal is below 2 %.
Driveline Solve#
Source: SolveUtvDriveline, with WheelShaftTorqueNm, FreeWheelSpeedRadS, AxleCarrierTorqueNm, RisingRoot and SettleWheels of AcresVehicleModel.
The solve uses backward Euler. It finds the speed \(c\) of the rear carrier at the end of the step. The speeds of the wheels, the clutch torque and the engine speed follow from \(c\).
Wheel. The shaft torque that wheel \(j\) needs to have the spin \(\omega\) at the end of the step is:
\(F_{x,j}(\omega)\) is the tyre force at that spin. \(T_j\) increases with \(\omega\). A wheel without a drive shaft has \(T_j(\omega) = 0\).
Rear axle. A locked axle turns the two wheels at the carrier speed.
An open axle gives the same torque to the two wheels. The solve finds \(\omega_2\) with \(T_2(\omega_2) = T_3(2c - \omega_2)\). Then \(T_{rear}(c) = T_2(\omega_2) + T_3(2c - \omega_2)\).
Wheels in total. Each engaged front wheel \(j\) turns at \(K c\) and adds its torque through the ratio \(K\).
Engine side. A clutch that holds makes the engine speed \(R c\) at the end of the step. The clutch torque for that is:
The belt and the gears lose power in the two directions of the power flow.
Balance. The solve has four cases. Each case gives one equation for \(c\).
| Condition | Equation |
|---|---|
| The transmission is in a gear and the clutch has capacity | \(T_{need}(c) = D(T_c(c))\) |
| The result gives \(T_c > C_{fwd}\) or \(T_c < -C_{rev}\) | \(T_c\) becomes the capacity. Then \(T_{need}(c) = D(T_c)\). |
| Park | \(c = 0\) when \(\lvert T_{need}(0)\rvert \le T_{park}\). If not, \(T_{need}(c) = \operatorname{clamp}(T_{need}(0), -T_{park}, T_{park})\). |
| Neutral, or no clutch capacity | \(T_{need}(c) = 0\) |
RisingRoot solves each equation. It makes a bracket around a first estimate and doubles the bracket until the function changes its sign.
It then divides the bracket 44 or 48 times.
After the solve. The engine speed and the heat of the clutch slip are:
SettleWheels then sets the spin, the tyre force and the slip of each wheel. It also adds the terms of the ledger from the axle to the ground.
Brakes#
Source: PrepareUtvWheel, UtvBrakeOutputBar.
The brakes are hydraulic disc brakes. The torque is the line pressure multiplied by the gain of the axle.
\(P_{bias}\) is 0 for the calibrated vehicle. \(P_{max}\) is 80 bar. The torque does not change with the load of the wheel.
The line pressure comes from the brake actuator or from the foot of the driver. Refer to Drive-by-Wire and ULC.
The park pawl holds the rear carrier with a torque of 20 000 N·m maximum (gearbox.park_hold_nm).
Resistances#
These forces and torques act against the motion.
| Resistance | Equation | Source |
|---|---|---|
| Aerodynamic drag | \(\mathbf{F} = -\tfrac{1}{2} \rho\, C_d A\, \lvert\mathbf{v}\rvert\, \mathbf{v}\) | AAcresVehiclePawn::AsyncPhysicsTickActor, FAcresPolaris::Step |
| Rolling resistance of the tyre | \(T_{roll} = \min(f, 0.45)\, N R_t\) | PrepareWheel |
| Motion resistance of the soil | The compaction force and the bulldozing force of the tyre on soil | PrepareWheel, SettleWheels |
| Water drag | \(\mathbf{F} = -\tfrac{1}{2} \cdot 1000\, C_{d,w} A_w\, \lvert\mathbf{v}\rvert\, \mathbf{v}\) with \(A_w = b \min(2 R_t, h_w)\) | WaterDrag |
| Engine braking | The friction torque and the pumping torque of the engine through the EBS | StepUtvPowertrain |
| Angular damping of the chassis | \(\boldsymbol{\omega} \leftarrow \boldsymbol{\omega}\, \max(0,\ 1 - 0.08\, \Delta t)\) | Chaos in the game, FAcresPolaris::Step |
\(C_d A\) is 2.5 m² and \(\rho\) is 1.2 kg/m³. \(h_w\) is the depth of the water on the ground.
SettleWheels applies the motion resistance of the soil to the chassis force of the wheel.
Fuel and Energy#
Source: SolveUtvDriveline, EngineFrictionPowerW, WillansFuelPowerW.
The fuel power is a Willans line. \(\bar\omega_e\) is the mean of the engine speed at the start and at the end of the step.
The heating value \(H_u\) and the density \(\rho_f\) of the fuel give the fuel volume of the step, \(P_{fuel} \Delta t / (H_u \rho_f)\). The step adds these terms to the ledger of Energy and Fuel. \(\bar c\) is the mean carrier speed of the step.
| Ledger Term | Value in One Step |
|---|---|
| Fuel | \(P_{fuel}\, \Delta t\) |
| Engine loss | \((P_{fuel} - P_b)\, \Delta t\) |
| Parasitic | \(T_{acc}\, \bar\omega_e\, \Delta t\) |
| Engine kinetic | \(\tfrac{1}{2} J_e (\omega_{e,end}^2 - \omega_{e,start}^2)\) |
| Clutch | \(T_c (\bar\omega_e - R \bar c)\, \Delta t\) |
| Driveline | \((T_c R - D(T_c))\, \bar c\, \Delta t\) |
| Brake | The work of the park pawl goes into this term. |
Reset State#
Source: ResetUtv, AAcresVehiclePawn::ResetPolaris, FAcresPolaris::Reset.
A reset gives this state.
- The engine is at idle speed. The torque request is the feed-forward term of the idle governor.
- The belt ratio is \(r_{low}\). The tank is full.
- The gear is the position of the lever. The default is L. The drive mode is the position of the switch. The default is AWD.
- Each wheel has its static load and the extension 0.4 m.
A reset with a start speed \(v_0\) gives a moving start. The wheels turn at \(v_0 / R_t\). The belt grips at the light-load shift speed.
Occupants and Payload#
The number of occupants changes the mass, the centre of mass, the inertia and the static loads. The seats fill in this sequence.
| Occupant | Seat | Forward | Left |
|---|---|---|---|
| 1 | Driver, front left | 1.8 m | 0.36 m |
| 2 | Front right | 1.8 m | -0.36 m |
| 3 | Rear left | 0.85 m | 0.36 m |
| 4 | Rear right | 0.85 m | -0.36 m |
| 5 | Rear centre | 0.85 m | 0 m |
| 6 | Front centre | 1.8 m | 0 m |
The height of the centre of mass of an occupant is 0.95 m (mass.seat_z_m).
The option -PolarisOccupants= sets the number from 0 to 6. The key mass.cargo_kg sets the cargo in the bed.
Packaged/Linux/Acres.sh -VehicleDemo -Vehicle=polaris -PolarisOccupants=4 -PolarisSet="mass.cargo_kg=150"
Parameter Fitting from the Real Logs#
Each parameter of polaris.json has a basis. The basis states where the value comes from.
| Basis | Meaning | Parameters |
|---|---|---|
oem |
The specification of the manufacturer | Wheelbase, dry mass, suspension travel, tyre sizes and pressures, displacement, gear reductions, fuel tank |
dataspeed |
The Dataspeed documents or ds_dbw_msgs |
Command ranges, the 80 bar brake scale, the steering limit, the default limits of the ULC |
installed |
A value in the software of the vehicle | The rate limit and the acceleration limit of the steering reference |
fitted |
A least-squares fit to a recorded log | The parameters in the next table and the actuator parameters of the drive-by-wire |
derived |
A value from other entries | Mass of the fluids, section height of the tyre |
estimate |
An engineering estimate with a range | All other parameters |
The logs of the vehicle fit two parameters of this page. The fit is in Calibrate against Real Logs.
| Key | Fitted Value | Standard Error | Log |
|---|---|---|---|
steering.ratio |
11.9764 | 0.4265 | grass_diag_20260731_174757 |
steering.center_deg |
12.5314° | 0.5069° | grass_diag_20260731_174757 |
The yaw response of the log shows only the product of the steering ratio and the wheelbase. The fit gives 34.4 ± 2.4 m (95 %). The model keeps the wheelbase of the manufacturer, 2.8702 m. The fitted ratio is thus 11.98 and not the ratio 16 of the installed planner.
The logs do not identify the mass, the inertia, the springs, the dampers and the tyre forces. They also do not identify the torque curve, the CVT map, the brake gains and the drag.
Model Tests#
Tools/PolarisModel/build.sh builds the test program polaris_tests and runs it. The program uses a test stand with a rigid chassis (UtvBench.h).
The last line of the output is 44 passed, 0 failed. This table gives results of that run.
| Test | Result |
|---|---|
| Parked on asphalt, gravel and silt loam | The loads are equal to the weight. The rear sinkage on silt loam is 2.24 cm. |
| Steady turn at 1.5 m/s, steering wheel at 90° to 300°, Turf | The yaw rate is within 0.74 % of the kinematic value. |
| Locked rear axle at 180° | The path curvature is 12.7 % smaller than in Turf. |
| Turn at 8 m/s | The understeer gradient is 3.49°/g. The roll angle is 3.36°. |
| Engine curve | Peak power 61.1 kW at 7000 rev/min, peak torque 84.1 N·m. |
| Full throttle in H | The engine stays between 6686 and 7347 rev/min. 0 to 30 mph takes 4.4 s. The top speed is 26.72 m/s. |
| Full throttle in L | The top speed is 13.63 m/s at 7926 rev/min. |
| Brake from 15 m/s with 70 bar | 8.88 m/s² on asphalt, 5.93 m/s² on gravel. The friction is the limit. |
| Brake from 15 m/s with 15 bar on asphalt | 2.96 m/s². The brake torque is the limit. |
| Step of 60 Hz and 120 Hz against 240 Hz | The speed differs by 0.58 % and 0.19 %. |
| Energy ledger on asphalt, silt loam and grass | The residual is 0.0235 %, 0.0099 % and 0.0189 % of the fuel energy. |
| Slick rear surface, full throttle for 3 s | 9.32 m/s in AWD, 2.22 m/s in 2WD. |
| Turf in a left turn | The rear wheels differ by 1.089 rad/s. The kinematic value is 1.096 rad/s. |
Parameters#
The file is Acres/Content/Simulation/polaris.json. Each parameter is an object with the fields value, basis, source, sd or range, and note.
The model reads only value. The name of a parameter is its JSON path, for example engine.idle_rpm.
An index selects one element of an array, for example engine.torque_curve_rpm[3].
These options change the parameters of a session.
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
-PolarisConfig= |
path | Simulation/polaris.json |
The parameter file. | |
-PolarisSet= |
text | Overrides: key=value pairs with ; between them. An unknown key stops the game. |
||
-PolarisOccupants= |
integer | 1 | The number of occupants, 0 to 6. |
Geometry#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
geometry.wheelbase_m |
number | m | 2.8702 | The distance between the axles. |
geometry.track_front_m |
number | m | 1.31 | The front track, tyre centre to tyre centre. |
geometry.track_rear_m |
number | m | 1.31 | The rear track. |
Mass#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
mass.dry_kg |
number | kg | 1063 | The dry mass of the vehicle. |
mass.fluids_kg |
number | kg | 40 | Fuel, oil and coolant. |
mass.roof_equipment_kg |
number | kg | 15 | The roof rack with the LiDAR, the antennas and the camera. |
mass.bay_equipment_kg |
number | kg | 30 | The computer and the drive-by-wire modules in the electronics bay. |
mass.occupant_kg |
number | kg | 85 | The mass of one occupant. |
mass.occupants |
integer | 1 | The number of occupants, 0 to 6. | |
mass.cargo_kg |
number | kg | 0 | The cargo in the bed. |
mass.dry_cg_forward_m |
number | m | 1.205 | Centre of mass of the dry vehicle, forward of the rear axle. |
mass.dry_cg_left_m |
number | m | 0 | Centre of mass of the dry vehicle, to the left. |
mass.dry_cg_height_m |
number | m | 0.62 | Centre of mass of the dry vehicle, above the ground. |
mass.dry_gyration_roll_m |
number | m | 0.5 | Radius of gyration of the dry vehicle in roll. |
mass.dry_gyration_pitch_m |
number | m | 1.1 | Radius of gyration in pitch. |
mass.dry_gyration_yaw_m |
number | m | 1.15 | Radius of gyration in yaw. |
mass.fluids_x_m, mass.fluids_y_m, mass.fluids_z_m |
number | m | 0.9, 0, 0.45 | Position of the fluids. |
mass.roof_x_m, mass.roof_y_m, mass.roof_z_m |
number | m | 2.3, 0, 1.95 | Position of the roof equipment. |
mass.bay_x_m, mass.bay_y_m, mass.bay_z_m |
number | m | 0.95, -0.45, 0.7 | Position of the electronics bay. |
mass.front_seat_x_m |
number | m | 1.8 | Position of the front seats, forward of the rear axle. |
mass.rear_seat_x_m |
number | m | 0.85 | Position of the rear seats. |
mass.seat_lateral_m |
number | m | 0.36 | Lateral offset of the outer seats. |
mass.seat_z_m |
number | m | 0.95 | Height of the centre of mass of an occupant. |
mass.cargo_x_m, mass.cargo_z_m |
number | m | -0.2, 0.9 | Position of the cargo. |
Suspension#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
suspension.travel_m |
number | m | 0.2794 | The total wheel travel. |
suspension.droop_m |
number | m | 0.1 | The travel below the static position. |
suspension.front_wheel_rate_n_m |
number | N/m | 20000 | The spring rate at a front wheel. |
suspension.rear_wheel_rate_n_m |
number | N/m | 28000 | The spring rate at a rear wheel. |
suspension.damping_ratio |
number | 0.35 | The damping ratio of a corner. | |
suspension.bump_stop_length_m |
number | m | 0.03 | The length of the bump stop at the end of the travel. |
suspension.bump_stop_rate_n_m2 |
number | N/m² | 2000000 | The quadratic rate of the bump stop. |
Tyres#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
tyres.radius_m |
number | m | 0.3429 | The unloaded radius of the 27 in tyres. |
tyres.front_width_m |
number | m | 0.2286 | The width of a front tyre, 27 × 9-14. |
tyres.rear_width_m |
number | m | 0.2794 | The width of a rear tyre, 27 × 11-14. |
tyres.section_height_m |
number | m | 0.1651 | The section height. |
tyres.front_inflation_kpa |
number | kPa | 124 | The front inflation pressure. |
tyres.rear_inflation_kpa |
number | kPa | 138 | The rear inflation pressure. |
tyres.carcass_kpa |
number | kPa | 15 | The carcass stiffness pressure. |
tyres.hysteresis |
number | 0.12 | The hysteresis loss for each unit of relative deflection. | |
tyres.lug_height_m |
number | m | 0.012 | The height of the lugs. |
tyres.lug_area_ratio |
number | 0.35 | The share of the contact area that the lugs fill. | |
tyres.tread_k_m |
number | m | 0.008 | The shear compliance of the tread. The model adds it to the shear modulus of the soil. |
tyres.cornering_per_load |
number | 1/rad | 8 | The cornering stiffness divided by the load. |
tyres.relaxation_m |
number | m | 0.3 | The lateral relaxation length. |
tyres.hard_slip_stiffness |
number | 12 | The slope of the friction curve on hard ground. | |
tyres.wheel_inertia_kg_m2 |
number | kg·m² | 1.0 | The spin inertia of the tyre, the wheel and the hub. |
Steering#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
steering.ratio |
number | 11.9764 | The steering wheel angle divided by the bicycle angle. | |
steering.center_deg |
number | deg | 12.5314 | The steering wheel angle at which the vehicle moves straight. |
Engine and Fuel#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
engine.idle_rpm |
number | rev/min | 1250 | The idle speed. |
engine.max_rpm |
number | rev/min | 8000 | The speed of the rev limiter. |
engine.torque_curve_rpm |
array | rev/min | 10 points | The speeds of the full-load curve. |
engine.torque_curve_nm |
array | N·m | 10 points | The torques of the full-load curve. |
engine.inertia_kg_m2 |
number | kg·m² | 0.1 | The inertia of the crank, the flywheel and the primary clutch. |
engine.accessory_drag_nm |
number | N·m | 1.5 | The drag of the alternator and the pumps. |
engine.displacement_l |
number | L | 0.999 | The displacement. |
engine.indicated_efficiency |
number | 0.34 | The indicated efficiency of the Willans line. | |
engine.fmep_bar |
number | bar | 0.8 | The constant term of the friction mean effective pressure. |
engine.fmep_bar_per_krpm |
number | bar/krpm | 0.12 | The linear term. |
engine.fmep_bar_per_krpm2 |
number | bar/krpm² | 0.03 | The quadratic term. |
engine.pumping_bar |
number | bar | 0.8 | The pumping mean effective pressure with a closed throttle. |
engine.torque_lag_s |
number | s | 0.1 | The time constant of the torque request. |
engine.idle_gain |
number | 1.0 | The gain of the idle governor. | |
engine.pedal_exponent |
number | 0.85 | The exponent of the pedal map. | |
engine.max_speed_mps |
number | m/s | 27.7 | The governed top speed. 0 removes the governor. |
fuel.lhv_mj_kg |
number | MJ/kg | 43.4 | The lower heating value of gasoline. |
fuel.density_kg_l |
number | kg/L | 0.745 | The density of the fuel. |
fuel.tank_l |
number | L | 43.5 | The volume of the tank. 0 removes the tank from the model. |
CVT and Gearbox#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
cvt.low_ratio |
number | 3.2 | The lowest belt ratio. | |
cvt.high_ratio |
number | 0.72 | The overdrive belt ratio. | |
cvt.engage_rpm |
number | rev/min | 1600 | The speed at which the clutch starts to grip. |
cvt.full_engage_rpm |
number | rev/min | 2600 | The speed at which the clutch has its full capacity. |
cvt.clutch_capacity_nm |
number | N·m | 150 | The full capacity of the clutch. |
cvt.ebs_capacity_nm |
number | N·m | 60 | The capacity of the EBS in the reverse direction. |
cvt.shift_rpm_light |
number | rev/min | 3000 | The shift speed without transmitted torque. |
cvt.shift_rpm_full |
number | rev/min | 6800 | The shift speed at the peak engine torque. |
cvt.shift_tau_s |
number | s | 0.3 | The time constant of the belt ratio. |
cvt.belt_efficiency |
number | 0.88 | The efficiency of the belt. | |
cvt.gear_efficiency |
number | 0.95 | The efficiency of the gears. | |
cvt.secondary_inertia_kg_m2 |
number | kg·m² | 0.04 | The inertia of the secondary clutch and the gearbox. |
cvt.ebs |
boolean | true | The EBS is on. | |
cvt.adc |
boolean | false | Active Descent Control is on. | |
gearbox.rear_low_ratio |
number | 28.84 | The reduction to the rear wheels in L. | |
gearbox.rear_high_ratio |
number | 13.01 | The reduction to the rear wheels in H. | |
gearbox.rear_reverse_ratio |
number | 27.39 | The reduction to the rear wheels in R. | |
gearbox.front_low_ratio |
number | 9.65 | The reduction to the front prop shaft in L. | |
gearbox.front_high_ratio |
number | 4.35 | The reduction to the front prop shaft in H. | |
gearbox.front_reverse_ratio |
number | 9.16 | The reduction to the front prop shaft in R. | |
gearbox.front_drive_ratio |
number | 3.23 | The ratio of the front drive. | |
gearbox.park_hold_nm |
number | N·m | 20000 | The maximum torque of the park pawl at the rear carrier. |
Brakes and Aerodynamics#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
brakes.front_nm_per_bar |
number | N·m/bar | 22 | The brake torque of one front wheel for each bar. |
brakes.rear_nm_per_bar |
number | N·m/bar | 12 | The brake torque of one rear wheel for each bar. |
aero.drag_area_m2 |
number | m² | 2.5 | The drag area \(C_d A\). |
aero.air_density_kg_m3 |
number | kg/m³ | 1.2 | The density of the air. |
The keys below dbw are in Drive-by-Wire and ULC.
Code Map#
| Item | File | Function |
|---|---|---|
| Parameter keys | Acres/Source/Acres/AcresUtvModel.cpp |
SetUtvParameter |
| Mass properties, wheel parameter set | Acres/Source/Acres/AcresUtvModel.cpp |
FinalizeUtvParameters |
| Reset | Acres/Source/Acres/AcresUtvModel.cpp |
ResetUtv |
| Steering geometry | Acres/Source/Acres/AcresUtvModel.cpp, AcresSimModel.cpp |
StepUtvSteering, Ackermann |
| Engine curves | Acres/Source/Acres/AcresUtvModel.cpp |
UtvEngineCurves |
| Engine, clutch capacity, CVT ratio | Acres/Source/Acres/AcresUtvModel.cpp |
StepUtvPowertrain |
| Wheel contact, brake torque | Acres/Source/Acres/AcresUtvModel.cpp, AcresVehicleModel.cpp |
PrepareUtvWheel, PrepareWheel |
| Driveline solve, fuel, ledger | Acres/Source/Acres/AcresUtvModel.cpp |
SolveUtvDriveline |
| Wheel and axle torque, root solve | Acres/Source/Acres/AcresVehicleModel.cpp, AcresVehicleModel.h |
WheelShaftTorqueNm, AxleCarrierTorqueNm, RisingRoot, SettleWheels |
| Fuel line | Acres/Source/Acres/AcresPowerModel.cpp |
WillansFuelPowerW, EngineFrictionPowerW |
| Parameters in the game | Acres/Source/Acres/AcresPolaris.cpp |
AAcresVehiclePawn::LoadPolarisConfiguration |
| Chassis in the game | Acres/Source/Acres/AcresVehicle.cpp |
AAcresVehiclePawn::AsyncPhysicsTickActor |
| Parameters and chassis in ACRES Core | Core/Source/AcresCorePolaris.cpp |
LoadPolarisParameters, FAcresPolaris::Step |
| Test stand and tests | Tools/PolarisModel/UtvBench.h, polaris_tests.cpp |
UtvBench::FBench::Step |
Limitations#
- The tyre, suspension, engine, CVT, brake and drag parameters are estimates. No log identifies them.
- The fit of the steering ratio uses one log of 41.5 s on grass with steering wheel angles below 55°.
- The log does not record the position of the AWD switch. The fit assumes a locked rear axle.
- The CVT model has no sheave forces and no belt slip. The slip of the driveline is the slip of the primary clutch.
- The engine has no temperature, no start procedure and no stall.
- The suspension has no anti-roll bar and no geometry change with the travel.
- The hard-surface tyre has no load sensitivity, no camber effect and no aligning torque.
- The brake gains are constant. The model has no brake fade.
References#
- Heywood, J. B. (1988). Internal Combustion Engine Fundamentals. McGraw-Hill. Section 13.6: friction mean effective pressure.
- Guzzella, L., and Sciarretta, A. (2013). Vehicle Propulsion Systems: Introduction to Modeling and Optimization (3rd ed.). Springer. Chapter 3: the Willans line.
- Wong, J. Y. (2008). Theory of Ground Vehicles (4th ed.). Wiley.
- Polaris Industries (2022). RANGER XP 1000 / RANGER CREW XP 1000 Owner's Manual, publication 9940233 revision 01. Specifications.
- Dataspeed Inc. Drive-by-Wire System Overview, and the message definitions of
ds_dbw_msgs2.3.11.