Dinamica del veicolo, approfondimento: modello a bicicletta dimostrato, Pacejka, trasferimenti di carico, ABS, ESC, ACC, LKA e pure pursuit in Python
Derivazione completa del modello a bicicletta, dimostrazioni dello sterzo a regime e della stabilità, formula magica di Pacejka con B, C, D, E, cerchio d'aderenza, lunghezza di rilassamento, trasferimenti di carico, ABS, ESC, ACC, LKA e pure pursuit, con simulazioni Python verificate.
Questa pagina approfondisce la lezione sulla dinamica del veicolo con il livello di dettaglio che serve a chi lavora nello sviluppo delle funzioni ADAS e del controllo di stabilità. Ricava il modello a bicicletta con tutti i passaggi, dimostra le condizioni di stabilità e le formule di sottosterzo, descrive lo pneumatico con il modello di Pacejka (i coefficienti B, C, D, E e il loro significato), l’ellisse d’aderenza e la lunghezza di rilassamento, calcola i trasferimenti di carico, e mostra come questi modelli diventano i controlli di ESC, ABS, ACC, LKA e l’inseguimento di traiettoria pure pursuit. Le simulazioni sono in Python, con il codice verificato.
Valori numerici di un’auto media usati negli esempi:
kg,
kg·m²,
m,
m (
m),
kN/rad e
kN/rad (rigidezze di deriva di ciascun asse), altezza del baricentro
m.
Il modello a bicicletta, ricavato
Cinematica. Nel riferimento solidale al veicolo (x in avanti, y a sinistra) il baricentro ha velocità
e il veicolo ruota con velocità d’imbardata
. Un punto a distanza
davanti al baricentro lungo
ha velocità
(moto rigido:
). Quindi il centro dell’asse anteriore (
) ha velocità laterale
e quello posteriore (
)
.
Angoli di deriva. L’angolo tra la direzione della ruota e quella del suo centro è, per la ruota anteriore sterzata di
,
, e per la posteriore
. Con angoli piccoli e
costante si linearizza:
,
.
Dinamica. Il riferimento ruota con il veicolo: la derivata della velocità in un riferimento rotante contiene il termine
, la cui componente laterale è
. La seconda legge di Newton lungo
e l’equazione dei momenti attorno a
danno, con le forze laterali degli assi
e
(la forza anteriore è quasi perpendicolare all’asse del veicolo per
piccolo):
![]()
Sostituendo gli angoli di deriva si ottiene la forma di stato
con
:
![Rendered by QuickLaTeX.com \[ A = \begin{pmatrix} -\dfrac{C_f + C_r}{mv} & -v - \dfrac{aC_f - bC_r}{mv} \\ -\dfrac{aC_f - bC_r}{I_zv} & -\dfrac{a^2C_f + b^2C_r}{I_zv} \end{pmatrix},\qquad B = \begin{pmatrix} \dfrac{C_f}{m} \\ \dfrac{aC_f}{I_z} \end{pmatrix} \]](https://www.electronics-engineering.com/wp-content/ql-cache/quicklatex.com-cab3df82ecf46331565d1a353a7474a8_l3.png)
L’accelerazione laterale misurata da un accelerometro nel baricentro è
.
Regime, sottosterzo e stabilità, dimostrati
Teorema (sterzo a regime). In curva stazionaria di raggio
, con
e
:
![]()
Dimostrazione. A regime
. Dall’equazione dei momenti
; da quella di Newton
. Quindi
e
: ogni asse porta la frazione di forza centripeta corrispondente al carico che sostiene. Gli angoli di deriva sono
,
. Sottraendo le espressioni cinematiche:
. Quindi
. ∎
Il segno di
dice quale asse “deriva di più”: se l’anteriore deriva più del posteriore il veicolo sottosterza. Con i dati dell’esempio
mrad/(m/s²)
° per m/s²: in una curva a 4 m/s² (0,4 g) servono 0,77° di sterzo alle ruote in più rispetto alla geometria, cioè circa 12° al volante con un rapporto di sterzo di 15.
Teorema (stabilità). Il modello a bicicletta è stabile per ogni velocità se
; se
diventa instabile sopra
.
Dimostrazione. Un sistema
è stabile se e solo se la traccia di
è negativa e il determinante positivo. La traccia è sempre negativa. Calcolando il determinante e semplificando con
:
![Rendered by QuickLaTeX.com \[ \det A = \frac{C_fC_rL^2}{mI_zv^2} - \frac{aC_f - bC_r}{I_z} = \frac{C_fC_rL}{mI_z}\left(\frac{L}{v^2} + K_{us}\right) \]](https://www.electronics-engineering.com/wp-content/ql-cache/quicklatex.com-5bb80fb85fa5c05d1fff3d03557ff94b_l3.png)
(si è usato
). Con
è sempre positivo; con
si annulla per
e oltre diventa negativo: un polo reale passa nel semipiano destro. ∎
La funzione di trasferimento sterzo → imbardata ha guadagno statico
e poli che si spostano con la velocità. Con i dati dell’esempio (calcolo con il codice più sotto): a 10 m/s
rad/s e
; a 20 m/s 9,1 rad/s e 0,84; a 30 m/s 7,2 rad/s e 0,70. Il veicolo diventa più lento e meno smorzato al crescere della velocità: è quello che il guidatore sente come risposta “più pigra e ondeggiante” in autostrada.

Lo pneumatico: il modello di Pacejka
La formula magica di Pacejka descrive le forze misurate con poche costanti:
![]()
con
l’angolo di deriva (per la forza laterale) o lo scorrimento (per quella longitudinale), e
il valore di picco, circa
;
il fattore di forma, che decide quanto la curva cala dopo il picco (circa 1,3 per la forza laterale, 1,6-1,9 per quella longitudinale);
il fattore di rigidezza: la pendenza nell’origine è
, cioè la rigidezza di deriva
;
la curvatura, che modella la forma vicino al picco.
Nei modelli completi (MF 5.2, MF 6.1, usati nei simulatori dell’industria) ciascun coefficiente dipende a sua volta dal carico, dalla campanatura e dalla pressione attraverso decine di parametri misurati al banco. Due effetti contano anche nei modelli semplici:
- sensibilità al carico:
e
crescono meno che proporzionalmente con
. Per questo due ruote con carichi diversi danno in tutto meno forza laterale di due ruote con lo stesso carico medio: il trasferimento di carico laterale “toglie” aderenza all’asse su cui è più grande; - ellisse d’aderenza: la forza totale non può superare circa
, in qualsiasi direzione:
. Frenare in curva toglie forza laterale: è il motivo per cui l’ABS lascia le ruote sterzanti in grado di generare forza.


Lunghezza di rilassamento. Lo pneumatico non genera la forza istantaneamente: deve rotolare per un tratto
(dell’ordine di 0,3-0,5 m) perché la deformazione si stabilizzi. Il modello è un primo ordine
, con costante di tempo
: a bassa velocità lo pneumatico è “lento”, e questo conta nei controlli di stabilità a 10-20 km/h.
I trasferimenti di carico
Longitudinale. In frenata con decelerazione
, l’equilibrio dei momenti attorno al punto di contatto posteriore, con la forza d’inerzia
applicata nel baricentro all’altezza
, dà
![]()
Con i dati dell’esempio e
: a riposo 8,49 kN davanti e 6,23 dietro; in frenata 10,98 e 3,74 kN. Per questo i freni anteriori sono più grandi e la ripartizione di frenata va adattata al carico (ripartitore elettronico EBD): bloccare prima le ruote posteriori rende il veicolo instabile.
Laterale. In curva, su ciascun asse di carreggiata
, il carico passa dalla ruota interna all’esterna di
, con una ripartizione tra gli assi decisa dalle rigidezze delle barre antirollio. Per la sensibilità al carico, l’asse con più trasferimento perde più rigidezza di deriva: irrigidire la barra anteriore rende il veicolo più sottosterzante, quella posteriore più sovrasterzante. È la regolazione più usata in pista.

Dalla ruota all’ABS
La dinamica di una ruota è
, con
la coppia (motrice o frenante) e
. In frenata, se la coppia frenante supera quella che la strada può restituire al picco di
, la ruota decelera sempre più in fretta e si blocca (
): lo pneumatico striscia, perde aderenza laterale e il veicolo non sterza più. L’ABS stima lo scorrimento dalle velocità delle ruote e modula la pressione dei freni per tenerlo vicino al picco (circa 0,1-0,2), con cicli di 5-15 al secondo. Il controllo di trazione fa lo stesso in accelerazione riducendo la coppia del motore o frenando la ruota che slitta.
ESC: il controllo di stabilità
L’ESC confronta la velocità d’imbardata misurata con un riferimento dato dal modello a bicicletta e limitato dall’aderenza:
![]()
Il limite viene da
. Se
supera il riferimento il veicolo sovrasterza: si frena la ruota anteriore esterna, che crea un momento che raddrizza. Se
è troppo piccola il veicolo sottosterza: si frena la ruota posteriore interna. Il controllore è tipicamente un PI sull’errore di imbardata con logiche di attivazione, e lavora insieme all’ABS sugli stessi freni.
Il modello cinematico e il pure pursuit
A bassa velocità le derive sono trascurabili: le ruote si muovono dove puntano. Il modello cinematico a bicicletta, riferito all’asse posteriore, è
![]()
Teorema (pure pursuit). Per raggiungere, con un arco di cerchio, un punto
della traiettoria a distanza
e visto con un angolo
rispetto all’asse del veicolo, serve la curvatura
, cioè lo sterzo
.
Dimostrazione. Il cerchio cercato è tangente all’asse del veicolo nell’asse posteriore e passa per
. Il centro sta sulla perpendicolare all’asse, a distanza
. Il triangolo formato dal centro, dall’asse posteriore e da
è isoscele (due lati sono raggi), e l’angolo al centro è
(l’angolo tra corda e tangente è metà dell’angolo al centro). Quindi
,
. Nel modello cinematico
, da cui
. ∎
è il solo parametro: piccolo dà un inseguimento preciso ma oscillante, grande dà un inseguimento dolce che “taglia” le curve. Di solito si fa crescere con la velocità,
.

ACC e LKA
ACC. Con la distanza
dal veicolo che precede e la sua velocità
, la politica a tempo di distacco costante vuole
. Un controllore semplice comanda un’accelerazione
, poi limitata per il comfort (circa da −3 a +2 m/s²) e attuata dal controllo di coppia del motore e dei freni. In una colonna di veicoli tutti con ACC, la politica a tempo di distacco con
sufficiente garantisce la stabilità di colonna: un disturbo del primo veicolo non si amplifica lungo la fila.

LKA. Si scrive il modello a bicicletta rispetto alla corsia:
lo scostamento laterale dal centro,
l’angolo tra il veicolo e la tangente alla corsia,
la curvatura della strada. Per angoli piccoli
e
: con lo stato
si ottiene un modello lineare del quarto ordine (Rajamani) su cui si progetta un controllo per retroazione dello stato (LQR) o predittivo (MPC), con la curvatura come disturbo misurato da compensare in anticipo.

Le simulazioni in Python
Il modello a bicicletta, con i guadagni e i poli a varie velocità e la risposta al gradino:
import numpy as np
# parametri di un'auto media
m, Iz = 1500.0, 2500.0 # massa [kg], momento d'inerzia di imbardata [kg m^2]
a, b = 1.1, 1.5 # distanze del baricentro dall'asse anteriore e posteriore [m]
L = a + b # passo [m]
Cf, Cr = 100e3, 120e3 # rigidezze di deriva degli assi [N/rad]
def matrici(v):
"""Modello a bicicletta lineare: stato x = [vy, r], ingresso delta (sterzo alle ruote)."""
A = np.array([[-(Cf + Cr) / (m * v), -v - (a * Cf - b * Cr) / (m * v)],
[-(a * Cf - b * Cr) / (Iz * v), -(a**2 * Cf + b**2 * Cr) / (Iz * v)]])
B = np.array([Cf / m, a * Cf / Iz])
return A, B
Kus = m / L * (b / Cf - a / Cr) # gradiente di sottosterzo [rad/(m/s^2)]
vch = np.sqrt(L / Kus) # velocità caratteristica [m/s]
print(f"Kus = {Kus*1e3:.2f} mrad/(m/s^2) = {np.degrees(Kus):.3f} gradi/(m/s^2)")
print(f"velocità caratteristica = {vch:.1f} m/s = {vch*3.6:.0f} km/h")
for v in (10.0, 20.0, 30.0):
A, B = matrici(v)
x_ss = -np.linalg.solve(A, B) # regime per delta = 1 rad
lam = np.linalg.eigvals(A)
wn = np.sqrt(np.prod(lam).real); zeta = -lam.real.sum() / (2 * wn)
print(f"v = {v:4.1f} m/s: r/delta = {x_ss[1]:.3f} 1/s (formula {v/(L + Kus*v**2):.3f}), "
f"poli {np.round(lam, 2)}, wn = {wn:.2f} rad/s, zeta = {zeta:.2f}")
# risposta a un gradino di sterzo di 2 gradi a 20 m/s (Eulero, passo 1 ms)
v, dt = 20.0, 0.001
A, B = matrici(v)
x = np.zeros(2); d = np.radians(2.0)
t_hist, r_hist, ay_hist = [], [], []
for k in range(3000):
dx = A @ x + B * d
ay = dx[0] + v * x[1] # accelerazione laterale
x = x + dt * dx
t_hist.append(k * dt); r_hist.append(x[1]); ay_hist.append(ay)
r = np.array(r_hist)
print(f"gradino 2 gradi a 20 m/s: r finale {np.degrees(r[-1]):.2f} gradi/s, "
f"ay finale {ay_hist[-1]:.2f} m/s^2, picco r {np.degrees(r.max()):.2f} gradi/s")L’esecuzione stampa
mrad/(m/s²), velocità caratteristica 27,8 m/s (100 km/h), i guadagni 3,405, 5,068 e 5,330 s
uguali alla formula, i poli e gli smorzamenti citati sopra, e per il gradino
°/s,
m/s² con picco di 10,44°/s.
Il pure pursuit su un cambio di corsia di 3,5 m a 10 m/s:
import numpy as np
L, v, dt = 2.6, 10.0, 0.01 # passo [m], velocità [m/s], passo di integrazione [s]
Ld = 8.0 # distanza di guardata [m]
delta_max = np.radians(30)
# traiettoria di riferimento: cambio di corsia di 3,5 m dolce (sinusoide)
xs = np.linspace(0, 200, 4001)
ys = np.where(xs < 50, 0.0, np.where(xs > 90, 3.5, 1.75 * (1 - np.cos(np.pi * (xs - 50) / 40))))
x, y, psi = 0.0, 0.0, 0.0 # posizione dell'asse posteriore e imbardata
err = []
for k in range(int(15 / dt)):
# punto della traiettoria a distanza Ld davanti al veicolo
d = np.hypot(xs - x, ys - y)
ahead = np.where((d >= Ld) & (xs > x))[0]
gx, gy = xs[ahead[0]], ys[ahead[0]]
alpha = np.arctan2(gy - y, gx - x) - psi # angolo verso il punto G
delta = np.arctan(2 * L * np.sin(alpha) / Ld) # legge del pure pursuit
delta = np.clip(delta, -delta_max, delta_max)
# modello cinematico a bicicletta (riferito all'asse posteriore)
x += v * np.cos(psi) * dt
y += v * np.sin(psi) * dt
psi += v / L * np.tan(delta) * dt
err.append(y - np.interp(x, xs, ys))
err = np.array(err)
print(f"errore laterale massimo {abs(err).max():.2f} m, finale {abs(err[-1]):.3f} m")L’errore laterale massimo è di 7 cm e alla fine si annulla. Per modelli più completi l’industria usa simulatori commerciali (IPG CarMaker, VI-grade, CarSim, il Vehicle Dynamics Blockset di MATLAB); in ambito aperto ci sono CARLA (guida autonoma, con API Python) e i modelli di veicolo di Modelica, utilizzabili con OpenModelica.
Gli esercizi su sottosterzo, pneumatici, trasferimenti di carico, frenata e funzioni ADAS sono nella pagina degli esercizi collegata in cima.





