Accelerazione quando il dispositivo è in tilt


13

Attualmente sto lavorando su un dispositivo che utilizza il sensore accelerometro 3D sempre attivo (usando la scala + -2 g) e il giroscopio 3D (usando la scala + -250 g).

Riesco a leggere ogni possibile vettore (X, Y, Z) e la loro accelerazione (g) e la frequenza angolare (dps) e anche l'angolo in cui si trova attualmente il dispositivo. Ma il mio problema è che quando il dispositivo è in inclinazione (0 g quando non c'è inclinazione) l'accelerazione è tra (verso il basso) 0 g -> - 1 g o tra (verso l'alto) 0 g-> 1 g a seconda dell'angolazione del dispositivo attualmente. Di seguito un'immagine che spera chiarisca l'idea.

Speriamo che questo aiuti

Il dispositivo si troverà in un'auto e dovrebbe misurare l'accelerazione quando l'auto sta rallentando (freno). Tuttavia, se il dispositivo è già in fase di inclinazione, l'accelerometro misurerà l'accelerazione causata dall'inclinazione, il che rende difficile stabilire se il dispositivo ha effettivamente qualche accelerazione o è solo l'inclinazione che causa l'accelerazione.

L'asse X e Y produce 0 g e l'asse Z è 1 g quando il dispositivo non ha inclinazione e si trova su una superficie piana. L'inclinazione fa sì che la lettura dell'asse X vada verso 1 g se l'inclinazione è verso l'alto e -1 g quando verso il basso. Il + -1g viene raggiunto quando il dispositivo è a 90 * gradi dalla posizione originale

Ho riflettuto su come eliminare quell'accelerazione causata dall'inclinazione e misurare solo la reale accelerazione del dispositivo, ma non riesco proprio a pensare a questo problema con i seguenti dati che posso produrre.

Fondamentalmente penso che se solo potessi misurare l'accelerazione dell'asse X (immagine) anche se il sensore è inclinato come in figura.

Spero che questo messaggio non sia troppo difficile da capire a causa delle mie abilità in inglese e del modo in cui sto cercando di spiegare il mio problema.


2
Perché non misurare semplicemente quando non si verifica un'accelerazione interessante e utilizzarla come punto di confronto?
PlasmaHH,

Penso che non funzionerebbe. Se il dispositivo è perfettamente fermo, l'asse X e Y sono 0g e l'asse Z 1g. L'inclinazione fa sì che la lettura dell'asse X sia compresa tra -1g e 1g a seconda dell'inclinazione, come ho affermato. La frenata fa diminuire il valore misurato sull'asse X (accelerazione negativa, quindi l'auto rallenta). Se ad esempio il dispositivo è già inclinato verso il basso, quindi è compreso tra 0g - (-1g) come posso dire che questa non è un'accelerazione causata dalla frenata?
jumbojohn,

Perché non calcolare l'accelerazione totale di tre assi anziché solo l'asse Y? Penso che sia qualcosa di basilare considerare tutti e tre gli assi giusti !? Qualcosa di simile a questa
charansai

LSM6DSM non ha un magnetometro. Da dove hai preso queste informazioni? Penso che tu in realtà stanno usando la scheda X-NUCLEO-IKS01A1 dalla ST, che ha sia la LSM6DSM giroscopio / accelerometro e un LIS3MDL magnetometro.
Gerber

@MrGerber Grazie per averlo notato. È stato un male per aver letto male la scheda tecnica del sensore.
jumbojohn,

Risposte:


18

Solo uno schizzo di una soluzione.

Prendi in considerazione tutti e 3 gli assi.

L'accelerazione dovuta alla gravità, indipendentemente dall'inclinazione, sarà sempre 1G, come somma vettoriale di X, Y, Z, indipendentemente dall'inclinazione. È possibile immaginare l'accelerazione a riposo o il movimento costante come un punto su una sfera con raggio 1G. (Se sei perfettamente orizzontale, quel punto sarà (0, 0, -1) cioè direttamente sotto di te).

L'accelerazione dovuta alla frenata distorcerà la sfera stessa; la somma vettoriale di X, Y, Z non sarà più 1G.

Così

UN=X2+Y2+Z2

ti dà l'accelerazione totale. Se è uguale a G sei a riposo; altrimenti stai accelerando, e è la somma vettoriale di G e la vera accelerazione.UN

Ora devi trovare la vera accelerazione che normalmente sarà un vettore nella direzione avanti (o indietro) che spiega la differenza tra e G. Devi sottrarre un punto sulla sfera G da , per trovare un (si spera unico soluzione) vettore con solo un componente X (avanti / indietro). Questa è la tua accelerazione. (Lascerò la trigonometria come un semplice enigma, spero che l'idea sia chiara).UNUN

A meno che tu non stia anche girando o sbandando, quindi hai bisogno di input dal volante e dall'ABS per essere sicuro; che diventa un problema di fusione dei dati. Questo approccio fornirà una stima dell'accelerazione. Per controllare la sanità mentale e perfezionare tale stima, combinala con altre fonti di dati (anche inaffidabili), come nella risposta di Phil Frost, utilizzando un filtro Kalman.


In realtà non ho mai lavorato prima con l'accelerometro / giroscopio, quindi il quadro generale non è del tutto chiaro su come funzionano queste cose e la matematica non è una delle mie abilità più forti, quindi apprezzerei i suggerimenti / chiarimenti, grazie.
jumbojohn,

Sebbene corretto, ho il forte sospetto che i margini di errore saranno importanti. Inoltre, non dimenticare che l'accelerazione verticale distorcerà la sfera (ad esempio dossi, buche), quindi potrebbe essere necessario risolverlo a seconda dell'applicazione.
Chris H,

Ma la gravità non è costante se guardi abbastanza forte . Mentre la strada più alta negli Stati Uniti riduce solo $ g $ di circa lo 0,1%, passare dai poli all'equatore fa una differenza dello 0,5%. Anche la geologia può fare la differenza in questo ordine di grandezza . Probabilmente non è un punto di svolta, ma non trascurare la calibrazione
Chris H,

Devi solo modificare il raggio della sfera G in base alla tua posizione o misurarlo prima di accendere il motore; non è un problema. Concordo sul fatto che probabilmente i dossi devono essere gestiti insieme a pattini e sterzo.
Brian Drummond,

La calibrazione prima di avviare il motore è il tipo di cosa a cui stavo pensando. La calibrazione sarebbe stata rapida se il costruttore non fosse l'utente finale.
Chris H,

9

Il tuo errore principale è non trattare l'accelerazione come un singolo vettore. Quando l'auto è a riposo, quel vettore sarà sempre 1 g verso l'alto. Non guardare solo il componente X dei dati grezzi dell'accelerometro. Fai la vera matematica vettoriale.

Ma il mio problema è che quando il dispositivo è in tilt (0g in assenza di tilt) l'accelerazione è tra (verso il basso) 0g -> - 1g o tra (verso l'alto) 0g-> 1g.

No. Questo è il punto. Quello che stai dicendo può essere vero per il componente X dell'uscita dell'accelerometro, ma non è vero per l'accelerazione quando l'auto è ferma.

L'accelerazione misurata ideale sarà sempre l'accelerazione effettiva dell'auto (rispetto alla terra), più l'accelerazione di 1 g dovuta alla gravità. Quest'ultimo è sempre in alto. Se conosci l'orientamento dell'auto, puoi sottrarre questo 1 g a causa della gravità per trovare l'accelerazione che stai effettivamente cercando.

Si noti che vi è un notevole errore in tali letture, in particolare da sensori MEMS economici. Mentre dovresti essere in grado di avere una buona idea di eventi a breve termine come un'accelerazione o una frenata brusca, questi dati non sono abbastanza buoni da fare una navigazione inerziale per al massimo più di qualche secondo.


L'accelerazione (misurata) dovuta alla gravità non sarà orientata verso l'alto? Come in, la lettura che otterrai dal dispositivo a riposo nella gravità terrestre sarà la stessa di quella che avresti fuori da qualsiasi campo gravitazionale ma accelerando nella direzione "su" (relativa al dispositivo)?
psmears,

@psmears: Sì, hai ragione. La forza è verso il basso, ma l'apparente accelerazione è verso l'alto. Fisso.
Olin Lathrop,

5

Come hanno affermato altre risposte, l'accelerometro fornisce un vettore tridimensionale che è la somma della gravità e di altre accelerazioni sull'auto dovute al motore, ai freni o ad altre forze che agiscono sull'auto. Il tuo obiettivo quindi è sottrarre l'accelerazione gravitazionale dall'uscita dell'accelerometro per trovare le altre forze rimanenti.

Per la massima precisione non si può presumere che la gravità sia sempre "verso il basso" rispetto all'accelerometro. Ad esempio, l'auto potrebbe essere su una collina. Tutti i tuoi calcoli devono essere eseguiti con la matematica vettoriale tridimensionale e devi avere una stima dell'orientamento dell'auto in modo da conoscere la direzione del vettore di gravità da sottrarre.

Un filtro Kalman è un approccio comune qui. L'idea è quella di prendere tutti i dati che hai che potrebbero alterare l'orientamento dell'auto, quindi eseguire una media ponderata delle misurazioni, combinare quella con ciò che sai sulla fisica che agisce sull'auto, per arrivare a una stima probabilistica del nuovo orientamento della macchina e in quale direzione "verso il basso".

Più dati hai, e più accuratamente puoi modellare la fisica dell'auto, più accurata può diventare questa stima.

Ad esempio, se si dispone di un giroscopio e si misura l'auto che si inclina, è possibile prevedere che il vettore di gravità ruoterà verso la parte posteriore dell'auto. Nel breve periodo, diciamo che quando l'auto ha appena iniziato a salire su una collina, questo può aiutare il vettore di gravità ad assumere rapidamente l'orientamento corretto.

Si potrebbe anche supporre che la macchina mediamente non stia frenando o accelerando. Pertanto, un'uscita filtrata dell'accelerometro passa-basso potrebbe alimentare la stima della direzione "verso il basso". Ciò fornisce una misurazione a lungo termine non soggetta alla deriva inerziale.

La combinazione di dati provenienti dall'accelerometro e dal giroscopio per stimare la direzione della gravità fornisce quindi una stima più accurata di entrambe le misurazioni.

Puoi incorporare ulteriormente ciò che sai della possibile dotazione operativa del veicolo. Ad esempio, l'auto non può guidare su o giù per pendenze troppo ripide, quindi quando l'accelerometro indica angoli così estremi potresti pesarlo di meno, supponendo che la maggior parte della sua produzione sia dovuta a freni o motore, non alla gravità.

Sai se il conducente preme il freno, questo sposterà il vettore di accelerazione e puoi sottrarlo dal componente "giù" stimato.

Oppure, se disponi di dati GPS e mappe, potresti includere una stima della pendenza dell'auto in base alla posizione. Se disponi di dati ad alta precisione, potresti sapere con precisione su quale collina si trova il veicolo. Se hai solo dati di bassa precisione, questo può ancora essere utile. Ad esempio, se l'auto è in Kansas, le colline sono improbabili. Se l'auto è a San Francisco, le colline sono più probabili e potresti dare meno peso all'accelerometro.

Se disponi di dati sul consumo di carburante e sulla velocità, sapendo che durante la salita si consuma più carburante, è possibile utilizzarlo per stimare che l'auto sia inclinata verso l'alto o verso il basso in base al consumo di carburante.

E così via. Più sai, migliore può essere la tua stima.


3

Avresti bisogno di un algoritmo di fusione e utilizzare sensori 3D-accelerometro, 3D-Gyro e 3D-Magnetic. Con questo algoritmo di fusione ottieni l'atteggiamento, la gravità terrestre aiuta come riferimento per rilevare l'orizzonte - angoli di beccheggio / imbardata / rollio. Gli altri due sensori mag / giroscopio aiutano a filtrare il movimento dinamico. Mentre l'auto girerà anche a sinistra / a destra, .. verrà aggiunta la forza centrifuga. Una volta che hai l'atteggiamento, puoi sottrarre il vettore gravitazionale e disassemblare l'accelerazione risultante in tutti e tre gli assi.


3

Come approccio molto semplice, è possibile utilizzare un filtro passa-alto per eliminare la parte costante dell'accelerazione (che corrisponde alla gravità) e mantenere la parte variabile della quale è dovuta alla dinamica dell'auto. Supponiamo che rawsia un vettore contenente le tue misurazioni X, Y e Z, ed accè l'accelerazione della macchina senza gravità. Poi

void correct_for_gravity(float *raw, float *acc)
{
   const float k = 0.9;
   static float gravity[3];

   gravity[0] = k * gravity[0] + (1 - k) * raw[0];
   gravity[1] = k * gravity[1] + (1 - k) * raw[1];
   gravity[2] = k * gravity[2] + (1 - k) * raw[2];

   acc[0] = raw[0] - gravity[0];
   acc[1] = raw[1] - gravity[1];
   acc[2] = raw[2] - gravity[2];
}

I singoli componenti di accsono ancora influenzati dall'inclinazione, ma la norma vettoriale non è:

norm_acc = sqrt(acc[0]*acc[0] + acc[1]*acc[1] + acc[2]*acc[2]);

Naturalmente, questo metodo non è molto preciso, soprattutto se l'inclinazione cambia ad un ritmo elevato. Questo è tutto per quanto riguarda la matematica ingenua. Se hai bisogno di una maggiore precisione, scopri come utilizzare un filtro Kalman.


1

La risposta sta nella definizione precisa di "rallentamento" .

Dalla tua domanda:

Il dispositivo si troverà in un'auto e dovrebbe misurare l'accelerazione quando l'auto sta rallentando (freno).

Tuttavia, il rallentamento non equivale alla frenata . Esistono due possibili definizioni:

  1. La velocità dell'auto rispetto al suolo sta diminuendo.
  2. I freni dell'auto vengono applicati.

Questa differenza è significativa in salita e in discesa. In discesa, la velocità dell'auto aumenterà se non vengono applicati i freni. E in salita, la velocità può rallentare anche quando non si frena.

Si scopre che il rilevamento 1. è significativamente più difficile di 2. Definiamo gli assi in relazione all'orientamento dell'auto: X: direzione anteriore-posteriore, Y: direzione sinistra-destra, Z: direzione su-giù. Tutti gli assi allineati all'auto.

soluzioni:

  1. Per la definizione 1. l'approccio migliore è supporre che la velocità dell'auto possa cambiare solo in direzione X. Quindi l'accelerazione misurata a = g + v dove g è l'accelerazione dovuta alle forze che contrastano la gravità e v è l'accelerazione dovuta alla variazione di velocità. Si può presumere che la lunghezza di g sia sempre uguale a 9,8 m / s² e che v sia sempre in direzione X. Quindi (g_x + v_x, g_y, g_z) = (a_x, a_y, a_z) , che dà v_x = a_x - sqrt ((9.8m / s²) ² - g_y² - g_z²) . Funzionerà solo finché | v | è inferiore a | g |o, in altre parole, l'accelerazione dovuta al motore o ai freni è inferiore a 1G. Dovrebbe essere un presupposto abbastanza sicuro a meno che la tua auto non abbia un razzo.

  2. Per la definizione 2., puoi semplicemente prendere direttamente la lettura dell'asse x. Se l'automobile non sta accelerando o frenando, l'unica forza di contrasto della gravità che agisce su di essa è la forza normale del manto stradale. Questa forza è sempre nella direzione z relativa all'auto, quindi non cambia la lettura dell'asse x. Freni e motore agiscono solo nella direzione x, e saranno direttamente visibili in questa lettura.


0

Sembra che tu stia utilizzando un dispositivo "eccessivo" per la tua applicazione. Dovresti usare un dispositivo che misura solo l'accelerazione x & y, in questo modo l'inclinazione non avrà alcun effetto misurabile. Sebbene l' accelerazione totale possa essere minore o maggiore, a causa dell'inclinazione, il dispositivo misurerà solo i componenti x & y dell'accelerazione sul piano su cui si trova il veicolo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.