Portanto, minha resposta mais longa abaixo pressupõe que a prancha sofrerá aceleração e, durante esse período, você ainda precisará medir sua afinação, rotação e guinada dentro de um curto período de tempo. Se o quadro estiver estacionário para todas as medições, a resposta de Mahendra Gunawardena funcionará perfeitamente para você. Se isso ocorrer em um dispositivo como um segway ou modelo de avião ou multirotor ou qualquer coisa que se mova, você pode continuar lendo. Este post é sobre como usar os três sensores através de um método chamado fusão de sensores. A fusão de sensores permite obter os pontos fortes de cada sensor e minimizar os efeitos das fraquezas de cada sensor.
Características e histórico do sensor
Primeiro, entenda que um acelerômetro mede todas as forças que estão sendo aplicadas a ele, não apenas a força da gravidade. Portanto, em um mundo perfeito, com o acelerômetro em posição estacionária, sem vibrações, você poderia determinar perfeitamente qual o caminho a seguir, usando alguma trigonometria básica, como mostra a resposta de Mahendra Gunawardena. No entanto, como um acelerômetro capta todas as forças, qualquer vibração resultará em ruído. Deve-se notar também que, se a prancha está acelerando, você não pode usar apenas trigonometria simples, pois a força que o acelerômetro está relatando não é apenas a força de gravidade da Terra, mas também a força que está causando a aceleração.
Um magnetômetro é mais direto que um acelerômetro. O movimento não causará problemas, mas coisas como ferro e outros ímãs irão afetar sua produção. Se as fontes que causam essa interferência são constantes, não é difícil lidar com elas, mas, se não forem constantes, criará toneladas de ruído problemático para remover.
Dos três sensores, o giroscópio é discutível como o mais confiável e normalmente é muito bom em medir a velocidade de rotação. Não é afetado por coisas como fontes de ferro e acelerações basicamente não têm impacto em sua capacidade de medir a velocidade de rotação. Eles fazem um trabalho muito bom em relatar a velocidade na qual o dispositivo está girando, no entanto, como você procura um ângulo absoluto, precisa integrar a velocidade para obter a posição. Isso adicionará o erro da última medição ao erro das novas medições, uma vez que a integração é basicamente uma soma de valores em uma faixa, mesmo que o erro de uma medição esteja a apenas 0,01 graus por segundo, em 100 medições, sua posição pode ser desativado em 1 grau, em 1000 medições, e em 10 graus. Se você estiver fazendo centenas de medições por segundo, você pode ver que isso causa problemas. Isso é comumente chamado de desvio do giroscópio.
Fusão do sensor
Agora, a beleza de ter todos esses sensores trabalhando juntos é que você pode usar as informações do acelerômetro e magnetômetro para cancelar a deriva do giroscópio. Isso acaba permitindo que você dê a precisão e a velocidade do giroscópio sem a falha fatal do desvio do giroscópio.
A combinação dos dados desses três sensores pode ser feita de mais de uma maneira: falarei sobre o uso de um filtro complementar, porque é muito mais simples que o filtro kalman e o filtro kalman consomem muito mais recursos em sistemas embarcados. Muitas vezes, um filtro complementar é bom o suficiente, mais simples de implementar (supondo que você não esteja usando uma biblioteca pré-criada) e permite processar os dados mais rapidamente.
Agora para o processo. Os primeiros passos que você precisa fazer é integrar a saída do giroscópio para converter a velocidade angular em posição angular. Você provavelmente também precisará aplicar um filtro passa-baixo no acelerômetro e no magnetômetro para lidar com o ruído na saída. Um filtro FIR simples como o mostrado abaixo funciona aqui. Com alguma trigonometria, você pode encontrar o pitch and roll com o acelerômetro e a guinada com o magnetômetro.
filteredData = (1-weight)*filteredData + weight*newData
O peso é apenas uma constante que pode ser ajustada dependendo da quantidade de ruído com que você lida, quanto maior o ruído, menor o valor do peso. Agora, a combinação dos dados dos sensores pode ser feita pela seguinte linha de código.
fusedData = (1-weight)*gyroData + weight*accelMagData
Note-se que os dados são um vetor do pitch, roll e yaw. Você também pode usar três variáveis para fazer isso, em vez de matrizes, se desejar. Para esse cálculo, o giroscópio fornece uma posição em graus em inclinação, rotação e guinada, o magnetômetro fornece um ângulo para guinada, enquanto o acelerômetro fornece seus próprios números para a inclinação e rotação.
Se você ainda deseja obter mais informações, pode pesquisar no Google "fusão de sensores com filtro complementar", há muitos artigos sobre isso.