Ball balancING project

Dispositivo di bilanciamento di un pallina su un piano tramite object recognition e controllore retroazionato PID

Laboratorio di Automatica

A. A. 2021 - 2022

 

Luca Ghislotti

Alessandro Mazzola

what's what

L'obiettivo del progetto è quello di bilanciare una pallina su un piano tramite un controllore retroazionato che sfrutta una telecamera per determinare la posizione della pallina sul piano

obiettivo del progetto

where it all began

what we achieved

(prior to PID tuning)

l'HARDWARE

Microcontrollore

Raspberry Pi 4 (2 Gb di RAM)

Telecamera

Raspberry Pi Camera

(1080p, 90 fps)

Servomotori

Diymore MG996R

 

IL DISPOSITIVO

telecamera collegata a Raspberry Pi per effettuare la rilevazione della posizione della pallina

servomotori per l'azionamento del piano, uno per l'asse X ed uno per l'asse Y

piano per il bilanciamento della pallina

Visione

L'algoritmo di visione permette di determinare la posizione della pallina e il relativo errore rispetto al centro del piano tramite la libreria OpenCV.

 

CONTROLLO

L'algoritmo di controllo utilizza la posizione acquisita dalla componente di vision per azionare i servomotori al fine di compensare il movimento della pallina sul piano tramite la libreria PigGPIO.

IL FUNZIONAMENTO

L'algoritmo di Computer Vision è in continua ricerca della pallina, ovvero di un set di pixel adiacenti di colore arancione.

Nel caso in cui venga effettuata la detection (e quindi vengano rispettati una serie di vincoli) l'algoritmo determina l'errore in pixel sui due assi rispetto alla posizione desiderata (in questo caso il centro del piano) ed interviene la componente di attuazione.

VISIONE

Tempo di elaborazione dell'algoritmo di visione ≃ 40 msec

asse x

asse y

errore y

asse y

errore x

TARGET

L'algoritmo di controllo prende in input  gli errori sull'asse x e sull'asse y ed implementa due controlli in anello chiuso in maniera disaccoppiata per i due assi.

CONTROLLO

CONTROLLO PID

PID_PX = errore_x * KP_x 
PID_DX = ((errore_x - err_prec_x) / elapsedTime) * KD_x
PID_IX = PID_IX + errore_x * KI_x * elapsedTime

azione_x = PID_PX + PID_DX + PID_IX 

L'algoritmo di controllo è analogo per l'asse Y

Tempo di elaborazione dell'algoritmo di controllo ≃ 20 msec

Abbiamo utilizzato MatLAB per determinare il periodo delle oscillazioni non smorzate con la sola azione proporzionale tali da mantenere la pallina in oscillazione permanente.

Abbiamo poi determinato i parametri Kp, Ki e Kd per entrambe gli assi come da formule.

Tuning del controllore PID

Abbiamo utilizzato il metodo di Ziegler–Nichols per effettuare un primo tuning.

Abbiamo innanzitutto rilevato:

- errori su ogni asse della pallina rispetto al centro del piano;

- istanti temporali di sampling.

Errore asse X

Errore asse Y

E' stato effettuato il tuning del PID separatamente per il controllo dell'asse X e dell'asse Y

  1. Posizionamento dei servomotori rispetto al piano
  2. Area del piano e materiale (quadrato di lato 35 cm)
  3. Altezza relativa del piano rispetto alla base
  4. Modalità di innesto dei giunti sul piano e sui servomotori
  5. Lunghezza dei bracci dei servomotori
  6. Utilizzo di elastici per smorzare oscillazioni indesiderate
  7. Microcontrollore e linguaggio: Raspberry Pi + Python

Scelte progettuali

Velocità operativa dei servomotori

  • ≃ 750 ms vs 340 ms da datasheet per ruotare di 120°
  • trial con diverse tensioni di alimentazione (5 V - 7.2 V e compliance current di 5 A)

Difficoltà riscontrate

IL POSIZIONAMENTO E L'AZIONAMENTO DEI SERVOMOTORI DIVIENE CRITICO

risolto incrementando il rapporto tra l'angolo dei servo e l'angolo del piano

 

Range operativo dei servomotori

  • per ridurre il tempo di risposta dei servo, si è cercato di massimizzare il guadagno meccanico
  • conseguente riduzione del range angolare dei servo (da 60° a <30°)

Difficoltà riscontrate

Oscillazioni del piano indotte da giochi meccanici amplificate dall'alto guadagno eliminate tramite l'utilizzo di elastici (incremento dello smorzamento)

Alimentazione dei servomotori

  • è stato necessario alimentare i servomotori tramite un power supply esterno a 5 V e 2.5 A  e non tramite Raspberry (low voltage warning)
  • è stato necessario porre le masse dei servomotori e del raspberry a ground comune tramite apposito jumper sulla breadboard

Difficoltà riscontrate

Asse Y

Asse X

PIN 18

PIN 17

COMMON GROUND

Codice

Il codice relativo all'algoritmo di object recognition e al controllore PID è disponibile su GitHub al link:

https://github.com/lucaghislo/laboratorio_automatica

Demo

Analisi tramite IMu a 9 assi

Ricerca svolta per il corso di sensori

Ball balancing

By Luca Ghislotti

Ball balancing

Presentazione del progetto sviluppato per il corso del laboratorio di automatica.

  • 217