In seguito alla domanda che ho posto qui: instabilità Quadcopter con semplice decollo in modalità autonoma ... Vorrei porre alcune domande sull'implementazione di un PID di base per un quadrotore controllato da un modulo APM 2.6. (Sto usando un frame da 3DRobotics)
Ho ridotto l'intero sistema di controllo a soli due blocchi PID, uno per il controllo del rollio e un altro per il controllo del pitch (imbardata e tutto il resto ... ci penserei più tardi).
Sto testando questa configurazione su un impianto che consiste in una trave a rotazione libera, in cui ho legato due dei bracci del quadrotore. Gli altri due sono liberi di muoversi. Quindi, sto effettivamente testando un grado di libertà (roll o pitch) alla volta.
Controlla l'immagine qui sotto: qui A, B segna il raggio che ruota liberamente su cui è montato il setup.
Con un'accurata regolazione dei parametri P e D, sono riuscito a ottenere un volo prolungato di circa 30 secondi.
Ma per "sostenuto" intendo semplicemente un test in cui il drone non sta cadendo da una parte. Il volo stabile su roccia non è ancora visibile e anche più di 30 secondi di volo sembrano piuttosto difficili. Traballa dall'inizio. Quando raggiunge i 20 - 25 secondi, inizia a inclinarsi su un lato. Entro 30 secondi, si è inclinato su un lato di un margine inaccettabile. Presto lo trovo a testa in giù
Per quanto riguarda il codice PID stesso, sto calcolando l'errore proporzionale da un "filtro gratuito" di dati giroscopio + accelerometro. Il termine integrale è impostato su zero. Il termine P arriva a circa 0,39 e il termine D è a 0,0012. (Non sto usando la libreria PID di Arduino di proposito, voglio solo ottenere uno dei miei PID implementati qui.)
Guarda questo video, se vuoi vedere come funziona.
http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Sì, l'installazione è piuttosto antica! Sono d'accordo. :)]
Per favore fatemi sapere cosa potrei eventualmente fare per migliorare la stabilità in questa fase.
@Ian: Dei molti test che ho fatto con la mia configurazione, ho fatto grafici di tracciamento per alcuni dei test usando la lettura dal monitor seriale. Ecco una lettura di esempio di Roll vs "Motor1 & Motor2 - ingresso PWM" (i due motori che controllano il rollio):
Per quanto riguarda l'ingresso / uscita:
Input: valori di rollio e beccheggio (in gradi), ottenuti da una combinazione di accelerometro + giroscopio
Output: valori PWM per i motori, forniti utilizzando la funzione motor.write () della libreria Servo
Risoluzione
Ho risolto il problema Ecco come:
Il nocciolo della questione risiedeva nel modo in cui ho implementato il programma Arduino. Stavo usando la funzione write () per aggiornare i servo angoli, che sembra accettare solo passi interi nell'argomento (o in qualche modo risponde solo all'input intero, 100 e 100.2 producono lo stesso risultato). L'ho cambiato in writeMicroseconds () e questo ha reso l'elicottero notevolmente più stabile.
Stavo sommando RPM su un motore mantenendo l'altro a un valore costante. Ho cambiato questo per aumentare il numero di giri in un motore mentre diminuivo il motore opposto. Quel tipo mantiene invariata la spinta orizzontale totale, il che potrebbe aiutarmi quando sto cercando di mantenere l'altitudine verticale su questa cosa.
Stavo spingendo il regime massimo al limite massimo, motivo per cui il quadricottero continuava a perdere il controllo a tutto gas. Non c'era spazio per aumentare l'RPM quando percepiva un'inclinazione.
Ho osservato che uno dei motori era intrinsecamente più debole dell'altro, non so perché. Ho codificato un offset nell'ingresso PWM di quei motori.
Grazie per tutto il supporto.
Codice sorgente:
Se sei interessato, ecco il codice sorgente della mia implementazione PID bare-bone: Codice sorgente PID
Non esitate a testarlo nel vostro hardware. Qualsiasi contributo al progetto sarebbe il benvenuto.