Índice:

Tutorial de acelerômetro e giroscópio: 3 etapas
Tutorial de acelerômetro e giroscópio: 3 etapas

Vídeo: Tutorial de acelerômetro e giroscópio: 3 etapas

Vídeo: Tutorial de acelerômetro e giroscópio: 3 etapas
Vídeo: Demonstração do Acelerômetro e Giroscópio - Módulo MPU-6050 2024, Julho
Anonim
Tutorial de acelerômetro e giroscópio
Tutorial de acelerômetro e giroscópio

Introdução

Este guia é destinado a todos os interessados em usar acelerômetros e giroscópios, bem como combinação de dispositivos IMU (unidade de medição inercial) em seus projetos eletrônicos

Vamos cobrir:

  • O que um acelerômetro mede?
  • O que um giroscópio (também conhecido como giroscópio) mede?
  • Como converter leituras analógicas para digitais (ADC) que você obtém desses sensores em unidades físicas (essas seriam g para acelerômetro, graus / s para giroscópio)
  • Como combinar as leituras do acelerômetro e do giroscópio para obter informações precisas sobre a inclinação do seu dispositivo em relação ao plano do solo

Ao longo do artigo, tentarei manter a matemática ao mínimo. Se você sabe o que são seno / cosseno / tangente, deve ser capaz de entender e usar essas ideias em seu projeto, independentemente da plataforma que estiver usando: Arduino, Propeller, Basic Stamp, chips Atmel, Microchip PIC, etc.

Existem pessoas por aí que acreditam que você precisa de matemática complexa para fazer uso de uma unidade IMU (filtros FIR ou IIR complexos, como filtros de Kalman, filtros Parks-McClellan, etc). Você pode pesquisar tudo isso e alcançar resultados maravilhosos, mas complexos. Minha maneira de explicar as coisas requer apenas matemática básica. Eu acredito muito na simplicidade. Acho que um sistema simples é mais fácil de controlar e monitorar, além de que muitos dispositivos embarcados não têm o poder e os recursos para implementar algoritmos complexos que requerem cálculos matriciais.

Vou usar como exemplo uma nova unidade IMU, o Acc_Gyro Accelerometer + Gyro IMU. Usaremos parâmetros deste dispositivo em nossos exemplos abaixo. Esta unidade é um bom dispositivo para começar porque consiste em 2 dispositivos:

- LIS331AL (folha de dados) - um acelerômetro triaxial 2G - LPR550AL (folha de dados) - um pitch and roll de eixo duplo, giroscópio de 500 graus / seg

Juntos, eles representam uma unidade de medição inercial de 5 graus de liberdade. Esse é um nome chique! No entanto, por trás do nome extravagante está um dispositivo de combinação muito útil que cobriremos e explicaremos em detalhes neste guia.

Etapa 1: o acelerômetro

O acelerômetro
O acelerômetro

Para entender esta unidade, começaremos com o acelerômetro. Quando se pensa em acelerômetros, muitas vezes é útil imaginar uma caixa em forma de cubo com uma bola dentro dela. Você pode imaginar algo como um biscoito ou um donut, mas vou imaginar uma bola:

modelo de acelerômetro
modelo de acelerômetro

Se pegarmos esta caixa em um lugar sem campos gravitacionais ou, nesse caso, sem outros campos que possam afetar a posição da bola - a bola simplesmente flutuará no meio da caixa. Você pode imaginar que a caixa está no espaço sideral, muito longe de quaisquer corpos cósmicos, ou se tal lugar for difícil de encontrar, imagine pelo menos uma nave espacial orbitando ao redor do planeta onde tudo está em um estado sem peso. Na imagem acima você pode ver que atribuímos a cada eixo um par de paredes (removemos a parede Y + para que possamos olhar dentro da caixa). Imagine que cada parede é sensível à pressão. Se movermos repentinamente a caixa para a esquerda (a aceleramos com aceleração 1g = 9,8m / s ^ 2), a bola vai bater na parede X-. Em seguida, medimos a força de pressão que a bola aplica à parede e geramos um valor de -1g no eixo X.

modelo de acelerômetro
modelo de acelerômetro

Observe que o acelerômetro detectará realmente uma força que é direcionada na direção oposta do vetor de aceleração. Essa força costuma ser chamada de Força Inercial ou Força Fictícia. Uma coisa que você deve aprender com isso é que um acelerômetro mede a aceleração indiretamente por meio de uma força que é aplicada a uma de suas paredes (de acordo com nosso modelo, pode ser uma mola ou outra coisa em acelerômetros da vida real). Essa força pode ser causada pela aceleração, mas, como veremos no próximo exemplo, nem sempre é causada pela aceleração.

Se pegarmos nosso modelo e colocá-lo na Terra a bola vai cair na parede Z e vai aplicar uma força de 1g na parede inferior, conforme mostrado na figura abaixo:

modelo de acelerômetro
modelo de acelerômetro

Neste caso, a caixa não está se movendo, mas ainda obtemos uma leitura de -1g no eixo Z. A pressão que a bola aplicou na parede foi causada por uma força gravitacional. Em teoria, poderia ser um tipo diferente de força - por exemplo, se você imaginar que nossa bola é metálica, colocar um ímã próximo à caixa pode mover a bola de forma que ela atinja outra parede. Isso foi dito apenas para provar que, em essência, o acelerômetro mede a força e não a aceleração. Acontece que a aceleração provoca uma força inercial que é capturada pelo mecanismo de detecção de força do acelerômetro.

Embora este modelo não seja exatamente como um sensor MEMS é construído, muitas vezes é útil na solução de problemas relacionados ao acelerômetro. Na verdade, existem sensores semelhantes que têm bolas metálicas dentro, eles são chamados de interruptores de inclinação, porém são mais primitivos e geralmente só podem dizer se o dispositivo está inclinado dentro de alguma faixa ou não, não a extensão da inclinação.

Até agora, analisamos a saída do acelerômetro em um único eixo e isso é tudo o que você obterá com acelerômetros de um único eixo. O valor real dos acelerômetros triaxiais vem do fato de que eles podem detectar forças inerciais em todos os três eixos. Vamos voltar ao nosso modelo de caixa e girar a caixa 45 graus para a direita. A bola vai tocar em 2 paredes agora: Z- e X- conforme mostrado na imagem abaixo:

modelo de acelerômetro
modelo de acelerômetro

Os valores de 0,71 não são arbitrários; na verdade, eles são uma aproximação para SQRT (1/2). Isso ficará mais claro à medida que apresentarmos nosso próximo modelo para o acelerômetro.

No modelo anterior, fixamos a força gravitacional e giramos nossa caixa imaginária. Nos últimos 2 exemplos, analisamos a saída em 2 posições de caixa diferentes, enquanto o vetor de força permaneceu constante. Embora isso tenha sido útil para entender como o acelerômetro interage com forças externas, é mais prático realizar cálculos se fixarmos o sistema de coordenadas nos eixos do acelerômetro e imaginarmos que o vetor de força gira ao nosso redor.

modelo de acelerômetro
modelo de acelerômetro

Por favor, dê uma olhada no modelo acima, eu preservei as cores dos eixos para que você possa fazer uma transição mental do modelo anterior para o novo. Imagine que cada eixo no novo modelo é perpendicular às respectivas faces da caixa do modelo anterior. O vetor R é o vetor de força que o acelerômetro está medindo (pode ser a força gravitacional ou a força inercial dos exemplos acima ou uma combinação de ambas). Rx, Ry, Rz são projeções do vetor R nos eixos X, Y, Z. Observe a seguinte relação:

R ^ 2 = Rx ^ 2 + Ry ^ 2 + Rz ^ 2 (Eq. 1)

que é basicamente o equivalente ao teorema de Pitágoras em 3D.

Lembre-se que um pouco antes eu disse que os valores de SQRT (1/2) ~ 0,71 não são aleatórios. Se você os inserir na fórmula acima, depois de lembrar que nossa força gravitacional era de 1 g, podemos verificar que:

1 ^ 2 = (-SQRT (1/2)) ^ 2 + 0 ^ 2 + (-SQRT (1/2)) ^ 2

simplesmente substituindo R = 1, Rx = -SQRT (1/2), Ry = 0, Rz = -SQRT (1/2) na Eq.1

Depois de um longo preâmbulo teórico, estamos nos aproximando dos acelerômetros da vida real. Os valores Rx, Ry, Rz são, na verdade, linearmente relacionados aos valores que seu acelerômetro da vida real produzirá e que você pode usar para realizar vários cálculos.

Antes de chegarmos lá, vamos falar um pouco sobre como os acelerômetros nos fornecerão essas informações. A maioria dos acelerômetros se enquadrará em duas categorias: digital e analógico. Os acelerômetros digitais fornecem informações usando um protocolo serial como I2C, SPI ou USART, enquanto os acelerômetros analógicos emitem um nível de tensão dentro de uma faixa predefinida que você deve converter para um valor digital usando um módulo ADC (conversor analógico para digital). Não vou entrar em muitos detalhes sobre como o ADC funciona, em parte porque é um tópico muito extenso e em parte porque é diferente de uma plataforma para outra. Alguns microcontroladores terão módulos ADC embutidos, alguns deles precisarão de componentes externos para realizar as conversões ADC. Não importa que tipo de módulo ADC você use, você acabará com um valor em um determinado intervalo. Por exemplo, um módulo ADC de 10 bits produzirá um valor na faixa de 0..1023, observe que 1023 = 2 ^ 10 -1. Um módulo ADC de 12 bits produzirá um valor na faixa de 0..4095, observe que 4095 = 2 ^ 12-1.

Vamos prosseguir considerando um exemplo simples, suponha que nosso módulo ADC de 10 bits nos forneça os seguintes valores para os três canais (eixos) do acelerômetro:

AdcRx = 586 AdcRy = 630 AdcRz = 561

Cada módulo ADC terá uma tensão de referência, vamos supor que em nosso exemplo seja 3,3V. Para converter um valor adc de 10 bits em voltagem, usamos a seguinte fórmula:

VoltsRx = AdcRx * Vref / 1023

Uma nota rápida aqui: que para ADC de 8 bits o último divisor seria 255 = 2 ^ 8 -1, e para ADC de 12 bits o último divisor seria 4095 = 2 ^ 12 -1.

Aplicando esta fórmula a todos os 3 canais, obtemos:

VoltsRx = 586 * 3,3V / 1023 = ~ 1,89V (arredondamos todos os resultados para 2 casas decimais) VoltsRy = 630 * 3,3V / 1023 = ~ 2,03V VoltsRz = 561 * 3,3V / 1023 = ~ 1,81V

Cada acelerômetro tem um nível de tensão de zero g, você pode encontrá-lo nas especificações, essa é a tensão que corresponde a 0 g. Para obter um valor de tensão com sinal, precisamos calcular a mudança desse nível. Digamos que nosso nível de tensão de 0g seja VzeroG = 1,65V. Calculamos as mudanças de tensão da tensão zero-g da seguinte forma:

DeltaVoltsRx = 1,89V - 1,65V = 0,24V DeltaVoltsRy = 2,03V - 1,65V = 0,38V DeltaVoltsRz = 1,81V - 1,65V = 0,16V

Agora temos nossas leituras do acelerômetro em Volts, ainda não está em g (9,8 m / s ^ 2), para fazer a conversão final aplicamos a sensibilidade do acelerômetro, geralmente expressa em mV / g. Vamos dizer que nossa sensibilidade = 478,5mV / g = 0,4785V / g. Os valores de sensibilidade podem ser encontrados nas especificações do acelerômetro. Para obter os valores finais da força expressos em g, usamos a seguinte fórmula:

Rx = DeltaVoltsRx / Sensibilidade

Rx = 0,24V / 0,4785V / g = ~ 0,5g Ry = 0,38V / 0,4785V / g = ~ 0,79g Rz = 0,16V / 0,4785V / g = ~ 0,33g

Claro que poderíamos combinar todas as etapas em uma fórmula, mas eu passei por todas as etapas para deixar claro como você vai das leituras do ADC para um componente do vetor de força expresso em g.

Rx = (AdcRx * Vref / 1023 - VzeroG) / Sensibilidade (Eq.2) Ry = (AdcRy * Vref / 1023 - VzeroG) / Sensibilidade Rz = (AdcRz * Vref / 1023 - VzeroG) / Sensibilidade

Agora temos todos os 3 componentes que definem nosso vetor de força inercial, se o dispositivo não está sujeito a outras forças além da gravitação, podemos assumir que esta é a direção do nosso vetor de força gravitacional. Se você deseja calcular a inclinação do dispositivo em relação ao solo, você pode calcular o ângulo entre este vetor e o eixo Z. Se você também estiver interessado na direção de inclinação por eixo, você pode dividir este resultado em 2 componentes: inclinação nos eixos X e Y que pode ser calculada como o ângulo entre o vetor de gravitação e os eixos X / Y. Calcular esses ângulos é mais simples do que você imagina, agora que calculamos os valores de Rx, Ry e Rz. Vamos voltar ao nosso último modelo de acelerômetro e fazer algumas anotações adicionais:

Imagem
Imagem

Os ângulos em que estamos interessados são os ângulos entre os eixos X, Y, Z e o vetor de força R. Definiremos esses ângulos como Axr, Ayr, Azr. Você pode notar no triângulo retângulo formado por R e Rx que:

cos (Axr) = Rx / R, e da mesma forma: cos (Ayr) = Ry / R cos (Azr) = Rz / R

Podemos deduzir da Eq.1 que R = SQRT (Rx ^ 2 + Ry ^ 2 + Rz ^ 2).

Podemos encontrar agora nossos ângulos usando a função arccos () (a função cos () inversa):

Axr = arccos (Rx / R) Ayr = arccos (Ry / R) Azr = arccos (Rz / R)

Percorremos um longo caminho para explicar o modelo do acelerômetro, apenas para chegar a essas fórmulas. Dependendo de seus aplicativos, você pode querer usar quaisquer fórmulas intermediárias que derivamos. Também apresentaremos o modelo de giroscópio em breve e veremos como os dados do acelerômetro e do giroscópio podem ser combinados para fornecer estimativas de inclinação ainda mais precisas.

Mas antes de fazermos isso, vamos fazer algumas anotações mais úteis:

cosX = cos (Axr) = Rx / R cosy = cos (Ayr) = Ry / R cosZ = cos (Azr) = Rz / R

Este tripleto é freqüentemente chamado de cosseno de direção e basicamente representa o vetor unitário (vetor com comprimento 1) que tem a mesma direção do nosso vetor R. Você pode verificar facilmente que:

SQRT (cosX ^ 2 + cosy ^ 2 + cosZ ^ 2) = 1

Esta é uma boa propriedade, pois nos absolve de monitorar o módulo (comprimento) do vetor R. Muitas vezes, se estamos apenas interessados na direção de nosso vetor inercial, faz sentido normalizar seu módulo para simplificar outros cálculos.

Etapa 2: Giroscópio

Giroscópio
Giroscópio

Não vamos introduzir nenhum modelo de caixa equivalente para o giroscópio como fizemos para o acelerômetro, em vez disso, vamos pular direto para o segundo modelo do acelerômetro e mostrar o que o giroscópio mede de acordo com este modelo.

Imagem
Imagem

Cada canal do giroscópio mede a rotação em torno de um dos eixos. Por exemplo, um giroscópio de 2 eixos medirá a rotação em torno (ou alguns podem dizer "sobre") os eixos X e Y. Para expressar essa rotação em números, vamos fazer algumas anotações. Primeiro vamos definir:

Rxz - é a projeção do vetor de força inercial R no plano XZ Ryz - é a projeção do vetor de força inercial R no plano YZ

Do triângulo retângulo formado por Rxz e Rz, usando o teorema de Pitágoras, obtemos:

Rxz ^ 2 = Rx ^ 2 + Rz ^ 2, e da mesma forma: Ryz ^ 2 = Ry ^ 2 + Rz ^ 2

também observe que:

R ^ 2 = Rxz ^ 2 + Ry ^ 2, isso pode ser derivado da Eq.1 e das equações acima, ou pode ser derivado do triângulo retângulo formado por R e Ryz R ^ 2 = Ryz ^ 2 + Rx ^ 2

Não usaremos essas fórmulas neste artigo, mas é útil observar a relação entre todos os valores em nosso modelo.

Em vez disso, vamos definir o ângulo entre o eixo Z e os vetores Rxz, Ryz da seguinte maneira:

Axz - é o ângulo entre o Rxz (projeção de R no plano XZ) e o eixo Z Ayz - é o ângulo entre o Ryz (projeção de R no plano YZ) e o eixo Z

Agora estamos nos aproximando do que o giroscópio mede. O giroscópio mede a taxa de mudanças dos ângulos definidos acima. Em outras palavras, ele produzirá um valor que está linearmente relacionado à taxa de variação desses ângulos. Para explicar isso, vamos supor que medimos o ângulo de rotação em torno do eixo Y (que seria o ângulo Axz) no tempo t0, e o definimos como Axz0, em seguida medimos esse ângulo posteriormente t1 e era Axz1. A taxa de alteração será calculada da seguinte forma:

RateAxz = (Axz1 - Axz0) / (t1 - t0).

Se expressarmos Axz em graus e o tempo em segundos, esse valor será expresso em graus / s. Isso é o que um giroscópio mede.

Na prática, um giroscópio (a menos que seja um giroscópio digital especial) raramente fornecerá um valor expresso em graus / s. Da mesma forma que para o acelerômetro, você obterá um valor ADC que precisará converter para graus / s usando uma fórmula semelhante à Eq. 2 que definimos para acelerômetro. Vamos apresentar a fórmula de conversão ADC para graus / s para giroscópio (presumimos que estamos usando um módulo ADC de 10 bits, para ADC de 8 bits substitua 1023 por 255, para ADC de 12 bits substitua 1023 por 4095).

RateAxz = (AdcGyroXZ * Vref / 1023 - VzeroRate) / Sensibilidade Eq.3 RateAyz = (AdcGyroYZ * Vref / 1023 - VzeroRate) / Sensibilidade

AdcGyroXZ, AdcGyroYZ - são obtidos do nosso módulo adc e representam os canais que medem a rotação da projeção do vetor R em XZ respectivamente nos planos YZ, o que equivale a dizer que a rotação foi feita em torno dos eixos Y e X respectivamente.

Vref - é a tensão de referência ADC que usaremos 3,3 V no exemplo abaixo VzeroRate - é a tensão de taxa zero, em outras palavras, a tensão que o giroscópio emite quando não está sujeito a nenhuma rotação, para a placa Acc_Gyro é por exemplo 1,23 V (você pode encontrar esses valores nas especificações) Sensibilidade - é a sensibilidade do seu giroscópio, expressa em mV / (graus / s), muitas vezes escrita como mV / graus / s, basicamente informa quantos mV o aumento de saída do giroscópio, se você aumentar a velocidade de rotação em um grau / s. A sensibilidade da placa Acc_Gyro é, por exemplo, 2mV / deg / s ou 0,002V / deg / s

Vamos dar um exemplo, suponha que nosso módulo ADC retorne os seguintes valores:

AdcGyroXZ = 571 AdcGyroXZ = 323

Usando a fórmula acima e usando os parâmetros de especificações da placa Acc_Gyro obteremos:

RateAxz = (571 * 3,3 V / 1023 - 1,23 V) / (0,002 V / deg / s) = ~ 306 deg / s RateAyz = (323 * 3,3 V / 1023 - 1,23 V) / (0,002 V / deg / s) = ~ -94 graus / s

Em outras palavras, o dispositivo gira em torno do eixo Y (ou podemos dizer que ele gira no plano XZ) com uma velocidade de 306 graus / se em torno do eixo X (ou podemos dizer que ele gira no plano YZ) com uma velocidade de - 94 graus / s. Observe que o sinal negativo significa que o dispositivo gira na direção oposta da direção positiva convencional. Por convenção, um sentido de rotação é positivo. Uma boa folha de especificações do giroscópio mostrará qual direção é positiva, caso contrário, você terá que encontrá-la experimentando com o dispositivo e observando qual direção de rotação resulta no aumento da tensão no pino de saída. A melhor maneira de fazer isso é usando um osciloscópio, pois assim que você parar a rotação, a tensão cairá de volta ao nível de taxa zero. Se você estiver usando um multímetro, terá que manter uma taxa de rotação constante por pelo menos alguns segundos e observar a tensão durante essa rotação e, em seguida, compará-la com a tensão de taxa zero. Se for maior do que a tensão de taxa zero, significa que o sentido de rotação é positivo.

Etapa 3: Combinando o acelerômetro e o giroscópio

Combinando o acelerômetro e giroscópio
Combinando o acelerômetro e giroscópio

Juntando tudo - Combinando dados de acelerômetro e giroscópio

Se você está lendo este artigo, provavelmente adquiriu ou está planejando adquirir um dispositivo IMU, ou provavelmente está planejando construir um a partir de dispositivos separados de acelerômetro e giroscópio.

O primeiro passo para usar um dispositivo IMU combinado que combina um acelerômetro e um giroscópio é alinhar seus sistemas de coordenadas. A maneira mais fácil de fazer isso é escolher o sistema de coordenadas do acelerômetro como seu sistema de coordenadas de referência. A maioria das planilhas de dados do acelerômetro exibirá a direção dos eixos X, Y, Z em relação à imagem do chip ou dispositivo físico. Por exemplo, aqui estão as direções dos eixos X, Y, Z, conforme mostrado nas especificações para a placa Acc_Gyro:

eixos acc_gyro
eixos acc_gyro

Os próximos passos são:

Identifique as saídas do giroscópio que correspondem aos valores RateAxz e RateAyz discutidos acima. Determine se essas saídas precisam ser invertidas devido à posição física do giroscópio em relação ao acelerômetro

Não presuma que se um giroscópio tiver uma saída marcada com X ou Y, ele corresponderá a qualquer eixo no sistema de coordenadas do acelerômetro, mesmo se essa saída for parte de uma unidade IMU. A melhor maneira é testá-lo. Supondo que você fixou a posição do giroscópio em relação ao acelerômetro. Presume-se que as bordas do giroscópio e do acelerômetro sejam paralelas, ou seja, você está colocando o giroscópio em um ângulo múltiplo de 90 graus em relação ao chip do acelerômetro. Se você adquiriu um quadro IMU, é provável que eles já estejam alinhados dessa forma. Não vamos discutir neste artigo modelos em que o giroscópio é colocado em um ângulo irregular em relação ao acelerômetro (digamos 45 ou 30 graus), embora isso possa ser útil em algumas aplicações.

Aqui está uma sequência de amostra para determinar qual saída do giroscópio corresponde ao valor RateAxz discutido acima.

- comece colocando o dispositivo na posição horizontal. Ambas as saídas X e Y do acelerômetro produziriam a tensão zero-g (por exemplo, para placa Acc_Gyro isso é 1,65V)

- em seguida, comece a girar o dispositivo em torno do eixo Y, outra maneira de dizer é que você gira o dispositivo no plano XZ, de modo que as saídas do acelerômetro X e Z mudem e a saída Y permaneça constante. - ao girar o dispositivo em uma velocidade constante, observe que a saída do giroscópio muda, as outras saídas do giroscópio devem permanecer constantes - a saída do giroscópio que mudou durante a rotação em torno do eixo Y (rotação no plano XZ) fornecerá o valor de entrada para AdcGyroXZ, a partir do qual calculamos o RateAxz - a etapa final é garantir que a direção de rotação corresponda ao nosso modelo, em alguns casos você pode ter que inverter o valor do RateAxz devido à posição física do giroscópio em relação ao acelerômetro - execute novamente o teste acima, girando o dispositivo eixo Y, desta vez monitore a saída X do acelerômetro (AdcRx em nosso modelo). Se o AdcRx crescer (os primeiros 90 graus de rotação a partir da posição horizontal), o AdcGyroXZ também deverá crescer. Caso contrário, você precisa inverter RateAxz, você pode conseguir isso introduzindo um fator de sinal na Eq.3, da seguinte maneira:

RateAxz = InvertAxz * (AdcGyroXZ * Vref / 1023 - VzeroRate) / Sensitivity, onde InvertAxz é 1 ou -1

O mesmo teste pode ser feito para RateAyz, girando o dispositivo em torno do eixo X, e você pode identificar qual saída do giroscópio corresponde a RateAyz, e se ela precisa ser invertida. Depois de ter o valor para InvertAyz, você deve usar a seguinte fórmula para calcular RateAyz:

RateAyz = InvertAyz * (AdcGyroYZ * Vref / 1023 - VzeroRate) / Sensibilidade

Se você fizesse esses testes na placa Acc_Gyro, obteria os seguintes resultados:

- o pino de saída para RateAxz é GX4 e InvertAxz = -1. - o pino de saída para RateAyz é GY4 e InvertAyz = -1

Deste ponto em diante, consideraremos que você configurou sua IMU de forma que possa calcular os valores corretos para Axr, Ayr, Azr (conforme definido na Parte 1. Acelerômetro) e RateAxz, RateAyz (conforme definido na Parte 2. Giroscópio) A seguir, analisaremos as relações entre esses valores que se mostram úteis na obtenção de estimativas mais precisas da inclinação do dispositivo em relação ao plano do solo.

Você pode estar se perguntando neste ponto, se o modelo do acelerômetro já nos deu os ângulos de inclinação de Axr, Ayr, Azr, por que haveríamos de nos preocupar com os dados do giroscópio? A resposta é simples: os dados do acelerômetro nem sempre podem ser 100% confiáveis. Há vários motivos, lembre-se que o acelerômetro mede a força inercial, tal força pode ser causada pela gravitação (e idealmente apenas pela gravitação), mas também pode ser causada pela aceleração (movimento) do dispositivo. Como resultado, mesmo se o acelerômetro estiver em um estado relativamente estável, ele ainda é muito sensível à vibração e ao ruído mecânico em geral. Esta é a principal razão pela qual a maioria dos sistemas IMU usa um giroscópio para suavizar quaisquer erros do acelerômetro. Mas como é que isto é feito ? E o giroscópio está livre de ruído?

O giroscópio não está livre de ruído, no entanto, porque mede a rotação, é menos sensível aos movimentos mecânicos lineares, o tipo de ruído que sofre o acelerômetro, no entanto os giroscópios têm outros tipos de problemas como, por exemplo, deriva (não voltando ao valor de taxa zero quando a rotação para). No entanto, calculando a média dos dados que vêm do acelerômetro e do giroscópio, podemos obter uma estimativa relativamente melhor da inclinação do dispositivo atual do que obteríamos usando apenas os dados do acelerômetro.

Nas próximas etapas, apresentarei um algoritmo que foi inspirado em algumas ideias usadas no filtro de Kalman, porém é muito mais simples e fácil de implementar em dispositivos embarcados. Antes disso, vamos ver primeiro o que queremos que nosso algoritmo calcule. Bem, é a direção do vetor de força gravitacional R = [Rx, Ry, Rz] a partir do qual podemos derivar outros valores como Axr, Ayr, Azr ou cosX, cosy, cosZ que nos dará uma ideia sobre a inclinação de nosso dispositivo em relação ao plano do solo, discutimos a relação entre esses valores na Parte 1. Pode-se dizer - já não temos esses valores Rx, Ry, Rz da Eq.2 na Parte 1? Bem, sim, mas lembre-se de que esses valores são derivados apenas dos dados do acelerômetro, portanto, se você for usá-los diretamente em seu aplicativo, poderá obter mais ruído do que seu aplicativo pode tolerar. Para evitar mais confusão, vamos redefinir as medições do acelerômetro da seguinte forma:

Racc - é o vetor de força inercial medido pelo acelerômetro, que consiste nos seguintes componentes (projeções nos eixos X, Y, Z):

RxAcc = (AdcRx * Vref / 1023 - VzeroG) / Sensibilidade RyAcc = (AdcRy * Vref / 1023 - VzeroG) / Sensibilidade RzAcc = (AdcRz * Vref / 1023 - VzeroG) / Sensibilidade

Até agora, temos um conjunto de valores medidos que podemos obter puramente dos valores ADC do acelerômetro. Chamaremos esse conjunto de dados de "vetor" e usaremos a seguinte notação.

Racc = [RxAcc, RyAcc, RzAcc]

Como esses componentes do Racc podem ser obtidos a partir dos dados do acelerômetro, podemos considerá-los uma entrada para nosso algoritmo.

Observe que, como Racc mede a força de gravitação, você estará correto se assumir que o comprimento desse vetor definido a seguir é igual ou próximo a 1g.

| Racc | = SQRT (RxAcc ^ 2 + RyAcc ^ 2 + RzAcc ^ 2), No entanto, para ter certeza de que faz sentido atualizar esse vetor da seguinte maneira:

Racc (normalizado) = [RxAcc / | Racc |, RyAcc / | Racc |, RzAcc / | Racc |].

Isso garantirá que o comprimento do vetor Racc normalizado seja sempre 1.

A seguir, apresentaremos um novo vetor e o chamaremos

Rest = [RxEst, RyEst, RzEst]

Este será o resultado do nosso algoritmo, estes são valores corrigidos com base nos dados do giroscópio e com base nos dados estimados anteriores.

Aqui está o que nosso algoritmo fará: - o acelerômetro nos diz: "Você está agora na posição Racc" - dizemos "Obrigado, mas deixe-me verificar", - em seguida, corrija essa informação com dados do giroscópio, bem como com dados de repouso anteriores e produzimos um novo vetor de repouso estimado. - consideramos Rest como a nossa "melhor aposta" quanto à posição atual do dispositivo.

Vamos ver como podemos fazer isso funcionar.

Começaremos nossa sequência confiando em nosso acelerômetro e atribuindo:

Resto (0) = Racc (0)

A propósito, lembre-se de que Rest e Racc são vetores, então a equação acima é apenas uma maneira simples de escrever 3 conjuntos de equações e evitar a repetição:

RxEst (0) = RxAcc (0) RyEst (0) = RyAcc (0) RzEst (0) = RzAcc (0)

Em seguida, faremos medições regulares em intervalos de tempo iguais de T segundos e obteremos novas medições que definiremos como Racc (1), Racc (2), Racc (3) e assim por diante. Também emitiremos novas estimativas em cada intervalo de tempo Descanso (1), Descanso (2), Descanso (3) e assim por diante.

Suponha que estamos na etapa n. Temos dois conjuntos de valores conhecidos que gostaríamos de usar:

Rest (n-1) - nossa estimativa anterior, com Rest (0) = Racc (0) Racc (n) - nossa medição atual do acelerômetro

Antes de podermos calcular Rest (n), vamos introduzir um novo valor medido, que podemos obter de nosso giroscópio e uma estimativa anterior.

Vamos chamá-lo de Rgyro e também é um vetor que consiste em 3 componentes:

Rgyro = [RxGyro, RyGyro, RzGyro]

Vamos calcular este vetor um componente de cada vez. Começaremos com RxGyro.

modelo de giroscópio
modelo de giroscópio

Vamos começar observando a seguinte relação em nosso modelo de giroscópio, do triângulo retângulo formado por Rz e Rxz podemos derivar que:

tan (Axz) = Rx / Rz => Axz = atan2 (Rx, Rz)

Atan2 pode ser uma função que você nunca usou antes, é semelhante a atan, exceto que retorna valores no intervalo de (-PI, PI) em oposição a (-PI / 2, PI / 2) conforme retornado por atan, e leva 2 argumentos em vez de um. Ele nos permite converter os dois valores de Rx, Rz em ângulos na faixa completa de 360 graus (-PI a PI). Você pode ler mais sobre atan2 aqui.

Assim, conhecendo RxEst (n-1) e RzEst (n-1), podemos encontrar:

Axz (n-1) = atan2 (RxEst (n-1), RzEst (n-1)).

Lembre-se de que o giroscópio mede a taxa de variação do ângulo de Axz. Portanto, podemos estimar o novo ângulo Axz (n) da seguinte forma:

Axz (n) = Axz (n-1) + RateAxz (n) * T

Lembre-se de que o RateAxz pode ser obtido nas leituras do ADC do nosso giroscópio. Uma fórmula mais precisa pode usar uma taxa de rotação média calculada da seguinte forma:

RateAxzAvg = (RateAxz (n) + RateAxz (n-1)) / 2 Axz (n) = Axz (n-1) + RateAxzAvg * T

Da mesma forma que podemos encontrar:

Ayz (n) = Ayz (n-1) + RateAyz (n) * T

Ok, agora temos Axz (n) e Ayz (n). Para onde vamos agora deduzir RxGyro / RyGyro? Da Eq. 1 podemos escrever o comprimento do vetor Rgyro da seguinte forma:

| Rgyro | = SQRT (RxGyro ^ 2 + RyGyro ^ 2 + RzGyro ^ 2)

Além disso, como normalizamos nosso vetor Racc, podemos assumir que seu comprimento é 1 e não mudou após a rotação, por isso é relativamente seguro escrever:

| Rgyro | = 1

Vamos adotar uma notação temporária mais curta para os cálculos abaixo:

x = RxGyro, y = RyGyro, z = RzGyro

Usando as relações acima, podemos escrever:

x = x / 1 = x / SQRT (x ^ 2 + y ^ 2 + z ^ 2)

Vamos dividir o numerador e o denominador da fração por SQRT (x ^ 2 + z ^ 2)

x = (x / SQRT (x ^ 2 + z ^ 2)) / SQRT ((x ^ 2 + y ^ 2 + z ^ 2) / (x ^ 2 + z ^ 2))

Observe que x / SQRT (x ^ 2 + z ^ 2) = sin (Axz), então:

x = sin (Axz) / SQRT (1 + y ^ 2 / (x ^ 2 + z ^ 2))

Agora multiplique o numerador e o denominador da fração dentro do SQRT por z ^ 2

x = sin (Axz) / SQRT (1 + y ^ 2 * z ^ 2 / (z ^ 2 * (x ^ 2 + z ^ 2)))

Observe que z / SQRT (x ^ 2 + z ^ 2) = cos (Axz) ey / z = tan (Ayz), então finalmente:

x = sin (Axz) / SQRT (1 + cos (Axz) ^ 2 * tan (Ayz) ^ 2)

Voltando à nossa notação, obtemos:

RxGyro = sin (Axz (n)) / SQRT (1 + cos (Axz (n)) ^ 2 * tan (Ayz (n)) ^ 2)

da mesma forma que encontramos isso

RyGyro = sin (Ayz (n)) / SQRT (1 + cos (Ayz (n)) ^ 2 * tan (Axz (n)) ^ 2)

Agora, finalmente podemos encontrar:

RzGyro = Sign (RzGyro) * SQRT (1 - RxGyro ^ 2 - RyGyro ^ 2).

Onde Sign (RzGyro) = 1 quando RzGyro> = 0, e Sign (RzGyro) = -1 quando RzGyro <0.

Uma maneira simples de estimar isso é pegar:

Sinal (RzGyro) = Sinal (RzEst (n-1))

Na prática, tome cuidado quando RzEst (n-1) estiver próximo de 0. Você pode pular a fase giroscópica totalmente neste caso e atribuir: Rgyro = Rest (n-1). Rz é usado como referência para calcular os ângulos de Axz e Ayz e quando está próximo de 0, os valores podem transbordar e gerar resultados ruins. Você estará no domínio de grandes números de ponto flutuante onde as implementações da função tan () / atan () podem ter falta de precisão.

Então, vamos recapitular o que temos até agora, estamos na etapa n do nosso algoritmo e calculamos os seguintes valores:

Racc - leituras atuais de nosso acelerômetro Rgyro - obtidas de Rest (n-1) e leituras atuais do giroscópio

Quais valores usamos para calcular a estimativa atualizada Rest (n)? Você provavelmente adivinhou que usaremos ambos. Usaremos uma média ponderada, de modo que:

Resto (n) = (Racc * w1 + Rgyro * w2) / (w1 + w2)

Podemos simplificar essa fórmula dividindo o numerador e o denominador da fração por w1.

Resto (n) = (Racc * w1 / w1 + Rgyro * w2 / w1) / (w1 / w1 + w2 / w1)

e depois de substituir w2 / w1 = wGyro, obtemos:

Resto (n) = (Racc + Rgyro * wGyro) / (1 + wGyro)

No fórum acima, o wGyro nos diz o quanto confiamos em nosso giroscópio em comparação com nosso acelerômetro. Este valor pode ser escolhido experimentalmente, normalmente valores entre 5..20 irão desencadear bons resultados.

A principal diferença desse algoritmo do filtro de Kalman é que esse peso é relativamente fixo, enquanto no filtro de Kalman os pesos são atualizados permanentemente com base no ruído medido das leituras do acelerômetro. O filtro de Kalman se concentra em fornecer "os melhores" resultados teóricos, enquanto esse algoritmo pode fornecer resultados "bons o suficiente" para sua aplicação prática. Você pode implementar um algoritmo que ajusta o wGyro dependendo de alguns fatores de ruído medidos, mas os valores fixos funcionarão bem para a maioria dos aplicativos.

Estamos a um passo de obter nossos valores estimados atualizados:

RxEst (n) = (RxAcc + RxGyro * wGyro) / (1 + wGyro) RyEst (n) = (RyAcc + RyGyro * wGyro) / (1 + wGyro) RzEst (n) = (RzAcc + RzGyro * wGyro) / (1 + wGyro)

Agora vamos normalizar esse vetor novamente:

R = SQRT (RxEst (n) ^ 2 + RyEst (n) ^ 2 + RzEst (n) ^ 2)

RxEst (n) = RxEst (n) / R RyEst (n) = RyEst (n) / R RzEst (n) = RzEst (n) / R

E estamos prontos para repetir nosso loop novamente.

Este guia apareceu originalmente em starlino.com, fiz algumas pequenas edições e repostei-o com permissão. Obrigado Starlino!

Recomendado: