annuncio

Comprimi
Ancora nessun annuncio.

[Build Log] Controllare APMcopter con Python Scripts

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

  • [Build Log] Controllare APMcopter con Python Scripts

    Una delle funzioni che mi hanno sempre incuriosito è la possibilità di gestire un volo automatico tramite script python inviati da Mission Planner.

    In questo thread vorrei documentare le prove di questo strumento che non sembra essere molto utilizzato ...magari altri amici potranno unirsi in questa avventura...che non ho idea in partenza dove ci porterà....però forse scopriremo perchè non è molto utilizzato...

    Il Python Scripting implementato in Mission Planner è descritto sommariamente qui:

    common-Using Python Scripts in Mission Planner | ArduCopter

    ...purtroppo non ci sono molti dettagli e quindi andrà un pò scoperto.... in più non ho mai utilizzato python ...quindi ogni suggerimento è bene accetto...
    TermicOne su youtube

  • #2
    "Hello World" script

    Come primo esperimento per vedere se tutto l'ambiente funziona ho provato un semplice script che, tramite Mission Planner collegato in telemetria

    1 - imposta i canali della radio al centro
    2 - arma la scheda
    3 - fa girare qualche secondo i motori (senza eliche...ma questo python non lo sa...)
    4 - disarma la scheda
    5 - rilascia i canali

    Il passo 5 non è documentato da nessuna parte. Senza questo passo i canali RC non vengono rilasciati e la radio RC non controlla più la scheda (cosa non particolarmente simpatica ) ...fortunatamente ho trovato questa indicazione sul forum DIYdrones

    Questo è il mio primo script "Hello World"

    ---------------------
    print 'Inizio Script'

    print 'set pitch, roll e yaw a 1500'
    Script.SendRC(1,1500,False)
    Script.SendRC(2,1500,False)
    Script.SendRC(4,1500,True)

    print 'set throttle al minimo'
    Script.SendRC(3,950,False)

    print 'set yaw al max per 8 secondi per armare la scheda'
    Script.SendRC(4,2000,True)
    Script.Sleep(8000)

    print 'rimetto lo yaw al centro'
    Script.SendRC(4,1500,True)

    print 'alzo il throttle a 1300 per sentire i motori allegri'
    Script.SendRC(3,1300,True)

    print 'faccio girare i motori per 5 secondi'
    Script.Sleep(5000)

    print 'metto il throttle al minimo'
    Script.SendRC(3,950,False)

    print 'set yaw al minimo per disarmare'
    Script.SendRC(4,950,True)
    Script.Sleep(8000)

    print 'rimetto lo yaw al centro'
    Script.SendRC(4,1500,True)

    print 'rilascio i canali'
    Script.SendRC(1,0,True)
    Script.SendRC(2,0,True)
    Script.SendRC(3,0,True)
    Script.SendRC(4,0,True)

    print 'Fine script'
    ------------------------
    TermicOne su youtube

    Commenta


    • #3
      A parte l'ultimo passo di rilascio dei canali che mi ha fatto un po' impazzire il resto sembra funzionare tutto. La scheda si arma, i motori girano allegri, tornano al minimo e la scheda si disarma. Al termine la radio ha ancora il completo controllo dei canali.

      Ho verificato che durante lo script la radio RC mantiene il controllo solo dei canali non settati dallo script: nel mio caso per esempio il canale 5 era libero e durante lo script ho potuto liberamente modificare il modo di volo (potrà essere utile per gestire eventuali emergenze?).

      Per ora le prove continueranno "al banco" fino a quando avrò una confidenza sufficiente e procedure di emergenza certe per provare questa cosa in volo su un modello "sacrificabile" ...in un'area deserta.



      TermicOne su youtube

      Commenta


      • #4
        Usiamo i controlli

        -----------------------
        print 'Start Script'

        print '1 - Arming'
        while not cs.armed:
        Script.Sleep(100)
        Script.SendRC(3,950,False) # throttle al minimo
        Script.SendRC(4,2000,True) # yaw tutto a destra per armare

        Script.SendRC(4,1500,True)

        Script.Sleep(1000) #aspetto un secondo

        print '2 - Alzo il Throttle per guadagnare quota di 1 m'

        altezza=cs.alt

        while cs.alt < altezza+1:
        Script.SendRC(3,1500,True) # throttle al 50%
        Script.Sleep(50)



        print '3 - Ruoto la prua di 45 gradi'
        yaw=cs.yaw

        while cs.yaw < yaw + 45:
        Script.SendRC(4,1700,True) # yaw a destra

        print '4 - rilascio i canali RC'
        Script.SendRC(3,0,False)
        Script.SendRC(4,0,True)


        print '5 - Imposto modo Land'

        Script.ChangeMode('Land')

        print 'Fine'
        --------------------------------
        TermicOne su youtube

        Commenta


        • #5
          Comandi CS e CHANGEMODE

          Altre prove di python scripting.... sempre con il quad in mano.

          La prova ha l'obiettivo di provare dei cicli di while usando i comandi CS (Current State) per verificare il cambio di stato del modello. L'esercizio è ancora assai banale ma ci consente di verificare un po' per volta la funzionalità dei vari comandi.

          I passi del nuovo script sono:

          1 - Armiamo la scheda usando il parametro "armed"
          2 - Alziamo un poco il throttle in modo da decollare e guadagnare un metro di altezza usando come riferimento il parametro "alt"
          3 - A un metro ruotiamo la pruna di 45 gradi usando come riferimento il parametro "yaw"
          4 - Rilasciamo i canali RC alla radio
          5 - Attiviamo il flight mode LAND in modo da atterrare

          Per ora il quad è senza eliche e quindi ho effettuato a mano il decollo, la rotazione e il landing seguendo ed assecondando la variazione di giri dei motori. Per ora sembra funzionare tutto perfettamente e lo scripting sembra essere molto semplice.

          Siamo quasi pronti alla prova in volo. Occorre però prima trovare il modo di gestire una eventuale emergenza nel caso lo script si dovesse fermare per qualche ragione o nel caso si dovesse interrompere la comunicazione MAVLINK con il modello quando alcuni canali RC sono ancora gestiti dallo script e non rilasciati alla radio RC.

          Mi rendo conto che questo esercizio possa per ora interessare poco ma preferisco documentare tutto...chissà che poi alla fine non venga fuori qualcosa di utile...o quanto meno qualcosa di interessante dal punto di vista della sperimentazione ...o magari da segnalare a qualche ragazzo che deve fare una tesina di esame e che vuole scrivere un po' di righe di codice senza perdersi negli algoritmi di base della gestione del multicottero.



          codice:
          print 'Start Script'
          
          print '1 - Arming'
          while not cs.armed:
                  Script.Sleep(100)
                  Script.SendRC(3,950,False) # throttle al minimo
                  Script.SendRC(4,2000,True) # yaw tutto a destra per armare	
          
          Script.SendRC(4,1500,True) #yaw al centro
          Script.Sleep(1000) #aspetto un secondo
          
          print '2 - Alzo il Throttle per guadagnare quota di 1 m'
          altezza=cs.alt #memorizzo l'altezza di partenza
          while cs.alt < altezza+1:
          	Script.SendRC(3,1500,True) # metto il throttle al 50%	
          	Script.Sleep(50)
          
          print '3 - Ruoto la prua di 45 gradi'
          yaw=cs.yaw #memorizzo la prua di partenza
          while cs.yaw < yaw + 45:
          	Script.SendRC(4,1700,True) # yaw a destra
          
          print '4 - rilascio i canali RC'
          Script.SendRC(3,0,False) 
          Script.SendRC(4,0,True)
          	
          print '5 - Imposto modo Land'
          Script.ChangeMode('Land')
          
          print 'Fine'
          TermicOne su youtube

          Commenta


          • #6
            Ciao Termic,
            come sempre sei avanti nei tuoi test , quello che posso dirti e' che attualmente l'ovverride dei canali lo puoi escludere solo se attivi il failsafe sulla ground station dopo 5 secondi dovresti poter riprendere il completo controllo del drone se interrompi i flussi mavlink ,anche se a volte 5 secondi potrebbero essere anche troppi
            un saluto
            Roberto
            Redfox74
            Virtual Robotix ( Arducopter DEVTEAM )
            http://www.virtualrobotix.com
            Canale di supporto FB
            https://www.facebook.com/groups/1606596929592397/

            Commenta


            • #7
              Grazie Roberto! ...devo però trovare qualche altra soluzione perché 5 secondi sono veramente tanti... peraltro non sono ancora riuscito a provare per bene questo failsafe...che comunque sarebbe un primo passo...
              TermicOne su youtube

              Commenta

              Sto operando...
              X