Archivi categoria: quadcopterPi

progetto quadricottero controllato da raspberry PI

Beta2test. Prima delle vacanze

Durante l ultima settimana ho introdotto alcune migliorie sul codice che devo riportare qui prima di dimenticarle dopo le imminenti vacanze.

  • aggiunto possibilità di tuning manuale al volo per P,I e D.
  • in pid.py aggiunto una funzione per calcolare la media sul valore di D_correction calculation.Questo aiuta ad avere un valore più arrotondato.
  • Aggiornamento risultati sul display ogni 0.2 sec, invece che ad ogni ciclo (per ridurre il carico CPU ).
  • migliorato log
  • Calcolo della velocità angolare (roll_rate, pitch_rate and yaw_rate) in sensor_py. Questi valori sono ottenuti dalla derivata di roll,pitch e yaw già filtrate col complementary filter. Non come row roll_rate,pithc_rate e yaw rate del giroscopio.

il principale miglioramento e’ comunque stato l introduzione del PID per roll_rate (picth_rate and yaw_rate). Ho creato beta2.py dove ho messo due PIDs in serie. Questo è un tipico approccio per il controllo dei droni. Il primo PID restituisce la Roll_correction. (cioè di quanto voglio far variare l angolo in un passo).

Dividendo Roll_correction per cycletime, si ottiene l la velocità angolare che voglio ottenere in un passo.Questo e il target per il nuovo roll_rate PID. Mentre il feedback e’ la velocità angolare calcolata in sensor.py. Il risultato è un quadricottero molto più stabile, meno nervoso e più pronto.

sotto Ho riportato i primo test.

Beta2_pid_tuning

 

come si può notare e’ ancora presente un oscillazione, comunque compresa fra +/- 1 gradi. Occorre lavorare ora per fare in modo che il sistema raggiunga il target.(ora e’ sempre sotto). Probabilmente occorre incrementare il valore di P ed I.

Beta1test. Bachi e passi avanti

Ieri ho ottenuto questo risultato:

beta1_graph1

Grazie alle seguenti azioni:

1)Il test con la semisfera montata sotto il quadricottero non mi convinceva piu’. l’attrito, i limiti sulle rotazioni dovuti al pavimento sono vincoli non presenti nel volo.

Per cui ho deciso di passare alla soluzione piu usata e riconosciuta , appendendo il drone con due fili.

beta1_tied_up

2) A questo punto mi sono accorto che c’era qualcosa di anomalo nel comportamento dei motori. Eseguendo   beta1.py  il suono del motore era discontinuo e instabile anche se non avevo ancora attivato il controllo PID , ma mantenendo la velocità costante.

Questo non accadeva se eseguivo  motor_test.py.

Alle fine sono riuscito a riprodurre il problema e ho riscontrato un baco (o meglio un comportamento inatteso)  nella libreria RPIO. Ho riprodotto il problema con il loop sottostante :

while true:

mymotor.servo.set_servo(self.pin, PW)

sleep(0.01)

 

La spiegazione che mi son dato e’ che cad ogni chiamata di  set_servo() , viene resettato a zero il segnale e poi settato nuovamente al valore desiderato di PWM.

Pertanto ho usato una funzione a piu basso livello :

myMotor.PWM.add_channel_pulse(1,self.pin,0,PW)

A questo punto nel loop ho ottenuto un suono del motore (e quindi la sua rotazione) perfetto stabile e costante.

Questi 2 miglioramneti mi hanno permeso di fare un passo avanti. Il tuning puo’ procedere in modo piu’ veloce.

Sopra e’  mostrato il grafico del comportameto attuale.In blu in roll target , in rosso la posizione reale del roll. Devo migliorare il tuning per ridurre il tempo necessario a stabilizzarsi (ora 5/6 seconds)e per eliminare le oscillazioni ( +/- 3 gradi). Ma sono comunque soddisfatto della situazione attuale.

Beta1 test, preparazione

Questo post introduce alla prossima fase di test

Sto sviluppando il software per gestire i 4 motori e l’IMU.

Questa la modifica della struttura:

beta1_frame_bbeta1_frame

 

Ho aggiunto una mezza sfera attccata sotto, in modo da creare una condizione di disequilibrio.

Ho verificato che le eliche non possano toccare il pavimento in nessuna condizione.

L’obiettivo e’ riuscire a vedere il quadricottero rimanere in orizzontale aggiustando da solo l’orientamento (roll and pitch).

Let’s try!

Livello successivo

In questi giorni mi sono dedicato al passo successivo.

Il giorno del decollo si avvicina e mi e’ sembrato  il tempo per passare a definire la struttura nel suo complesso.

Qui mi limito a mostrare le fasi del montaggio del mio quadricottero.

frame1 frame2 frame3 frame4 frame5 frame6 frame7 frame8 frame9 frame10

Quindi mi manca di:

  • saldare i connettori per 2 esc.
  • montare sul supporto il connettore segnali e  l’IMU.
  • sviluppare il software per la gestine dei 4 motori

 

Alfa3test. Ecco il software

Dopo aver completato una serie di test , ecco il software alfa3 disponibile : alfa3

Sono ora presenti tutti i componenti necessari per  l’implementazione finale del quadricottero.

Questo l’elenco dei moduli sviluppati:

  • motor.py
  • sensor.py
  • MPU6050.py
  • pid.py
  • rc.py

Ogni modulo include un oggetto specifico.Dedichero’ un po di tempo per rivedere e aggiornare la pagina di python con un help dettagliato ai vari moduli.

Qui mi preme dare solo un riassunto delle loro principali caratteristiche.

rc e’ la novita’ di questo alfa3test.E’ un oggetto che lavora in un thread in parallelo.Resta in attesa di input da parte dell’utente. In questo caso specifico l’input atteso arriva dalla tastiera,ma con lo stesso  approccio si puo’ pensare (ci sto ancora lavorando,sara’ a breve oggetto di un post dedicato) di ricevere l’input da un webserver.

Motor e’ un oggetto che gestisce la comunicazione fra le uscite del raspberry pi verso l’ESC ed infine verso il motore. Utilizza la libreria RPIO per la gestione del PWM.

Sensor e’ un oggetto che lavora in un thread in parallelo. Ogni 6ms circa e’ in grado di acquisire le informazioni di posizione e velocita’ angolare del quadricottero ricevendo i dati dal giroscopio e dall’accelerometro.

MPU6050 e’ una classe di pura interfaccia fra il raspberry e l’hardware del sensore. Se si desidera utilizzare un sensore differente dal mio , e’ sufficiente sostiuire questa classe con una appropriata all’hw utilizzato.

Pid e’ un oggetto che racchiude l’algoritmo di calcolo del controllo proporzionale, integrale e derivativo. Al suo interno gestisce il calcolo del tempo ciclo per ogni chiamata.

Alfa3Test. Primi risultati e modulo rc.py

Ho effettuato i primi test sul modulo alfa3.py.

Sono emersi alcuni punti su cui devo lavorare.

In prima battuta la struttura di test non permette un movimento del quadricottero del tutto libero.Si puo infatti notare un comportamento anomalo quando la struttura e’ prossima ad una inclinazione nulla. L’attrito fra quadricottero e struttura rende il sistema piu stabile di quello che mi aspettavo.

Dovro’ rivedere il punto di contatto e cercare di renderlo meno soggetto ad attriti.

Potrei provare anche semlipcemente a aumentare il trottle , cioe fare in modo che i 2 motori sollevino di piu il quadricotteroriducendo cosi’ l’attrito.

Attualmente, comesi puo’ notare dalle foto del post precedente, la rotazione del quadricottero e’ limitata da un supporto in legno, a circa +/- 10 gradi.

alfa3_pic2

Ritengo necessario poter dare maggior liberta’ di movimento, per cui dovro’ modificare la struttura.

Veniamo ora al lato software. In alfa3 test ho introdotto un nuovo modulo chiamato rc.py (remote controller)  con lo scopo di rendere indipendente l’iserimento dei comandi dal loop di controllo del quadricottero. Per cui rc.py e’ attualmente un thread indipendente che resta in ascolto di input dall’utente. In questa fase l’input e’ da tastira, ma sto gia lavorando ad un webserver che permetta di ricevere i comandi da qualunque dispositivo dotato di browser (il mio cellulare) .

rc.py  mette a disposizioni i dati imputati da operatore quali  trottle ,roll, pitch e yaw desiderati.Il loop principale di controllo a questo punto, riceve i dati da rc e riceve i dati da sensor.py (che e’ un altro thread in parallelo) quali il roll, pitch e yaw attuali.Calcola l’errore fra dati attuali e desiderati e tramite il controllo PID effettua le necessarie correzioni alle velocita’ dei motori.

Non publico ancora alfa3.py perche’  ho riscontrato un problema su rc.py : i comandi inviati non vengono gestiti immediatamente. Voglio prima capire il motivo di questo ritardo.