L'antigravity ci aiuta a contrastare movimenti indesiderati del drone

Come fa e quando interviene? Scopriamolo assieme

Betaflight antigravity

A cosa serve l’antigravity

Un difetto tipico dei nostri droni fpv è avere movimenti sui vari assi quando si effettuano rapide variazioni di acceleratore. Il problema più comune è un’inclinazione indesiderata sull’asse del pitch.

Analizziamo bene da cosa è provocato questo difetto e come l’antigravity lo corregge entrando in azione.

Le cause del problema

Questo problema può essere generato dal peso sul drone non bilanciato, oppure da motori con diversa potenza.
Quando si effettua una rapida accelerazione infatti il flight controller chiederà ai motori di accelerare, ma se un motore ha meno potenza degli altri, il drone tenderà a ruotare in direzione di quel motore.
Lo stesso accadrà se una parte del drone è più pesante, ovviamente accelererà più lentamente, facendo inclinare il drone.
In seguito il PID si accorgerà di questa inclinazione e andrà a compensare togliendo potenza ai motori più potenti e quindi “più in alto”, riportando il drone in orizzontale.

Però durante i colpi di gas puoi osservare piccoli movimenti, in genere una leggera rotazione sull’asse del pitch e a volte anche dello yaw, annullata subito dopo dal PID.

Le cause sono molteplici, vediamo le più comuni assieme.

1- Baricentro decentrato rispetto alla struttura del drone

In genere non ce ne preoccupiamo troppo, ma è importante che il drone sia ben bilanciato e abbia il baricentro in corrispondenza dell’incrocio delle braccia.
Spesso infatti aggiungiamo la action cam, senza però spostare più indietro la batteria!
Questo sbilancia molto il drone!
Anche se come sappiamo il PID di oggi è molto potente e riesce a far volare abbastanza bene il drone, non è una buona cosa… Si avrà un drone sbilanciato e con meno potenza massima.

2- Un motore difettoso, o danneggiato, che produce meno potenza degli altri

I motori non hanno tutti esattamente la stessa potenza, quindi ce ne saranno sempre alcuni leggermente più potenti di altri (per via di tolleranze costruttive), ma questa variazione dovrebbe rimanere al di sotto di un 5%.
Se un motore è difettoso o danneggiato, la differenza è molto superiore e si vedrà questo fastidioso effetto.

NOTA: è buona norma periodicamente registrare i dati di blackbox e fare un volo in cui si sale verticalmente a tutto gas (assicurando che il baricentro del drone sia ben centrato).
Se tutti i motori sono in buone condizioni, nel blackbox dovreste vedere tutti i motori vicini al 100%.

Se invece vedete un motore al 100% e gli altri sotto al 90%, significa che il motore al 100% è danneggiato e sta erogando molta meno potenza di tutti gli altri (il PID toglie potenza agli altri per compensare).
Il suggerimento è di sostituire quel motore: avrete un drone più potente e che vola meglio (con meno squilibri).

3- Esc economici… diverse prestazioni

Un difetto degli esc economici è che in genere vengono assemblati con mosfet di basso costo, spesso recuperati (smontati da altri componenti). Questo comporta che i mosfet non saranno tutti identici, ma proverranno da diversi lotti produttivi, e quindi saranno leggermente diversi gli uni dagli altri.
Risulta allora chiaro che alcuni esc possono essere leggermente più potenti di altri, anche se acquistati insieme!

4- Turbolenze delle eliche posteriori

Le eliche girando producono turbolenze.
In genere noi ci muoviamo in avanti, quindi le eliche posteriori entreranno dell’aria piena di turbolenze prodotte dalle eliche anteriori.
Per questo motivo in genere le eliche posteriori hanno meno spinta e i motori posteriori si trovano a lavorare di più (in genere sono un po’ più caldi infatti).

Ma non avevamo detto che il PID stabilizza il drone??

Sì, il PID stabilizza il drone, ma ci sono dei problemi:

  1. il PID (inconsapevolmente) assume che tutti i motori abbiano la stessa potenza, non prevede che alla prossima accelerazione un motore avrà meno potenza
  2. il PID comunque si occupa di annullare l’errore tra posizione del drone e posizione desiderata, quindi in teoria  dovrebbe risolvere il problema… Ma in realtà la parte che si occupa di annullare l’errore in questo caso è l’integrale I, come visto nell’articolo sui PID (che puoi leggere qui).

Per ridurre l’errore più velocemente (e quindi ridurre questo effetto di accoppiamento tra acceleratore e altri assi), si dovrebbe alzare l’integrale. Come descritto nell’articolo sui PID, però alzare la I ha 2 controindicazioni:

  1. rende il drone più robotico e quindi meno dolce da guidare (quindi in genere non è apprezzata una I molto alta)
  2. può innescare oscillazioni

Quindi fino a qualche mese fa, durante la regolazione dei PID si compensava questa l’inclinazione sul pitch alzando il valore dell’integrale più possibile.

Per mantenere però un buon comportamento del drone, non si poteva alzare tanto il valore dell’integrale: era quindi possibile ottenere un buon risultato solo se il drone era molto bilanciato, se gli esc erano di buona qualità, e se i motori erano in buone condizioni (tutti con la stessa potenza).

Le nuove versioni di Betaflight mettono però a disposizione un nuovo strumento che ci permette di migliorare questo problema:

L’antigravity!

Il funzionamento è molto semplice. Come detto vogliamo tenere la I bassa durante il volo normale, ma vogliamo una I alta quando variamo rapidamente l’acceleratore.
La soluzione è alzare il valore dell’integrale solo quando si cambia rapidamente il valore dell’acceleratore!

Funzionamento dell’antigravity

Il primo problema è capire quanto velocemente varia l’acceleratore.

Semplicemente ad ogni istante viene campionato il valore dell’acceleratore per poi compararlo con il valore che assumeva all’istante precedente. Se la differenza è superiore ad una certa soglia (che è possibile scegliere nei parametri di Betaflight), allora dovrà intervenire l’antigravity alzando l’integrale.

Il valore dell’integrale (I), viene moltiplicato per un guadagno (gain) negli istanti in cui l’acceleratore varia velocemente, anche questo parametro viene impostato da configuratore.

n.d.r. Se sei interessato ad approfondire butta un occhio al codice riportato qui sotto.

Valore del guadagno (gain) dell’Antigravity consigliato

Ovviamente se il vostro drone non soffre di questo problema, potete lasciare l’antigravity disattivato.
Se invece il vostro drone soffre del problema descritto, vi consiglio di attivare l’antigravity, impostando inizialmente il guadagno = 3
Provate e il drone facendo rapide accelerazioni. Se il risultato ancora non vi soddisfa proseguite incrementando il gain.

Valore di soglia (threshold) dell’Antigravity consigliato

Il valore di treshold indica la soglia per discrimare quando attivare l’antigravity.
Quindi definisce quanto l’acceleratore si debba muovere velocemente per attivarlo.

Il valore di default è 350 che significa che l’antigravity si attiva quando l’acceleratore è variato di almeno il 35% nei passati 100ms (0.1 secondi).

Non c’è modo di capire quando l’antigravity sia attivo o meno, quindi è molto difficile tarare questo valore.
È quindi consigliato lasciare il valore di default.

Controindicazioni dell’Antigravity

E’ sconsigliato alzare il valore del guadagno a valori molto alti. Infatti l’antigravity si attiva “di colpo” nelle rapide variazioni di acceleratore, rendendo molto più “rigido e robotico” il drone.

Quindi se durante alcune acrobazie variate rapidamente l’acceleratore si attiverà e avrete il drone che di colpo diventa molto più “rigido”.

Video di Joshua Bardwell

Se ancora non vi è ben chiaro cosa faccia, potete vederlo in azione nel video di Joshua Bardwell qui sotto.

 

Codice (per nerd, curiosi e appassionati) by MbertuFPV

Qui sotto potete vedere la parte di codice che gestisce l’antigravity, estratto direttamente dal repository git di Betaflight.

Come detto prima è possibile vedere che nella prima parte viene determinato se l’acceleratore sta variando rapidamente, mentre nella seconda parte viene aumentato l’Integrale.

I commenti nel codice sono stati aggiunti da me e spiegano in maniera molto semplice cosa succede in quella porzione di C.

/** 
 * Funzione che valuta se incermentare o meno il termine I 
 * in base alla velocità con cui è cambiato il valore del throttle
 */
static void checkForThrottleErrorResetState(uint16_t rxRefreshRate)
{
    /**
     * Nella prima parte viene campionato il segnale e calcolata la variazione dello stesso.
     */
    static int index;
    static int16_t rcCommandThrottlePrevious[THROTTLE_BUFFER_MAX];

    const int rxRefreshRateMs = rxRefreshRate / 1000;
    const int indexMax = constrain(THROTTLE_DELTA_MS / rxRefreshRateMs, 1, THROTTLE_BUFFER_MAX);
    const int16_t throttleVelocityThreshold = (featureIsEnabled(FEATURE_3D)) ? currentPidProfile->itermThrottleThreshold / 2 : currentPidProfile->itermThrottleThreshold;

    rcCommandThrottlePrevious[index++] = rcCommand[THROTTLE];
    if (index >= indexMax) {
        index = 0;
    }

    const int16_t rcCommandSpeed = rcCommand[THROTTLE] - rcCommandThrottlePrevious[index]; 

    /**
     * Qui è dove viene attivato o meno il boost per il termine I.
     * Possiamo vedere come la velocità di variazione del throttle viene passato alla funziona ABS
     * ovvero ne viene calcolato il valore ASSOLUTO, quindi non importa che la variazione sia in positivo o negativo,
     * quello che conta è la velocità. 
     * In sostanza AntiGravity viene attivato sia quando date gas sia quando lo togliete!!!
     */
    if (currentPidProfile->antiGravityMode == ANTI_GRAVITY_STEP) {
        if (ABS(rcCommandSpeed) > throttleVelocityThreshold) {
            pidSetItermAccelerator(CONVERT_PARAMETER_TO_FLOAT(currentPidProfile->itermAcceleratorGain));
        } else {
            pidSetItermAccelerator(1.0f);
        }
    }
}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *