Skip to content

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.

Driveline of the Polaris: the pedal sets the engine torque, the engine drives the primary clutch, the CVT belt and the gear lever, the rear axle and the front demand drive turn the wheels, and the steering and the disc brakes act on the wheels. Driveline of the Polaris COMMANDS TORQUE PATH Pedal driver or pedal emulation Engine ProStar 999 cc, 84.1 N m, 61.1 kW Primary clutch centrifugal, grips at 1600 to 2600 rpm CVT belt ratio 3.2 to 0.72, shift lag 0.3 s Gear lever P R N H L, L 28.84, H 13.01 Engine braking passes back through the clutch, 60 N m maximum. Front demand drive AWD only, ring at 0.926 of rear speed Rear axle AWD, 2WD: locked, Turf: open front prop shaft Steering wheel driver or steering servo Steering ratio 11.98, ideal Ackermann Front wheels 27 x 9-14, 124 kPa Rear wheels 27 x 11-14, 138 kPa overrunning clutches Brake pressure driver or brake actuator Disc brakes front 22 N m/bar, rear 12 N m/bar line pressure brake torque One solve for each physics step finds the carrier speed, the wheel speeds, the clutch torque and the engine speed.
The torque path of the Polaris from the pedal to the wheels, with the steering and the brakes. Open the diagram

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. FAcresPolaris integrates 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).

\[ \operatorname{lag}(x, x^*, \tau) = x^* + (x - x^*)\, e^{-\Delta t / \max(10^{-4},\, \tau)} \]

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.

\[ m = \sum_i m_i, \qquad \mathbf{r}_{cg} = \frac{1}{m} \sum_i m_i\, \mathbf{r}_i \]

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}\):

\[ I_{xx} = m_d k_x^2 + \sum_i m_i (\Delta y_i^2 + \Delta z_i^2) \]
\[ I_{yy} = m_d k_y^2 + \sum_i m_i (\Delta x_i^2 + \Delta z_i^2) \]
\[ I_{zz} = m_d k_z^2 + \sum_i m_i (\Delta x_i^2 + \Delta y_i^2) \]

The static axle loads come from the pitch moment balance. The lateral offset of the centre of mass divides each axle load.

\[ N_f = m g \operatorname{clamp}\!\left(\frac{x_{cg}}{L}, 0.05, 0.95\right), \qquad N_r = m g - N_f \]
\[ s_f = \operatorname{clamp}\!\left(\tfrac{1}{2} + \frac{y_{cg}}{b_f}, 0.05, 0.95\right), \qquad s_r = \operatorname{clamp}\!\left(\tfrac{1}{2} + \frac{y_{cg}}{b_r}, 0.05, 0.95\right) \]
\[ N_{0,0} = N_f s_f, \quad N_{0,1} = N_f (1 - s_f), \quad N_{0,2} = N_r s_r, \quad N_{0,3} = N_r (1 - s_r) \]

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\).

\[ k_{tyre} = 2\pi\, (p_i + p_c) \sqrt{\frac{R_t\, b}{2}}, \qquad \frac{1}{k_j} = \frac{1}{k_{tyre}} + \frac{1}{k_{wheel}} \]

The damper gives the damping ratio \(\zeta\) on the mass that the corner carries.

\[ c_j = 2 \zeta \sqrt{k_j\, \frac{N_{0,j}}{g}} \]

The normal load uses the compression \(x_s\) and the speed \(v_n\) of the contact point along the ground normal.

\[ N_j = \operatorname{clamp}\!\left(N_{0,j} + k_j (x_s - x_0) + k_b \max(0,\, x_s - x_b)^2 - c_j v_n,\; 0,\; 6 N_{0,j}\right) \]
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.

\[ \delta = \frac{\pi}{180} \cdot \frac{\theta_{sw} - \theta_c}{\max(1,\, i_s)} \]

The front wheels then obey the ideal Ackermann geometry. For \(|\delta| \ge 10^{-5}\) rad:

\[ r_c = \frac{L}{\tan|\delta|}, \qquad \delta_{in} = \arctan\frac{L}{\max(0.1,\ r_c - b_f/2)}, \qquad \delta_{out} = \arctan\frac{L}{r_c + b_f/2} \]

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.

\[ T_{fr} = \max(0,\ f_0 + f_1 n_k + f_2 n_k^2)\, \frac{10^5\, V_d \cdot 10^{-3}}{4\pi}, \qquad T_{pu} = p_{pu}\, \frac{10^5\, V_d \cdot 10^{-3}}{4\pi} \]

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.

\[ g_v = \operatorname{clamp}\!\left(\frac{v_{max} - v_r}{0.5}, 0, 1\right), \qquad v_r = \left|\tfrac{1}{2}(\omega_2 + \omega_3)\right| R_t \]

The idle governor holds the idle speed \(\omega_{idle}\). Its feed-forward term balances the friction, the pumping and the accessories at idle.

\[ u_{idle} = \operatorname{clamp}\!\left(\frac{T_{fr}(n_{idle}) + T_{pu} + T_{acc}}{\max(1,\ T_{wot}(n_{idle}) + T_{fr}(n_{idle}) + T_{pu})} + k_{idle}\, \frac{\omega_{idle} - \omega_e}{\omega_{idle}},\ 0,\ 1\right) \]

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.

\[ u^* = \max\!\left(p^{\max(0.1,\ \gamma)}\, g_v,\ u_{idle}\right), \qquad u \leftarrow \operatorname{lag}(u, u^*, \tau_e) \]

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):

\[ T_e = f\, u\, (T_{wot} + T_{fr}) - T_{fr} - (1 - u)\, T_{pu} \]

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.

\[ \omega_{free} = \max\!\left(0,\ \omega_e + \Delta t\, \frac{T_e - T_{acc}}{J_e}\right) \]

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.

\[ C = C_{max} \operatorname{clamp}\!\left(\frac{\omega_{free}^2 - \omega_{eng}^2}{\omega_{full}^2 - \omega_{eng}^2}, 0, 1\right) \]

The Engine Braking System (EBS) couples the belt in the reverse direction. Its capacity decreases to 0 at idle speed.

\[ C_{ebs} = C_{ebs,max} \operatorname{clamp}\!\left(\frac{\omega_{free} - \omega_{idle}}{\max(1,\ \omega_{eng} - \omega_{idle})}, 0, 1\right) \]

\(C_{ebs}\) is 0 when cvt.ebs is false. The two capacities of the clutch are:

\[ C_{fwd} = C, \qquad C_{rev} = \max(C,\ C_{ebs}) \]

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.

\[ \sigma = \operatorname{clamp}\!\left(\frac{\max(0,\ T_c)}{T_{peak}}, 0, 1\right), \qquad n_s = \sqrt{n_{light}^2 + (n_{full}^2 - n_{light}^2)\, \sigma} \]

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\).
\[ r^* = \begin{cases} \operatorname{clamp}\!\left(\dfrac{2\pi\, n_s / 60}{\omega_s},\ r_{high},\ r_{low}\right) & \text{the belt grips and } \omega_s > 10^{-6} \\ r_{low} & \text{in all other conditions} \end{cases} \]
\[ r \leftarrow \operatorname{lag}(r, r^*, \tau_{cvt}), \qquad R = d\, r\, i_r \]

\(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.

\[ K = \frac{i_r}{i_f\, i_d} \]

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.

\[ J_{2} = J_{3} = J_w + \tfrac{1}{2} J_s\, i_r^2 \]

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:

\[ T_j(\omega) = J_j\, \frac{\omega - \omega_j}{\Delta t} + F_{x,j}(\omega)\, R_t + (T_{roll,j} + T_{brake,j}) \tanh\frac{\omega}{0.1} \]

\(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.

\[ T_{rear}(c) = T_2(c) + T_3(c) \]

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\).

\[ T_{need}(c) = T_{rear}(c) + \sum_{j \in \text{engaged}} K\, T_j(K c) \]

Engine side. A clutch that holds makes the engine speed \(R c\) at the end of the step. The clutch torque for that is:

\[ T_c(c) = J_e\, \frac{\omega_{free} - R c}{\Delta t} \]

The belt and the gears lose power in the two directions of the power flow.

\[ D(T_c) = \begin{cases} R\, \eta\, T_c & T_c \ge 0 \\ R\, T_c / \eta & T_c < 0 \end{cases}, \qquad \eta = \operatorname{clamp}(\eta_{belt}\, \eta_{gear},\ 0.05,\ 1) \]

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:

\[ \omega_e \leftarrow \max\!\left(0,\ \omega_{free} - \Delta t\, \frac{T_c}{J_e}\right), \qquad Q_{clutch} \mathrel{+}= \max\!\left(0,\ T_c\, (\omega_e - R c)\right) \Delta t \]

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_{out} = \operatorname{clamp}(P_{line} + P_{bias},\ 0,\ P_{max}), \qquad T_{brake,j} = \begin{cases} G_f\, P_{out} & j \in \{0, 1\} \\ G_r\, P_{out} & j \in \{2, 3\} \end{cases} \]

\(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.

\[ F_{x,j} = F_{shear,j} - \operatorname{clamp}\!\left(F_{mr,j} \tanh\frac{v_j}{0.1},\ -\frac{N_{0,j}}{g} \frac{\lvert v_j\rvert}{\Delta t},\ \frac{N_{0,j}}{g} \frac{\lvert v_j\rvert}{\Delta t}\right) \]

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.

\[ P_b = T_e\, \bar\omega_e, \qquad P_{fr} = T_{fr}\, \bar\omega_e, \qquad P_{pu} = (1 - u)\, T_{pu}\, \bar\omega_e \]
\[ P_{fuel} = \begin{cases} \dfrac{\max(0,\ P_b + P_{fr} + P_{pu})}{\operatorname{clamp}(\eta_i,\ 0.05,\ 0.7)} & \text{the engine has fuel and } \bar\omega_e > 1 \\ 0 & \text{in all other conditions} \end{cases} \]

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.

\[ r = \operatorname{clamp}\!\left(\frac{2\pi\, n_{light} / 60}{\omega_s},\ r_{high},\ r_{low}\right), \qquad n = \max\!\left(n_{idle},\ \frac{60}{2\pi}\, r\, \omega_s\right), \qquad \omega_s = \frac{v_0}{R_t}\, i_r \]

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_msgs 2.3.11.