annuncio

Comprimi
Ancora nessun annuncio.

controllo pid e quadricottero

Comprimi
X
  • Filtro
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi

  • controllo pid e quadricottero

    Salve ragazzi,
    sto alle prese con la costruzione del mio primo quadricottero e in realtà l'obiettivo è alquanto ambizioso: vorrei creare da zero il software di controllo su un microcontrollore arm cortex M3. Ho già provveduto a realizzare una struttura abbastanza robusta con due bacchette di fibra di carbonio, 4 motori emax 2822, 4 esc turnigy 30A, 1 batteria lipo 3S 3300mAh, giroscopio ITG3200, accelerometro BMA180. Per semplicità ho provato il tutto senza l'algoritmo di controllo per testare motori e struttura, quindi senza sensori e con l'ausilio di un semplice PIC per la generazione dei segnali PPM per i motori e la cosa sembra andare abbastanza bene. Vi riporto il link del video:

    A&P Webmasters - Siti Web, Robotica, Elettronica, Realtà Virtuale, &...

    Il punto è questo: volendo ora passare all'implementazione di un algoritmo di controllo che fa uso di due regolatori pid, vorrei capire meglio come l'uscita del pid, e quindi la legge di controllo, vada ad incidere singolarmente sui motori. In particolare, se associo ogni pid a una coppia di motori (entrambi sullo stesso asse del quadricottero), l'idea sarebbe quella di variare l'angolo di riferimento da zero (assetto stabile) a uno diverso da zero in modo che il quad possa spostarsi in una determinata direzione. A questo punto il pid dovrà generare un valore che dipende dall'errore calcolato come differenza tra l'angolo attuale del quadricottero calcolato con l'ausilio dei sensori e il riferimento scelto da me, e tale valore dovrebbe andare ad incidere sul segnale ppm in ingresso ai due motori in modo differente in maniera tale che un motore deceleri e uno acceleri. E' giusto o mi sbaglio? Se è così vorrei cercare di capire in che modo ciò possa essere fatto, intendo proprio in termini matematici o almeno algoritmici. Penso che in maniera molto semplice potrei sommare con un segno diverso per i due motori il valore restituito dal pid ad una durata di base dell'impulso che invio all'esc e da cui dipende la quota del quadricottero.

    Inoltre, vorrei capire come potrei tener in conto nei due regolatori anche della rotazione del quadricottero lungo il proprio asse perpendicolare al terreno (yaw) senza il bisogno di dover implementare un ulteriore regolatore e se ciò possa inficiare e in che modo su quanto ho detto prima per il controllo degli angoli di pitch e roll.

    In ogni caso penso che sarebbe comodo avere un modello dinamico del multirotore in modo da poter provare tutto al simulatore. Avete idea di dove potrei prendere qualcosa di già fatto?

    Spero di essere stato abbastanza chiaro. Grazie a tutti anticipatamente...
    http://www.aepwebmasters.it

  • #2
    quad

    Complimenti ! un bel risultato.. adesso inizia la fase difficile.
    Non posso aiutarti perchè non sono un programmatore, ma comunque son più di tra anni che mi occupo della questione e conosco abbastanza tutto il problema.
    Far volare in modo stabile e controllabile, è la parte più difficile. Le altre funzioni (GPS, altimetro, waypoint ecc) sono fattibili.
    Attualmente ci sono un sacco di progetti in fase di sviluppo, anche italiani. QUalcuno sta creando progetti da zero come stai facendo tu, Altri stanno facendo il porting di software internazionale su altre schede. Anche gli orientali sono molto attivi e ottengono ottimi risultati.
    Il progetto più completo resta ancora MikroKopter, ma DJI Wookong (cinese) inizia ad essere un competotor pericoloso. Poi ci sono alcuni progetti commerciali, estremamente performanti e costosi.
    Beh.. in bocca al lupo !!
    Ultima modifica di gibon; 01 marzo 12, 07:12.

    Commenta


    • #3
      Originariamente inviato da mfciril Visualizza il messaggio
      Salve ragazzi,
      sto alle prese con la costruzione del mio primo quadricottero e in realtà l'obiettivo è alquanto ambizioso: vorrei creare da zero il software di controllo su un microcontrollore arm cortex M3. Ho già provveduto a realizzare una struttura abbastanza robusta con due bacchette di fibra di carbonio, 4 motori emax 2822, 4 esc turnigy 30A, 1 batteria lipo 3S 3300mAh, giroscopio ITG3200, accelerometro BMA180. Per semplicità ho provato il tutto senza l'algoritmo di controllo per testare motori e struttura, quindi senza sensori e con l'ausilio di un semplice PIC per la generazione dei segnali PPM per i motori e la cosa sembra andare abbastanza bene. Vi riporto il link del video:

      A&P Webmasters - Siti Web, Robotica, Elettronica, Realtà Virtuale, &...

      Il punto è questo: volendo ora passare all'implementazione di un algoritmo di controllo che fa uso di due regolatori pid, vorrei capire meglio come l'uscita del pid, e quindi la legge di controllo, vada ad incidere singolarmente sui motori. In particolare, se associo ogni pid a una coppia di motori (entrambi sullo stesso asse del quadricottero), l'idea sarebbe quella di variare l'angolo di riferimento da zero (assetto stabile) a uno diverso da zero in modo che il quad possa spostarsi in una determinata direzione. A questo punto il pid dovrà generare un valore che dipende dall'errore calcolato come differenza tra l'angolo attuale del quadricottero calcolato con l'ausilio dei sensori e il riferimento scelto da me, e tale valore dovrebbe andare ad incidere sul segnale ppm in ingresso ai due motori in modo differente in maniera tale che un motore deceleri e uno acceleri. E' giusto o mi sbaglio? Se è così vorrei cercare di capire in che modo ciò possa essere fatto, intendo proprio in termini matematici o almeno algoritmici. Penso che in maniera molto semplice potrei sommare con un segno diverso per i due motori il valore restituito dal pid ad una durata di base dell'impulso che invio all'esc e da cui dipende la quota del quadricottero.

      Inoltre, vorrei capire come potrei tener in conto nei due regolatori anche della rotazione del quadricottero lungo il proprio asse perpendicolare al terreno (yaw) senza il bisogno di dover implementare un ulteriore regolatore e se ciò possa inficiare e in che modo su quanto ho detto prima per il controllo degli angoli di pitch e roll.

      In ogni caso penso che sarebbe comodo avere un modello dinamico del multirotore in modo da poter provare tutto al simulatore. Avete idea di dove potrei prendere qualcosa di già fatto?

      Spero di essere stato abbastanza chiaro. Grazie a tutti anticipatamente...
      Ciao,
      Complimenti per la tua realizzazione, bella l'idea dello spago come Position Hold altro che GPS

      La cosa è più semplice di quello che sembra.
      I controllori PID sono molto utilizzati proprio perchè permettono di trascurate quasi del tutto la dinamica dei processi e permettono il calcolo dell' azione solamente in base all' errore (differenza) rispetto al valore desiderato.

      Nei Multirotori viene proprio utilizzato questo principio per evitare più complesse analisi dinamiche.

      In genere vengono utilizzati due PID in cascata:

      1) PID sull' errore di velocità angolare (a volte detto modo Acrobatico o gyro etc) basato di solito sulla semplice lettura dei giroscopi (leggono la velocità angolare sui tre assi) il confronto con lo zero permette di stablizzare l'assetto.
      Inoltre per semplificare la struttura di comando si è pensato di agire per differenza anche rispetto al valore del comando sommando la differenza rispetto al valore inviato dalla radio che rappresenta una velocità angolare desiderata, ottenendo così la possibilità di manovrare


      2) PID sull' errore angolare assoluto, (In genere detto Modo Stabile,Auto Livellamento,, ACC etc) si basa sul confronto tra angolo di assetto (misurato integrando i valori dei giroscopi a quelli degli accelerometri ad esempio con un filtro complementare) e poi calcolando l'errore.
      In questo caso il confronto con lo zero permette di livellare per Roll (Rollio) e Pitch (Picchiata) mentre il confronto con una direzione di riferimanto (ottenuta tramite una bussola) permette di mantenere l'orientamento (YAW, Imbardata).
      Anche in questo caso è possibile confrontare i valori del Comando, che in questo caso rappresenteranno, angoli per manovrare. Questo PID non è sempre presente e/o utilizzato

      In pratica questo è veramente tutto, il resto è fuffa.

      Per il modello dinamico in modo sempificato è il moto di un corpo soggetto al suo peso soggetto alle forze generate dalle eliche poste agli estremi dei bracci,
      per andare oltre va aggiunta la dinamica delle eliche per valutare i tempi di risposta e la capacità di rotare intorno allo YAW
      Ancora meglio si può fare considerando l'aerodinamica sia delle eliche che del frame, che permette di valutare meglio la dinamica del mezzo.

      Ad un primo livello i modelli meccanico e aerodinamico vengono quasi (!) del tutto trascurati (questo vale di sicuro per MWii, Aeroquad, Arducopter) , da questo la difficoltà ad implementare un buon altitude hold e una buona gestione del GPS

      A questo scopo qualcosa viene fatta nei prodotti commerciali più sofisticati ed almeno in teoria in prototipi fatti da varie Università (trovi facilmente le pubblicazioni su internet).

      Nel JJ-copter (*) provo a tener conto di queste cose ed i risultati in termini di controllo sono promettenti

      Ciao

      Josè

      (*) - Se vuoi dare un' trovi ampia descrizione e filmati nella sezione video del sito Aeroquad

      JJ-COPTER MK2 STABLE MODE (MEGA,Wii,GPS,Compass)
      Ultima modifica di ziojos; 01 marzo 12, 08:30.

      Commenta


      • #4
        Originariamente inviato da mfciril Visualizza il messaggio
        Salve ragazzi,
        sto alle prese con la costruzione del mio primo quadricottero e in realtà l'obiettivo è alquanto ambizioso: vorrei creare da zero il software di controllo su un microcontrollore arm cortex M3.
        Ciao io l'ho fatto cerca il thread ARMQUAD.
        In una prima fase ti consiglio di inziare solo con il controllo della velocità angolare quindi solo con il giroscopio.

        All'accensione:

        calibrazione giroscopi
        lettura segnale radio ( esempio stick avanti/dietro )
        lettura segnale giroscopio asse avanti/dietro - valore letto in fase di calibrazione

        ErroreAvDi = stick - giro
        ErrSommaAvDi= ErrSommaAvDi + ErroreAvDi

        Pavdi = erroreAvDi * kP
        Iavdi = ErrosreSommaAvdi*KI
        AvDiRis = Pavdi + Iavdi

        //MIXER ai motori in segnale PWM per quad a +
        motore 1 ( quellò avamti) = gas - AvDiRis + YawRis (rotazione oraria)
        motore 2 (quello dietro ) = gas + AvDiRis + YawRis (rotazione oraria )
        Motore3 Destra = gas + DesiRis - YawRis ( rotazone antioraria )
        Motore4 Sinistra = gas -DesiRis - YawRis (rot.antioraria )

        In pratica 1 pid per avanti dietro (AvDiRis) 1 pid per destra sinistra (DeSiRis) 1 pid per lo yaw (YawRis)

        I segni + o - dipendono dal modo in cui monti il giro e dal senso di rotazione delle eliche per lo yaw
        Poi ovviamente devi riscalare i valori che leggi dal giro per confrontarlo con il segnale radio dello stick e altri affinamenti.

        Il D del pid in questa modalità non calcolarlo perchè genera rumore, consiglio solo P e I
        ma puoi volare anche solo con P senza I
        P e I che in questa modalità non sono il P e I della modalita stabile con accelerometro
        Ciao
        Ultima modifica di danveal; 01 marzo 12, 12:02.
        Quadricottero News
        http://www.facebook.com/Quadricottero

        Commenta


        • #5
          danveal ti ringrazio infinitamente, mi hai dato un grande aiuto. Avrei un'altra domanda, forse un pò più stupida: per far girare il quadricottero mi basta lavorare sui pid per pitch e roll oppure c'è bisogno di variare anche il riferimento per l'angolo yaw?

          Inoltre, avrei pensato di utilizzare dei semplici sensori ad infrarosso per cercare di portare in fase di decollo i motori tutti alla stessa velocità dato che ho dei problemi legati al fatto che due motori a parità di segnale pwm tardano a partire rispetto agli altri. Secondo voi va bene o ci sono altri modi per risolvere?
          http://www.aepwebmasters.it

          Commenta


          • #6
            si devono usare tre giroscopi il 3200 ne ha tre, pitch, roll e yaw. per ognuno ci vuole un pid anche per lo yaw, basta replicare il codice sopra per gli altri 2 assi.
            non ha importanza se un motore lo vedi girare più piano o un lato pesa di più, penserà il pid a livellare tutto.
            Quadricottero News
            http://www.facebook.com/Quadricottero

            Commenta


            • #7
              Originariamente inviato da danveal Visualizza il messaggio
              si devono usare tre giroscopi il 3200 ne ha tre, pitch, roll e yaw. per ognuno ci vuole un pid anche per lo yaw, basta replicare il codice sopra per gli altri 2 assi.
              non ha importanza se un motore lo vedi girare più piano o un lato pesa di più, penserà il pid a livellare tutto.
              Si si lo so che ci penserà il pid a livellare tutto, però dato che lo scompenso è parecchio pensato che in fase di decollo il quadricottero, almeno all'inizio, tenderà a girare e non avrà una salita perfettamente verticale. Per inizio intendo nei primi istanti dove il quad si sta per sollevare da terra.
              http://www.aepwebmasters.it

              Commenta


              • #8
                Secondo voi è fattibile controllare almeno per le prime volte il quad con un modulo xbee senza radiocomando? Vorrei cercare di trovare una soluzione alternativa al radiocomando, tipo con il cell come si fa per l'ardrone...
                http://www.aepwebmasters.it

                Commenta


                • #9
                  Originariamente inviato da mfciril Visualizza il messaggio
                  Secondo voi è fattibile controllare almeno per le prime volte il quad con un modulo xbee senza radiocomando? Vorrei cercare di trovare una soluzione alternativa al radiocomando, tipo con il cell come si fa per l'ardrone...
                  Dal momento che il software, compresa la routine di ricezione, lo scrivi tu è fattibilissimo.
                  Non c'è nessun impedimento tecnico.

                  Ciao
                  Quadricottero News
                  http://www.facebook.com/Quadricottero

                  Commenta


                  • #10
                    Tempo Main loop PID minimo

                    Salve a tutti , vorrei sapere se c'è un minimo di frequenza (in cui il main loop che legge i
                    valori dei giroscopi e il PID retroaziona i motori) sotto alla quale non bisogna scendere poichè non sarebbe possibile rendere governabile il quadricottero.

                    Io utilizzo una scheda progettata da me con PIC18F2550 e alla frequenza di 50Hz calcolo un angolo assoulto integrando giroscopi(ITG3200) e accelerometri (ADXL345) utilizzando un filtro complementare, quindi implemento il PID in riferimento all'angolo assoluto.

                    Ho sviluppato un interfaccia in VB2010 per poter tener sotto controllo tutti i dati real-time che invio via USB, e cambiare in tempo reali le costanti del PID.

                    Attualmente sto facendo dei test solo con la costante Kp, e per un valore troppo basso di Kp il quadricottero non reaggisce minimamente agli errori del PID, appena incremento leggermente il quadricottero inizia ad oscillare.....insomma per qualsiasi valore di kp il sistema non reaggisce correttamente.


                    C'è qualcosa di fondo che sbaglio....la frequenza 50 Hz del ciclo completo è forse troppo lenta??? Il filtro complementare introduce un ritardo tale per cui non permette di correggere le oscillazioni del quadricottero??

                    Qualsiasi informazione è ben accetta.

                    Grazie a tutti!!

                    Commenta


                    • #11
                      Originariamente inviato da Alexzupo Visualizza il messaggio
                      Salve a tutti , vorrei sapere se c'è un minimo di frequenza (in cui il main loop che legge i
                      valori dei giroscopi e il PID retroaziona i motori) sotto alla quale non bisogna scendere poichè non sarebbe possibile rendere governabile il quadricottero.

                      Io utilizzo una scheda progettata da me con PIC18F2550 e alla frequenza di 50Hz calcolo un angolo assoulto integrando giroscopi(ITG3200) e accelerometri (ADXL345) utilizzando un filtro complementare, quindi implemento il PID in riferimento all'angolo assoluto.

                      Ho sviluppato un interfaccia in VB2010 per poter tener sotto controllo tutti i dati real-time che invio via USB, e cambiare in tempo reali le costanti del PID.

                      Attualmente sto facendo dei test solo con la costante Kp, e per un valore troppo basso di Kp il quadricottero non reaggisce minimamente agli errori del PID, appena incremento leggermente il quadricottero inizia ad oscillare.....insomma per qualsiasi valore di kp il sistema non reaggisce correttamente.


                      C'è qualcosa di fondo che sbaglio....la frequenza 50 Hz del ciclo completo è forse troppo lenta??? Il filtro complementare introduce un ritardo tale per cui non permette di correggere le oscillazioni del quadricottero??

                      Qualsiasi informazione è ben accetta.

                      Grazie a tutti!!
                      Il filtro complementare va bene il problema sta nei 50Hz, troppo lento, dovresti stare almeno sopra i 100Hz
                      Quadricottero News
                      http://www.facebook.com/Quadricottero

                      Commenta


                      • #12
                        In realtà, non so se sia fattibile, ma io sto cercando di sfruttare le interruzioni dell'ITG3200 per cercare di campionare i dati dal gyro ad almeno 1kHz. Per ora ho dei grossi problemi legati al drift oltre al fatto che gli angoli che ricavo non sono quelli che mi aspetto. Dove mi aspetto 90° ottengo circa 120° e dove mi aspetto 45° ottengo circa 45°. Come è possibile? Idee?
                        http://www.aepwebmasters.it

                        Commenta


                        • #13
                          Originariamente inviato da mfciril Visualizza il messaggio
                          In realtà, non so se sia fattibile, ma io sto cercando di sfruttare le interruzioni dell'ITG3200 per cercare di campionare i dati dal gyro ad almeno 1kHz. Per ora ho dei grossi problemi legati al drift oltre al fatto che gli angoli che ricavo non sono quelli che mi aspetto. Dove mi aspetto 90° ottengo circa 120° e dove mi aspetto 45° ottengo circa 45°. Come è possibile? Idee?
                          dove mi aspetto 45° ottengo circa 90°.
                          chiedo scusa per il doppio post, ma avevo sbagliato a scrivere l'angolo...
                          http://www.aepwebmasters.it

                          Commenta


                          • #14
                            Originariamente inviato da mfciril Visualizza il messaggio
                            dove mi aspetto 45° ottengo circa 90°.
                            chiedo scusa per il doppio post, ma avevo sbagliato a scrivere l'angolo...

                            Ciao ti rispondo qua, sei sicuro di leggere in modo corretto i dati raw dal giroscopio? ricordati che sono in complemento a 2.
                            Se li leggi in modo corretto secondo me hai problemi sul calcolo del dT, se usi gli interrupt sicuro che non inficiano sul timer del calcolo del tempo?
                            Invece di usare gli interrupt provare a leggerlo via polling.
                            Le variazioni causa deriva nel valore dell'angolo ottenuto rispetto a quello reale ci sono ma non cosi elevate come le hai tu, sono derive piccole che si accumulano ma dopo minuti
                            Quadricottero News
                            http://www.facebook.com/Quadricottero

                            Commenta


                            • #15
                              Originariamente inviato da danveal Visualizza il messaggio
                              Ciao ti rispondo qua, sei sicuro di leggere in modo corretto i dati raw dal giroscopio? ricordati che sono in complemento a 2.
                              Se li leggi in modo corretto secondo me hai problemi sul calcolo del dT, se usi gli interrupt sicuro che non inficiano sul timer del calcolo del tempo?
                              Invece di usare gli interrupt provare a leggerlo via polling.
                              Le variazioni causa deriva nel valore dell'angolo ottenuto rispetto a quello reale ci sono ma non cosi elevate come le hai tu, sono derive piccole che si accumulano ma dopo minuti
                              Non penso che le interruzioni vadano ad inficiare sul calcolo del dt poichè io moltiplico la velocità angolare per una costante che è 0.001s dato che, avendo settato il giroscopio per lavorare a 1kHz mi aspetto che le interruzioni cadano con un periodo fisso. Anzi, in questo modo sarei in grado di interrogare il giroscopio indipendentemente da ciò che faccio nel main loop: vorrei controllare i motori a 400Hz, ma leggere i dati dai sensori a 1kHz. Se uso il polling sono costretto limitarmi a fare il tutto a 400Hz. O sbaglio?
                              http://www.aepwebmasters.it

                              Commenta

                              Sto operando...
                              X