Vai al contenuto
Progettazione di Sistemi di Automazione

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: m = 1500 kg, I_z = 2500 kg·m², a = 1{,}1 m, b = 1{,}5 m (L = 2{,}6 m), C_f = 100 kN/rad e C_r = 120 kN/rad (rigidezze di deriva di ciascun asse), altezza del baricentro h = 0{,}55 m.

Il modello a bicicletta, ricavato

Cinematica. Nel riferimento solidale al veicolo (x in avanti, y a sinistra) il baricentro ha velocità (v_x, v_y) e il veicolo ruota con velocità d’imbardata r. Un punto a distanza \ell davanti al baricentro lungo x ha velocità (v_x,\ v_y + r\ell) (moto rigido: \vec v_P = \vec v_G + \vec r\times\vec{GP}). Quindi il centro dell’asse anteriore (\ell = a) ha velocità laterale v_y + ar e quello posteriore (\ell = -b) v_y - br.

Angoli di deriva. L’angolo tra la direzione della ruota e quella del suo centro è, per la ruota anteriore sterzata di \delta, \alpha_f = \delta - \arctan\frac{v_y + ar}{v_x}, e per la posteriore \alpha_r = -\arctan\frac{v_y - br}{v_x}. Con angoli piccoli e v_x = v costante si linearizza: \alpha_f = \delta - \frac{v_y + ar}{v}, \alpha_r = -\frac{v_y - br}{v}.

Dinamica. Il riferimento ruota con il veicolo: la derivata della velocità in un riferimento rotante contiene il termine \vec r\times\vec v, la cui componente laterale è r\,v_x. La seconda legge di Newton lungo y e l’equazione dei momenti attorno a z danno, con le forze laterali degli assi F_{yf} = C_f\alpha_f e F_{yr} = C_r\alpha_r (la forza anteriore è quasi perpendicolare all’asse del veicolo per \delta piccolo):

    \[ m(\dot v_y + v\,r) = F_{yf} + F_{yr},\qquad I_z\,\dot r = a\,F_{yf} - b\,F_{yr} \]

Sostituendo gli angoli di deriva si ottiene la forma di stato \dot x = Ax + B\delta con x = (v_y, r):

    \[ 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} \]

L’accelerazione laterale misurata da un accelerometro nel baricentro è a_y = \dot v_y + v\,r.

Regime, sottosterzo e stabilità, dimostrati

Teorema (sterzo a regime). In curva stazionaria di raggio R, con r = v/R e a_y = v^2/R:

    \[ \delta = \frac{L}{R} + K_{us}\,a_y,\qquad K_{us} = \frac{m}{L}\left(\frac{b}{C_f} - \frac{a}{C_r}\right) \]

Dimostrazione. A regime \dot v_y = \dot r = 0. Dall’equazione dei momenti aF_{yf} = bF_{yr}; da quella di Newton F_{yf} + F_{yr} = m\,a_y. Quindi F_{yf} = \frac{b}{L}m\,a_y e F_{yr} = \frac{a}{L}m\,a_y: ogni asse porta la frazione di forza centripeta corrispondente al carico che sostiene. Gli angoli di deriva sono \alpha_f = \frac{bm\,a_y}{LC_f}, \alpha_r = \frac{am\,a_y}{LC_r}. Sottraendo le espressioni cinematiche: \alpha_f - \alpha_r = \delta - \frac{(a + b)r}{v} = \delta - \frac{L}{R}. Quindi \delta = \frac{L}{R} + \alpha_f - \alpha_r = \frac{L}{R} + \frac{m}{L}\left(\frac{b}{C_f} - \frac{a}{C_r}\right)a_y. ∎

Il segno di K_{us} dice quale asse “deriva di più”: se l’anteriore deriva più del posteriore il veicolo sottosterza. Con i dati dell’esempio K_{us} = 3{,}37 mrad/(m/s²) = 0{,}19° 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 K_{us} \ge 0; se K_{us} \lt  0 diventa instabile sopra v_{crit} = \sqrt{L/|K_{us}|}.

Dimostrazione. Un sistema 2\times 2 è stabile se e solo se la traccia di A è negativa e il determinante positivo. La traccia è sempre negativa. Calcolando il determinante e semplificando con (C_f + C_r)(a^2C_f + b^2C_r) - (aC_f - bC_r)^2 = C_fC_rL^2:

    \[ \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) \]

(si è usato aC_f - bC_r = -\frac{LC_fC_r}{m}K_{us}). Con K_{us} \ge 0 è sempre positivo; con K_{us} \lt  0 si annulla per v^2 = L/|K_{us}| e oltre diventa negativo: un polo reale passa nel semipiano destro. ∎

La funzione di trasferimento sterzo → imbardata ha guadagno statico \frac{r}{\delta} = \frac{v}{L + K_{us}v^2} e poli che si spostano con la velocità. Con i dati dell’esempio (calcolo con il codice più sotto): a 10 m/s \omega_n = 15{,}6 rad/s e \zeta = 0{,}97; 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.

Risposta a un gradino di sterzo di 2 gradi a 20 metri al secondo
La velocità d’imbardata, in blu, sale fino a circa 10 gradi al secondo con una piccola sovraelongazione; l’accelerazione laterale, rossa tratteggiata e moltiplicata per 2,5, ha un salto iniziale dovuto alla forza dell’asse anteriore e si assesta intorno a 3,5 metri al secondo quadro.

Lo pneumatico: il modello di Pacejka

La formula magica di Pacejka descrive le forze misurate con poche costanti:

    \[ y(x) = D\sin\Big(C\arctan\big(Bx - E(Bx - \arctan Bx)\big)\Big) \]

con x l’angolo di deriva (per la forza laterale) o lo scorrimento (per quella longitudinale), e

  • D il valore di picco, circa \mu F_z;
  • C 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);
  • B il fattore di rigidezza: la pendenza nell’origine è BCD, cioè la rigidezza di deriva C_\alpha = BCD;
  • E 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: C_\alpha e \mu crescono meno che proporzionalmente con F_z. 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 \mu F_z, in qualsiasi direzione: \left(\frac{F_x}{\mu_xF_z}\right)^2 + \left(\frac{F_y}{\mu_yF_z}\right)^2 \le 1. Frenare in curva toglie forza laterale: è il motivo per cui l’ABS lascia le ruote sterzanti in grado di generare forza.
Coefficiente d'aderenza longitudinale in funzione dello scorrimento
Su asfalto asciutto, curva 1, il picco è intorno a 1 per uno scorrimento di circa 0,15; sul bagnato, curva 2, intorno a 0,7; su neve, curva 3, intorno a 0,3 e con un massimo meno marcato. Oltre il picco la ruota tende a bloccarsi.
Il cerchio d'aderenza
La forza risultante sullo pneumatico, freccia rossa, deve stare dentro il cerchio di raggio mu per N: se si usa parte dell’aderenza per frenare o accelerare, ne resta meno per curvare.

Lunghezza di rilassamento. Lo pneumatico non genera la forza istantaneamente: deve rotolare per un tratto \sigma (dell’ordine di 0,3-0,5 m) perché la deformazione si stabilizzi. Il modello è un primo ordine \frac{\sigma}{v}\dot F_y + F_y = C_\alpha\alpha, con costante di tempo \sigma/v: 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 a, l’equilibrio dei momenti attorno al punto di contatto posteriore, con la forza d’inerzia m\,a applicata nel baricentro all’altezza h, dà

    \[ N_f = mg\frac{b}{L} + \frac{m\,a\,h}{L},\qquad N_r = mg\frac{a}{L} - \frac{m\,a\,h}{L} \]

Con i dati dell’esempio e a = 0{,}8g: 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 t, il carico passa dalla ruota interna all’esterna di \Delta N = \frac{m_{asse}\,a_y\,h_{eff}}{t}, 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.

Trasferimento di carico in frenata
Il veicolo si muove verso destra e frena: le forze di frenata sono all’indietro, e la risultante m a applicata nel baricentro, all’altezza h, carica l’asse anteriore, freccia N f più lunga, e scarica quello posteriore.

Dalla ruota all’ABS

La dinamica di una ruota è I_w\dot\omega = T - R_eF_x, con T la coppia (motrice o frenante) e F_x = \mu_x(\lambda)F_z. In frenata, se la coppia frenante supera quella che la strada può restituire al picco di \mu_x, la ruota decelera sempre più in fretta e si blocca (\lambda = -1): 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:

    \[ r_{ref} = \text{sat}\left(\frac{v}{L + K_{us}v^2}\,\delta,\ \pm\frac{\mu g}{v}\right) \]

Il limite viene da a_y = v\,r \le \mu g. Se r supera il riferimento il veicolo sovrasterza: si frena la ruota anteriore esterna, che crea un momento che raddrizza. Se r è 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, è

    \[ \dot x = v\cos\psi,\qquad \dot y = v\sin\psi,\qquad \dot\psi = \frac{v}{L}\tan\delta \]

Teorema (pure pursuit). Per raggiungere, con un arco di cerchio, un punto G della traiettoria a distanza L_d e visto con un angolo \alpha rispetto all’asse del veicolo, serve la curvatura \kappa = \frac{2\sin\alpha}{L_d}, cioè lo sterzo \delta = \arctan\frac{2L\sin\alpha}{L_d}.

Dimostrazione. Il cerchio cercato è tangente all’asse del veicolo nell’asse posteriore e passa per G. Il centro sta sulla perpendicolare all’asse, a distanza R. Il triangolo formato dal centro, dall’asse posteriore e da G è isoscele (due lati sono raggi), e l’angolo al centro è 2\alpha (l’angolo tra corda e tangente è metà dell’angolo al centro). Quindi \frac{L_d}{2} = R\sin\alpha, \kappa = \frac{1}{R} = \frac{2\sin\alpha}{L_d}. Nel modello cinematico \kappa = \frac{\tan\delta}{L}, da cui \delta. ∎

L_d è 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à, L_d = k\,v.

Geometria del pure pursuit
Il veicolo, in blu, punta verso l’alto; il punto G sulla traiettoria verde è a distanza L d e si vede con l’angolo alfa. L’arco arancione tratteggiato, tangente all’asse del veicolo e passante per G, ha raggio R: è la curva che lo sterzo deve imporre.

ACC e LKA

ACC. Con la distanza d dal veicolo che precede e la sua velocità v_p, la politica a tempo di distacco costante vuole d_{des} = d_0 + h\,v. Un controllore semplice comanda un’accelerazione a_{cmd} = k_1(d - d_{des}) + k_2(v_p - v), 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 h sufficiente garantisce la stabilità di colonna: un disturbo del primo veicolo non si amplifica lungo la fila.

La distanza di sicurezza dell'ACC
Il veicolo con l’ACC, in blu, mantiene dal veicolo che precede una distanza d uguale a una parte fissa d zero più il tempo di distacco h per la propria velocità.

LKA. Si scrive il modello a bicicletta rispetto alla corsia: e_y lo scostamento laterale dal centro, e_\psi l’angolo tra il veicolo e la tangente alla corsia, \kappa la curvatura della strada. Per angoli piccoli \dot e_y = v_y + v\,e_\psi e \dot e_\psi = r - v\kappa: con lo stato (e_y, \dot e_y, e_\psi, \dot e_\psi) 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 coordinate d'errore rispetto alla corsia
Lo scostamento laterale e y è la distanza del veicolo dal centro della corsia, in verde; l’errore d’imbardata e psi è l’angolo tra l’asse del veicolo e la direzione della corsia.

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 K_{us} = 3{,}37 mrad/(m/s²), velocità caratteristica 27,8 m/s (100 km/h), i guadagni 3,405, 5,068 e 5,330 s^{-1} uguali alla formula, i poli e gli smorzamenti citati sopra, e per il gradino r = 10{,}14°/s, a_y = 3{,}54 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.

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
0
Would love your thoughts, please comment.x
()
x