Single-Track Model¶
This document defines the implemented single-track backend in
src/apexsim/vehicle/single_track_model.py and
src/apexsim/vehicle/_single_track_physics.py.
Terminology note:
SingleTrackin this package corresponds to the "bicycle model" terminology frequently used in vehicle-dynamics literature.
The single-track backend is implemented as a physical extension of the
point-mass physical core (PointMassPhysicalMixin), with single-track-specific
lateral force and diagnostic equations layered on top.
1. Scope¶
The single-track model keeps the solver API contract and adds axle-level lateral tire force modeling, quasi-static load transfer, and yaw-moment diagnostics.
State assumptions in the lap-time solver context:
- quasi-steady envelope evaluation (no transient tire relaxation in profile solve),
- lateral force from load-sensitive Pacejka at front and rear axle,
- friction-circle coupling between lateral demand and longitudinal capability,
- net along-track acceleration after drag and grade corrections.
2. Lateral Limit¶
At speed \(v\) and banking angle \(\beta\), the model solves lateral capacity by a fixed-point iteration because normal load and lateral force depend on the lateral-acceleration estimate itself.
Given current iterate \(a_y^{(k)}\):
- Estimate axle loads from quasi-static vertical balance and load transfer.
- Evaluate axle lateral forces at representative peak slip angle \(\alpha_\text{peak}\).
- Update the lateral limit with banking contribution. The dependence on the previous iterate is carried by the axle normal loads used in tire-force evaluation:
Equivalently, writing axle-level lateral forces explicitly as \(F_{y,f}^{(k)}\) and \(F_{y,r}^{(k)}\):
with \(F_{y,f}^{(k)}, F_{y,r}^{(k)}\) computed from \(F_{z,f}(a_y^{(k)})\) and \(F_{z,r}(a_y^{(k)})\).
Stop criterion:
or max iteration count.
3. Lateral Tire Force Model (Pacejka)¶
Each axle force is the sum of two equivalent tires:
Per-tire Pacejka-style lateral force:
with load sensitivity factor:
4. Quasi-Static Normal Loads¶
Total vertical load:
Front axle raw load with longitudinal transfer:
Rear axle load follows from equilibrium:
Lateral transfer is distributed by effective front roll-stiffness share and split to left/right wheel loads while preserving axle totals.
5. Longitudinal Limits with Friction Circle¶
For required lateral acceleration magnitude \(|a_{y,\text{req}}|\):
Drive and brake envelopes:
Net along-track acceleration:
available deceleration magnitude:
with
6. Diagnostics¶
The backend reports at each operating point:
- yaw moment from 3-DOF single-track force balance,
- front and rear axle normal loads,
- tractive power:
The solver uses quasi-steady envelopes for speed profile generation; the 3-DOF single-track dynamics model is used primarily for physically meaningful analysis diagnostics (e.g., yaw-moment traces).
7. Equation-to-Code Mapping¶
- lateral limit fixed-point:
SingleTrackModel.lateral_accel_limit(...) - Pacejka lateral force:
magic_formula_lateral(...) - normal-load estimation:
estimate_normal_loads(...) - friction-circle scaling:
EnvelopeVehicleModel._friction_circle_scale(...) - longitudinal accel/decel:
SingleTrackModel.max_longitudinal_accel(...),SingleTrackModel.max_longitudinal_decel(...) - diagnostics:
SingleTrackModel.diagnostics(...),SingleTrackDynamicsModel.force_balance(...)
8. Example¶
- Single-track standalone usage:
examples/spa/spa_lap_single_track.py - Side-by-side comparison against point-mass model:
examples/spa/spa_model_comparison.py