Aceleração quando o dispositivo está inclinado

13

Atualmente, estou trabalhando em um dispositivo que usa sempre um acelerômetro 3D (usando escala + -2g) e giroscópio 3D (usando escala + -250g) -sensor.

Eu posso ler todos os vetores possíveis (X, Y, Z) e sua aceleração (g) e taxa angular (dps) e também o ângulo em que o dispositivo está atualmente. Mas meu problema é que, quando o dispositivo está inclinado (0g quando não está inclinado), a aceleração está entre (para baixo) 0g -> - 1g ou entre (para cima) 0g -> 1g, dependendo do ângulo do dispositivo atualmente. Abaixo está uma foto que, espero, apaga a idéia.

Espero que isso ajude

O dispositivo estará localizado em um carro e deve medir a aceleração quando o carro estiver diminuindo a velocidade (freio). No entanto, se o dispositivo já estiver inclinado, o acelerômetro medirá algumas acelerações causadas pela inclinação, o que torna difícil dizer se o dispositivo tem realmente alguma aceleração ou se é apenas a inclinação que está causando a aceleração.

Os eixos X e Y produzem 0g e o eixo Z é 1g quando o dispositivo não tem inclinação e está em uma superfície plana. A inclinação faz com que a leitura do eixo X vá em direção a 1g se a inclinação estiver em direção a cima e a -1g em posição descendente. O + -1g é atingido quando o dispositivo está a 90 * graus da posição original

Eu estive pensando como eliminar essa aceleração que causa a inclinação e medir apenas a aceleração real do dispositivo, mas simplesmente não consigo sair desse problema com os seguintes dados que eu posso produzir.

Basicamente, acho que se eu pudesse medir a aceleração do eixo X (imagem) mesmo se o sensor estiver inclinado como na imagem.

Espero que esta mensagem não seja muito difícil de entender devido às minhas habilidades em inglês e à maneira como estou tentando explicar meu problema.

jumbojohn
fonte
2
Por que você não mede apenas quando não está ocorrendo uma aceleração interessante e a usa como ponto de comparação?
PlasmaHH
Eu acho que não funcionaria. Se o dispositivo estiver perfeitamente imóvel, os eixos X e Y são 0g e o eixo Z 1g. A inclinação faz com que a leitura do eixo X seja de -1g a 1g, dependendo da inclinação, como afirmei. A frenagem faz com que o valor medido no eixo X diminua (aceleração negativa para que o carro esteja diminuindo a velocidade). Se o dispositivo já estiver, por exemplo, inclinado para baixo, é algo entre 0g - (-1g), como posso saber que isso não é uma aceleração causada pela frenagem?
jumbojohn
Por que você não calcula a aceleração total de três eixos em vez de apenas o eixo Y? Eu acho que é algo básico considerar todos os três eixos corretamente !? Algo como este
charansai
O LSM6DSM não possui um magnetômetro. Onde você conseguiu essa informação? Eu acho que você realmente está usando a placa X-NUCLEO-IKS01A1 da ST, que possui o giroscópio LSM6DSM / acelerômetro e um magnetômetro LIS3MDL.
precisa saber é o seguinte
@ MrGerber Obrigado por perceber isso. Foi ruim por interpretar mal a folha de dados do sensor.
jumbojohn

Respostas:

18

Apenas um esboço de uma solução.

Leve em consideração todos os 3 eixos.

A aceleração devido à gravidade, independentemente da inclinação, sempre será 1G, como uma soma vetorial de X, Y, Z, independentemente da inclinação. Você pode visualizar a aceleração em repouso ou em movimento constante como um ponto em uma esfera com raio 1G. (Se você estiver perfeitamente horizontal, esse ponto será (0, 0, -1), ou seja, diretamente abaixo de você).

A aceleração devido à frenagem distorcerá a própria esfera; a soma vetorial de X, Y, Z não será mais 1G.

então

UMA=X2+Y2+Z2

UMA

UMAUMA

A menos que você também esteja girando ou derrapando, precisará de informações do volante e do ABS para ter certeza; isso se torna um problema de fusão de dados. Essa abordagem fornecerá uma estimativa de aceleração. Para verificar a sanidade e refinar essa estimativa, combine-a com outras fontes de dados (também não confiáveis), como na resposta de Phil Frost, usando um filtro Kalman.

Brian Drummond
fonte
Na verdade, eu nunca trabalhei com acelerômetro / giroscópio antes, então o quadro geral não está totalmente claro como essas coisas funcionam e a matemática não é uma das minhas habilidades mais fortes, então eu apreciaria as dicas / esclarecimentos, obrigado.
jumbojohn
Enquanto correto, tenho uma forte suspeita de que as margens de erro serão importantes. Além disso, não se esqueça de que a aceleração vertical distorcerá a esfera (por exemplo, lombadas, buracos); portanto, você pode precisar resolver isso dependendo da aplicação.
21818 Chris H H
Mas a gravidade não é constante se você se esforçar o suficiente . Enquanto a estrada mais alta dos EUA reduz apenas $ g $ em cerca de 0,1%, ir dos polos ao equador faz uma diferença de 0,5%. A geologia também pode fazer a diferença nessa ordem de magnitude . Provavelmente não é uma mudança de jogo, mas não negligencie a calibração
Chris H
Você só precisa modificar o raio da esfera G de acordo com a sua localização ou medi-lo antes de ligar o motor; isso não é problema. Concordo que os solavancos provavelmente precisam ser manuseados juntamente com patins e direção.
Brian Drummond
Calibrar antes de dar partida no motor é o tipo de coisa que eu estava pensando. A calibração seria rápida, se o construtor não for o usuário final.
19718 Chris H
9

Seu principal erro é não tratar a aceleração como um único vetor. Quando o carro estiver parado, esse vetor sempre será 1 g para cima. Não olhe apenas para o componente X dos dados brutos do acelerômetro. Faça a matemática de vetor real.

Mas meu problema é que, quando o dispositivo está inclinado (0g quando não está inclinado), a aceleração está entre (para baixo) 0g -> - 1g ou entre (para cima) 0g -> 1g.

Não. Esse é o ponto. O que você está dizendo pode ser verdade para o componente X da saída do acelerômetro, mas não é verdade para a aceleração quando o carro está parado.

A aceleração ideal medida será sempre a aceleração real do carro (em relação à terra), mais a aceleração de 1 g devido à gravidade. O último está sempre na direção ascendente. Se você conhece a orientação do carro, pode subtrair esse 1 g devido à gravidade para encontrar a aceleração que está procurando.

Observe que há um erro considerável nessas leituras, especialmente em sensores MEMS baratos. Embora você possa ter uma boa idéia sobre eventos de curto prazo, como aceleração forte ou frenagem forte, esses dados não são bons o suficiente para fazer navegação inercial por mais de alguns segundos.

Olin Lathrop
fonte
A aceleração (medida) devido à gravidade não estará na direção "para cima"? Assim, a leitura que você obterá do dispositivo em repouso na gravidade da Terra será a mesma que você sairia de qualquer campo gravitacional, mas acelerando na direção "para cima" (relativa ao dispositivo)?
Psmears
@ psmears: Sim, você está certo. A força está para baixo, mas a aceleração aparente é para cima. Fixo.
Olin Lathrop
5

Como outras respostas afirmaram, o acelerômetro fornece um vetor tridimensional que é a soma da gravidade e outras acelerações no carro devido ao motor, freios ou outras forças que atuam no carro. Seu objetivo é subtrair a aceleração gravitacional da saída do acelerômetro para encontrar as outras forças restantes.

Para uma melhor precisão, você não pode supor que a gravidade esteja sempre "baixa" em relação ao acelerômetro. Por exemplo, o carro pode estar em uma colina. Todos os seus cálculos devem ser feitos com matemática vetorial tridimensional e você deve ter alguma estimativa da orientação do carro para saber a direção do vetor gravitacional a subtrair.

Um filtro Kalman é uma abordagem comum aqui. A idéia é pegar todos os dados que você tiver, que possam alterar a orientação do carro, realizar uma média ponderada das medições, combinar isso com o que você sabe sobre a física que atua no carro, para chegar a uma estimativa probabilística do nova orientação do carro e para que lado está "para baixo".

Quanto mais dados você tiver, e com mais precisão for possível modelar a física do carro, mais precisa essa estimativa poderá se tornar.

Por exemplo, se você tem um giroscópio e mede o carro levantando, pode prever que o vetor de gravidade irá girar em direção à parte traseira do carro. No curto prazo, digamos, quando o carro começar a subir uma colina, isso pode ajudar o vetor de gravidade a assumir rapidamente a orientação correta.

Você também pode assumir que o carro, em média, não estará travando ou acelerando. Assim, uma saída filtrada passa-baixa do acelerômetro pode alimentar a estimativa de qual direção "para baixo" é. Isso fornece uma medição a longo prazo, não sujeita a deriva inercial.

A combinação de dados do acelerômetro e do giroscópio para estimar a direção da gravidade fornece uma estimativa mais precisa do que qualquer uma das medições.

Você também pode incorporar o que sabe sobre o possível envelope operacional do veículo. Por exemplo, o carro não pode subir ou descer ladeiras muito íngremes; portanto, quando o acelerômetro indica ângulos extremos, você pode pesá-lo menos, assumindo que a maior parte de sua produção seja devida a freios ou motor, e não à gravidade.

Você sabe que se o motorista pisar no freio, isso moverá o vetor de aceleração e você pode subtraí-lo do componente estimado "inativo".

Ou, se você tiver dados de GPS e mapa, poderá incorporar uma estimativa da inclinação do carro com base na localização. Se você tiver dados de alta precisão, poderá saber exatamente em que colina o veículo está. Se você tiver apenas dados de baixa precisão, isso ainda poderá ser útil. Por exemplo, se o carro estiver no Kansas, as colinas são improváveis. Se o carro estiver em São Francisco, as colinas são mais prováveis ​​e você poderá dar menos peso ao acelerômetro.

Se você tiver dados sobre o consumo e a velocidade do combustível, sabendo que mais combustível é consumido ao subir, você pode usar isso para estimar que o carro é levantado ou diminuído com base na eficiência do combustível.

E assim por diante. Quanto mais você souber, melhor será sua estimativa.

Phil Frost
fonte
3

Você precisaria de um algoritmo de fusão e usaria sensores de acelerômetro 3D, giroscópio 3D e magnético 3D. Com este algoritmo de fusão, você obtém a atitude, a gravidade da Terra ajuda como referência para detectar os ângulos do horizonte - inclinação / guinada / rotação. Os outros dois sensores mag / gyro ajudam a filtrar o movimento dinâmico. Como seu carro também vira à esquerda / direita, .. a força centrífuga será adicionada. Depois de ter a atitude, você pode subtrair o vetor gravitacional e desmontar a aceleração resultante nos três eixos.

Marko Buršič
fonte
3

Como uma abordagem muito básica, você pode usar um filtro passa-alto para eliminar a parte constante da aceleração (que corresponde à gravidade) e manter a parte variável da qual é devida à dinâmica do carro. Suponha que rawé um vetor que contém suas medidas X, Y e Z e accé a aceleração do carro sem gravidade. Então

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];
}

Os componentes individuais de accainda são afetados pela inclinação, mas a norma do vetor não é:

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

Obviamente, esse método não é muito preciso, especialmente se a inclinação mudar a uma taxa alta. Isso é o mais longe que a matemática ingênua faz. Se você precisar de uma precisão melhor, saiba como usar um filtro Kalman.

Dmitry Grigoryev
fonte
1

A resposta está na definição precisa de "desaceleração" .

Da sua pergunta:

O dispositivo estará localizado em um carro e deve medir a aceleração quando o carro estiver diminuindo a velocidade (freio).

No entanto, desacelerar não é igual à frenagem . Existem duas definições possíveis:

  1. A velocidade do carro em relação ao solo está diminuindo.
  2. Os freios do carro estão sendo aplicados.

Essa diferença é significativa em subidas e descidas. Em descidas, a velocidade do carro aumentará se os freios não forem aplicados. E em subidas, a velocidade pode diminuir mesmo quando não está freando.

Acontece que detectar 1. é significativamente mais difícil que 2. Vamos definir os eixos em relação à orientação do carro: X: direção frente-trás, Y: direção esquerda-direita, Z: direção cima-baixo. Todos os eixos alinhados ao carro.

Soluções:

  1. Para a definição 1., a melhor abordagem é assumir que a velocidade do carro só pode mudar na direção X. Então a aceleração medida a = g + v, onde g é a aceleração devido a forças que combatem a gravidade, e v é a aceleração devido à mudança de velocidade. Você pode assumir que o comprimento de g é sempre igual a 9,8 m / s² e que v está sempre na direção X. Então (g_x + v_x, g_y, g_z) = (a_x, a_y, a_z) , o que fornece v_x = a_x - sqrt ((9,8m / s²) ² - g_y² - g_z²) . Isso funcionará apenas enquanto | v | é menor que | g |, ou em outras palavras, a aceleração devida ao motor ou aos freios é menor que 1G. Deve ser uma suposição bastante segura, a menos que seu carro tenha um foguete.

  2. Para a definição 2., você pode apenas pegar a leitura do eixo x diretamente. Se o carro não estiver acelerando ou freando, a única força de combate à gravidade que atua nele é a força normal da superfície da estrada. Essa força está sempre na direção z em relação ao carro, portanto, não altera a leitura do eixo x. Os freios e o motor atuam apenas na direção x e serão diretamente visíveis nesta leitura.

jpa
fonte
0

Parece que você está usando um dispositivo de "exagero" para o seu aplicativo. Você deve usar um dispositivo que meça apenas a aceleração x & y, assim, a inclinação não terá efeito mensurável. Embora a aceleração total possa ser menor ou maior, devido à inclinação, o dispositivo medirá apenas os componentes x e y da aceleração no plano em que o veículo está.

Guill
fonte