Point-Mass Model¶
This document defines the implemented point-mass backend in
src/apexsim/vehicle/point_mass_model.py.
1. Scope¶
The point-mass model keeps the solver API contract but replaces detailed chassis/yaw dynamics with a scalar acceleration envelope.
State assumptions at each track point:
- no resolved yaw dynamics in diagnostics (\(M_z = 0\)),
- isotropic tire friction-circle coupling,
- normal load from gravity plus aerodynamic downforce.
2. Tire Normal-Acceleration Budget¶
At speed \(v\):
with
The model applies a lower bound \(a_n(v)\ge\varepsilon\) for numerical robustness.
3. Lateral Limit¶
With isotropic friction coefficient \(\mu\):
Including banking contribution:
4. Friction-Circle Coupling¶
For required lateral acceleration magnitude \(|a_{y,\text{req}}|\):
5. Longitudinal Limits¶
Tire-limited longitudinal acceleration magnitude:
Drive envelope:
Brake envelope:
Net along-track acceleration:
available deceleration magnitude:
with
6. Diagnostics¶
The backend reports:
- yaw moment: \(0\),
- axle loads from static split plus aero split:
- \(F_{z,f} = mg\phi_f + F_{\text{down},f}\),
- \(F_{z,r} = mg(1-\phi_f) + F_{\text{down},r}\),
- tractive power: $$ P = \left(m a_x + D(v)\right)v. $$
7. Equation-to-Code Mapping¶
- normal-acceleration budget:
PointMassModel._normal_accel_limit(...) - lateral limit:
PointMassModel.lateral_accel_limit(...) - friction-circle scaling:
PointMassModel._friction_circle_scale(...) - longitudinal accel/decel limits:
PointMassModel.max_longitudinal_accel(...),PointMassModel.max_longitudinal_decel(...) - diagnostics:
PointMassModel.diagnostics(...)
8. Cross-Model Calibration¶
To align the point-mass model with the single-track model's lateral envelope, the library provides:
calibrate_point_mass_friction_to_single_track(vehicle, tires, ...)
This identifies an effective isotropic \(\mu\) by least-squares fitting:
The comparison example uses this calibration before running the point-mass model.
9. Example¶
- Point-mass standalone usage:
examples/spa/spa_lap_point_mass.py - Side-by-side comparison against single-track model:
examples/spa/spa_model_comparison.py