Simulatore robot bilanciatore: PID per pendolo invertito
Fai stare in equilibrio un robot a due ruote nel browser. Trascinalo, spingilo e modifica i guadagni PID in cascata per vedere come cade un vero bilanciatore.
- Categoria
- Controlli automatici
- Tempo
- 2–4 ore
- Piattaforma
- Browser · Arduino
01 / Inizia qui
Introduzione
Un robot autobilanciante è un pendolo invertito: la massa si trova sopra l'asse, quindi stare fermi è un equilibrio instabile che solo un ciclo attivo mantiene. Trascina il corpo e lascialo andare, spingilo oppure azzera il guadagno derivativo e guarda l'oscillazione crescere finché non colpisce il pavimento. Il tracciato mostra l'inclinazione rispetto all'angolo oltre il quale nessuna coppia motore può salvarlo.
Live lab / Inverted pendulum & cascaded PID
Self-balancing robot simulator
A two-wheeled robot with its centre of mass above the axle — an inverted pendulum that falls the moment the loop stops. Drag the body over and let go, shove it, or detune the gains and watch exactly how it fails.
Drag the robot to lean it over and let go — the loop takes it from wherever you leave it. The dashed line is the tilt target the outer loop is asking for; the bar at the axle is the motor command. The trace above plots tilt against the ±35° fall threshold.
- Measured tilt
- Tilt target (outer loop)
- Motor command
- Fall threshold
- Tilt
- 0.0°
- Tilt target
- 0.0°
- Motor
- 0%
- Position
- 0 cm
- Upright for
- 0.0 s
- Worst tilt
- 0.0°
Keyboard: focus the robot, then use Space to run/pause, S to shove it, L to switch the loop on or off, R to reset, and F for full screen.
Controlli
Avvia, Pausa e Reimposta eseguono l’anello. Spingi applica un impulso come un dito, mentre Anello on/off disattiva entrambi i controllori per vedere cadere il solo processo.
Il controllo più diretto è il robot stesso: trascina il corpo in qualsiasi angolo e lascialo andare. La posizione in cui lo lasci è quella da cui parte il controllore — non c’è una fase di riattivazione e i cursori dei guadagni si applicano immediatamente alla simulazione in esecuzione. Porta il guadagno derivativo a zero mentre il robot è in equilibrio e inizia a oscillare nello stesso istante.
Il menu Taratura carica quattro preset: uno funzionante e tre che falliscono nei tre modi in cui falliscono i bilanciatori reali.
Porta il focus sul canvas e usa Space, S, L, R e F per gli stessi controlli dalla tastiera.
Teoria
Tenere un robot in piedi su due ruote significa mantenere in verticale un pendolo invertito. Il baricentro si trova sopra l’asse, quindi la verticale è un equilibrio nello stesso senso in cui lo è una matita appoggiata sulla punta: matematicamente reale, fisicamente impossibile senza correzioni costanti. Inclinalo di qualsiasi angolo e la gravità produce una coppia che lo inclina ulteriormente. Più va lontano, più rapidamente va.
Il robot ha esattamente un modo per contrastare quella coppia: può spostare l’asse. Accelerando le ruote in avanti spinge la base di nuovo sotto il baricentro, facendo ruotare il corpo verso la verticale. Ecco perché la correzione sembra invertita all’inizio: per fermare una caduta in avanti devi avanzare, proprio come sposti la mano sotto una scopa che stai bilanciando invece di allontanarla.
Questo dà al robot un limite rigido. Oltre circa 35°, l’accelerazione orizzontale necessaria supera ciò che le ruote possono fornire prima che il corpo colpisca il pavimento, e nessun aumento del guadagno aiuta. Le linee tratteggiate sul tracciato indicano quel confine.
Algoritmo
Il controllore è in cascata — due anelli PID, uno alimenta l’altro.
L’anello interno funziona rapidamente e mantiene un angolo di inclinazione. Confronta l’angolo misurato con un obiettivo e comanda la coppia motore:
error = measured_angle − target_angle
motor = Kp·error + Ki·∫error + Kd·d(measured)/dt
Nota che l’errore è misurato meno l’obiettivo, non l’obiettivo meno il valore misurato secondo il libro. Fermare una caduta in avanti significa far avanzare le ruote, quindi un’inclinazione positiva deve produrre un comando motorio positivo. Questo segno è il motivo più comune per cui il primo robot bilanciatore si schianta a terra subito dopo l’accensione.
L’anello esterno funziona più lentamente e mantiene una posizione. Non può comandare i motori — sono già occupati — quindi comanda invece un obiettivo di inclinazione per l’anello interno:
target_angle = Kp_pos·(desired_position − position) − Kd_pos·velocity
Quando si trova dietro il punto in cui vuole essere, chiede una piccola inclinazione in avanti; l’anello interno poi fa avanzare le ruote per mantenere quell’inclinazione e il robot avanza. L’inclinazione viene deliberatamente limitata a pochi gradi. Un anello esterno che può richiedere un angolo elevato assegnerà all’anello interno un obiettivo che non può mantenere, e perderanno entrambi nello stesso momento.
Il termine integrale conta più qui che nella maggior parte degli anelli, perché assorbe la differenza tra dove l’IMU ritiene che sia la verticale e dove si trova realmente. È anche il motivo per cui l’integrale deve smettere di accumulare mentre i motori sono saturati — altrimenti si carica durante una caduta che non ha la potenza per prevenire e poi ostacola il recupero.
Codice sorgente
// Inner loop: tilt → motors. Runs every 5 ms off a timer, not in loop().
float angleError = angle - tiltTarget; // measured minus target
angleIntegral = constrain(angleIntegral + angleError * dt, -3, 3);
float command = Kp * angleError
+ Ki * angleIntegral
+ Kd * gyroRate; // rate straight from the gyro
command = constrain(command, -255, 255);
if (fabs(angle) > FALL_ANGLE) command = 0; // past saving; cut the motors
driveMotors(command, command);
// Outer loop: position → tilt target. Runs ten times slower, and may only
// ever ask for a small lean.
if (++slowTick >= 10) {
slowTick = 0;
float positionError = 0 - wheelPosition;
tiltTarget = constrain(KpPos * positionError - KdPos * wheelVelocity,
-0.12, 0.12); // radians, about ±7°
}
Due dettagli passano direttamente da questo simulatore. Prendi il termine derivativo dalla velocità angolare del giroscopio invece di differenziare l’angolo: il giroscopio misura direttamente quella velocità e senza il rumore che la differenziazione amplifica. Inoltre, interrompi i motori oltre l’angolo di recupero invece di lasciare che il controllore continui a fare forza — risparmia i riduttori e rende il fallimento evidente invece che violento.
Hardware
Il sensore è un MPU6050, che contiene sia un accelerometro sia un giroscopio, perché nessuno dei due da solo è utilizzabile. L’accelerometro sa dove si trova il basso, ma viene saturato dal movimento del robot stesso; il giroscopio segue bene la rotazione, ma deriva in pochi secondi. Un filtro complementare li fusiona in un angolo stabile e rapido.
I motori devono avere un rapporto di riduzione abbastanza basso da fornire coppia e abbastanza rapido da recuperare una caduta — i motori con riduttore N20 intorno a 200 RPM sono una scelta comune, azionati da un TB6612FNG, la cui bassa caduta di tensione conta quando l’anello richiede piccole correzioni migliaia di volte al secondo.
Costruiscilo davvero nel progetto del robot autobilanciante oppure inizia dal tutorial sulla lettura dell’inclinazione se l’IMU è nuovo per te.
Ipotesi e differenze hardware
Il modello è un pendolo invertito 2D con un solo asse di inclinazione, collegamenti rigidi, nessuno slittamento delle ruote e un IMU che segnala l’angolo e la velocità reali con solo la deriva e il rumore che imposti. Un robot bilanciatore reale sente una coppia motore che varia con la tensione della batteria, la quantizzazione degli encoder, l’offset di montaggio dell’IMU e la deriva termica; inoltre può cadere di lato — un grado di libertà che questo laboratorio elimina completamente. La struttura PID in cascata e il derivativo basato sulla velocità del giroscopio mostrate qui si trasferiscono direttamente, ma la taratura del montaggio, quella del filtro e il limite dell’angolo di caduta devono essere ritrovati sul telaio fisico.
Schema elettrico
Due regole di cablaggio decidono se questo robot funziona.
La batteria dei motori raggiunge il pin VM del driver e nient’altro. La corrente dei motori non deve mai attraversare l’Arduino e ogni massa — scheda, driver, IMU, polo negativo della batteria — deve essere collegata insieme, altrimenti i segnali di controllo non hanno un riferimento comune e il fallimento è silenzioso anziché evidente.
L’encoder è alimentato dalla logica, non dalla pista dei motori. Alimentare un encoder con l’alimentazione dei motori lo distrugge o riempie i conteggi di rumore di commutazione. Collega anche il canale A dell’encoder a un pin in grado di generare interrupt; leggerlo a polling da loop() perde conteggi, e i conteggi persi fanno perdere lentamente all’anello esterno il riferimento alla posizione del robot.
Monta l’IMU vicino all’asse. Montarlo in alto moltiplica l’accelerazione lineare che vede durante ogni correzione, rendendo più difficile il problema della fusione senza alcun vantaggio.
Checklist hardware
Componenti
- Arduino Nano o Uno
- accelerometro e giroscopio MPU6050
- driver doppio del motore TB6612FNG
- Due motoriduttori con encoder N20
- Pacco batteria al litio 2S
Esplora il grafo
Dove si usa questo simulatore
I progetti, i percorsi di apprendimento e i tutorial che si basano su questo laboratorio.
Continua a costruire
Scarica le risorse
Usa questi riferimenti nella pagina mentre lavori al progetto. I pacchetti di progetto scaricabili verranno aggiunti solo dopo la pubblicazione del loro codice sorgente e della loro versione.
Domande comuni
Domande frequenti
Perché un robot bilanciatore ha bisogno di due anelli PID invece di uno?
Perché ciò che vuoi controllare e ciò che puoi controllare sono diversi. I motori modificano la velocità delle ruote, ma a tenere in vita il robot è l'angolo di inclinazione, e l'unico modo per modificarlo è muovere le ruote sotto il corpo. Quindi l'anello interno mantiene un angolo di inclinazione agendo sui motori, mentre l'anello esterno richiede un piccolo angolo per portare il robot dove vuoi. Un solo anello non può fare entrambe le cose: se agisci sui motori direttamente dall'errore di posizione, il robot accelera via dal proprio baricentro e cade immediatamente.
Perché il mio robot si allontana lentamente anche se sembra in piano?
Quasi sempre è la taratura del montaggio. Se l'IMU è uno o due gradi fuori dalla vera verticale, l'anello mantiene fedelmente quell'angolo errato, e mantenere un'inclinazione costante significa un'accelerazione costante in quella direzione finché non esaurisci lo spazio. Imposta il cursore di taratura in questo laboratorio e guarda accadere. La correzione sull'hardware reale è misurare l'offset con il robot tenuto genuinamente verticale e sottrarlo, poi lasciare che il termine integrale assorba la deriva residua.
Posso mantenere l'equilibrio senza un termine integrale?
Sì, e il simulatore ti mostrerà che funziona — finché non si verifica una misurazione falsata. P e D da soli possono mantenere il robot in piedi, perché D fornisce lo smorzamento che impedisce all'oscillazione di crescere. Ciò che non possono fare è eliminare uno scostamento costante: con qualsiasi errore di taratura il robot si stabilizza con una piccola inclinazione permanente e si allontana lentamente. L'integrale porta a zero quest'ultimo errore.
Perché il robot cade quando Porto il guadagno derivativo a zero?
Perché non rimane nulla che lo smorzi. Il guadagno proporzionale reagisce a quanto il robot è caduto, ma quando è intervenuta la correzione il corpo sta già oscillando oltre la verticale con una certa velocità. Senza un termine che risponda alla velocità con cui cambia l'angolo, ogni oscillazione supera quella precedente finché una non supera l'angolo di recupero. Imposta D a zero in questo laboratorio e puoi contare le oscillazioni.
Perché le ruote avanzano quando il robot si inclina in avanti?
È tutto il trucco, ed è il segno che quasi tutti sbagliano al primo tentativo. Per tenere in piedi una scopa sulla palma devi spostare la mano sotto l'estremità che cade, non allontanarla. Il robot fa lo stesso: inclinarsi in avanti significa avanzare per riportare le ruote sotto il baricentro. Inverti quel segno e il controllore spinge attivamente il robot a terra, il che sembra una caduta immediata e violenta.
In che modo è diverso dal simulatore del controllore PID?
Il laboratorio PID controlla un processo stabile: se lo lasci in pace resta lì, quindi l'anello migliora soltanto la rapidità e la pulizia con cui raggiunge un obiettivo. Questo processo è instabile — se lo lasci in pace cade ogni volta. Questo trasforma la regolazione da un'ottimizzazione in un requisito ed è il motivo per cui il bilanciamento richiede il secondo anello, esterno, che il laboratorio a anello singolo non deve mai introdurre.
Per approfondire
Fonti
Fonti autorevoli per andare oltre il modello didattico, volutamente limitato, di questo simulatore.