Model Predictive Control (MPC)
Il controllo predittivo basato su modello (MPC) pianifica una breve sequenza di azioni con un modello, ne applica solo la prima e ripianifica a ogni passaggio. Panoramica dei componenti, degli impieghi e del codice.
Il controllo predittivo del modello (MPC) è un metodo di controllo che usa un modello del sistema per prevederne il comportamento su un breve orizzonte futuro, sceglie la sequenza di azioni che raggiunge meglio un obiettivo rispettando i vincoli, applica soltanto la prima azione e poi ripete l’intero processo al passo temporale successivo con nuove misurazioni. Questo ciclo di pianificazione, azione e ripianificazione è detto controllo a orizzonte mobile e consente al controllore di anticipare ciò che sta per accadere, anziché reagire soltanto all’errore corrente. L’MPC si è sviluppato alla fine degli anni Settanta nell’ambito della raffinazione petrolifera e della lavorazione chimica, dove il Dynamic Matrix Control di Shell fu tra le prime applicazioni industriali; oggi guida robot, veicoli autonomi e sistemi di climatizzazione degli edifici.
Componenti di un controllore MPC#
Ogni controllore MPC combina quattro componenti:
- Modello della dinamica: Prevede lo stato successivo a partire dallo stato corrente e da un’azione, per esempio come cambiano la posizione e l’orientamento di un’auto in base all’angolo di sterzata. Può derivare da equazioni fisiche, dall’identificazione del sistema su dati registrati o da una rete neurale addestrata su traiettorie registrate.
- Funzione di costo: valuta una traiettoria prevista, di solito penalizzando la distanza dall'obiettivo, il consumo energetico e le variazioni brusche dei controlli.
- Vincoli: Limiti che ogni piano deve rispettare, come la coppia massima del motore, i limiti di velocità e le zone di esclusione attorno agli ostacoli. La gestione esplicita dei vincoli è il principale vantaggio dell’MPC rispetto al controllo PID classico, che reagisce agli errori solo dopo che si sono verificati e non può anticipare un limite.
- Ottimizzatore: Cerca la sequenza di azioni migliore all’interno dell’orizzonte a ogni passaggio di controllo.
Il modello determina la difficoltà dell’ottimizzazione. Un modello lineare con un costo quadratico diventa un problema di programmazione quadratica, che i solver dedicati risolvono in millisecondi o meno; i modelli non lineari richiedono solver di MPC non lineare, in genere abbinati a un filtro di Kalman esteso per stimare lo stato, oppure a una ricerca basata sul campionamento. A ogni passaggio di controllo, l’ottimizzatore esegue un ciclo interno di previsione e miglioramento dei piani candidati, mentre il controllore esegue un ciclo esterno che applica un’azione e riparte dallo stato appena misurato:
La lunghezza dell’orizzonte è la principale scelta di regolazione. Un orizzonte più lungo consente a un veicolo di frenare in anticipo prima di una curva stretta, ma ogni passaggio aggiuntivo aumenta il calcolo e accumula l’errore di previsione del modello; inoltre, l’intera ottimizzazione deve terminare entro un periodo di controllo.
Orizzonte mobile nel codice#
Il frammento seguente controlla un carrello che deve raggiungere la posizione 5 e fermarsi, con un'accelerazione limitata a più o meno 1. A ogni passo campiona 500 piani di accelerazione casuali, predice la traiettoria di ciascun piano con la dinamica del carrello, esegue la prima azione del piano meno costoso e ricalcola il piano a partire dal nuovo stato:
import numpy as np
rng = np.random.default_rng(0)
position, velocity, target = 0.0, 0.0, 5.0
dt, horizon = 0.1, 30
for _ in range(100):
# Sample 500 candidate plans of accelerations within the actuator limit of +/-1
plans = rng.uniform(-1, 1, size=(500, horizon))
# Predict every plan's trajectory with the cart's dynamics model
v = velocity + dt * plans.cumsum(axis=1)
p = position + dt * v.cumsum(axis=1)
# Cost: distance from the target at each step plus speed at the end of the horizon
cost = ((p - target) ** 2).sum(axis=1) + 10 * v[:, -1] ** 2
# Apply only the first action of the cheapest plan, then replan from the new state
velocity += dt * plans[cost.argmin(), 0]
position += dt * velocity
print(f"position: {position:.2f}, velocity: {velocity:.2f}")Dopo 10 secondi simulati, il carrello si trova alla posizione 5.04 con una velocità di 0.04. Nessun piano casuale è valido da solo, ma eseguire un passaggio e ripianificare a partire dallo stato misurato corregge continuamente gli errori. Questo approccio, detto campionamento casuale, è il metodo più semplice della famiglia MPC basata sul campionamento, che comprende anche il metodo dell’entropia incrociata e il controllo a integrale di percorso predittivo del modello (MPPI), usato dai ricercatori di Georgia Tech per far correre un’auto da rally in scala 1:5 su una pista sterrata.
MPC in impianti, robot, auto ed edifici#
- Industrie di processo: raffinerie, impianti chimici e centrali elettriche usano l'MPC per mantenere temperature, pressioni e qualità dei prodotti vicino ai limiti che massimizzano la produttività: il contesto in cui il metodo è nato.
- Robot con zampe: Il Cheetah 3 del MIT correva e manteneva l’equilibrio con un MPC convesso che ricalcolava le forze di reazione al suolo molte volte al secondo; in seguito il MIT ha rilasciato quel controllore come software open source per il suo Mini Cheetah.
- Guida: I controllori di tracciamento del percorso nelle auto a guida autonoma usano l’MPC per seguire una traiettoria pianificata in modo fluido, rispettando i limiti di sterzata, accelerazione e comfort.
- Edifici: i controllori di riscaldamento e raffreddamento predicono le temperature degli ambienti con ore di anticipo, usando le previsioni meteorologiche e di occupazione per raffreddarli o riscaldarli in anticipo, quando l'energia costa meno.
MPC a confronto con gli approcci correlati#
- Controllo PID: Un controllore PID calcola l’uscita in base all’errore corrente, al suo integrale e alla sua velocità di variazione. È semplice ed economico, ma non dispone di un modello del futuro né di una nozione dei vincoli.
- Regolatore lineare quadratico (LQR): LQR trova in forma chiusa la legge di retroazione ottimale per un sistema lineare con un costo quadratico su un orizzonte infinito. L’MPC risolve online una versione a orizzonte finito, il che gli consente di imporre vincoli e gestire modelli non lineari.
- Apprendimento per rinforzo: L’RL apprende una policy dall’esperienza prima della distribuzione; in seguito, scegliere un’azione richiede un solo passaggio in avanti rapido. L’MPC risolve online una nuova ottimizzazione usando un modello esplicito.
I due approcci si stanno integrando sempre più. Il deep reinforcement learning basato su modello apprende un modello del mondo e pianifica al suo interno con l’MPC; metodi come TD-MPC2 pianificano in uno spazio latente appreso, mentre una funzione di valore appresa valuta ciò che accade oltre la fine del breve orizzonte. I modelli di dinamica appresi sono una forma di modellazione predittiva e la loro accuratezza lungo l’orizzonte determina quanto avanti un simile controllore possa pianificare in modo utile.
Percezione per l’MPC#
Un controllore MPC pianifica bene solo quanto riesce a percepire; in un sistema di IA fisica, come un robot che si muove tra le persone, il suo stato deve includere la posizione delle persone e la direzione in cui si stanno muovendo. Una fotocamera che esegue Ultralytics YOLO26 in modalità di tracking fornisce una bounding box e un ID di tracking persistente per ogni persona in ogni fotogramma. Combinando queste tracce con la stima della profondità o con la calibrazione della fotocamera e un filtro di Kalman, si ottengono le posizioni e le velocità degli ostacoli che i vincoli del controllore devono evitare.










