Saturday 21 October 2017

Mudança Média Filtro Arduino


Estou trabalhando em um robô móvel controlado através de um link sem fio de 2,4 GHz. O receptor está conectado ao Arduino Uno que serve a bordo como o controlador principal. O canal de entrada mais crítico (e principal) proveniente do receptor produz um sinal muito ruidoso, o que leva a muitas pequenas mudanças na saída dos atuadores, mesmo que não sejam necessários. Estou à procura de bibliotecas que possam realizar um alisamento eficiente. Existem algumas bibliotecas de suficiência de sinal disponíveis para o Arduino (Uno), solicitado em 16 de fevereiro às 13:57. Creio que vejo muitas picos de ruído de amostra única em seu sinal ruidoso. O filtro mediano faz melhor para se livrar de espigas de ruído de amostra única do que qualquer filtro linear. (É melhor do que qualquer filtro passa-baixa, média móvel, média móvel ponderada, etc. em termos de seu tempo de resposta e sua capacidade de ignorar esses outliers de picos de ruído de amostra única). Existem, de fato, muitas bibliotecas de alívio de sinais para o Arduino, muitas das quais incluem um filtro mediano. Bibliotecas de sinalização de sinal no arduino. cc: bibliotecas de suavização de sinal no github: Alguma coisa assim funciona no seu robô (A mediana de 3 requer muito pouca energia da CPU e, portanto, rápida): você poderia filtrar isso digitalmente usando um baixo Filtro de passagem: mude o 0,99 para alterar a freqüência de corte (mais perto de 1,0 é menor freqüência). A expressão real desse valor é exp (-2piffs) onde f é a frequência de corte desejada e fs é a frequência em que os dados são amostrados. Outro tipo de filtro digital é um filtro de eventos. Funciona bem em dados que tem valores abertos, e. 9,9,8,10,9,25,9. Um filtro de eventos retorna o valor mais freqüente. Estatisticamente este é o modo. As médias estatísticas, como Média, Modo etc., podem ser calculadas usando a Biblioteca Média Arduino. Um exemplo retirado da página da Biblioteca Arduino referida: Uma das principais aplicações para a placa Arduino é a leitura e registro dos dados do sensor. Por exemplo, um monitora a pressão a cada segundo do dia. Como altas taxas de amostragem muitas vezes geram picos nos gráficos, um também quer ter uma média das medidas. Como as medidas não são estáticas no tempo, o que muitas vezes precisamos é uma média em execução. Esta é a média de um determinado período e muito valioso quando se faz análise de tendências. A forma mais simples de uma média em execução pode ser feita por código que se baseia na média anterior: se não quiser usar matemática de ponto flutuante - como isso ocupa memória e diminui a velocidade - pode-se fazer o mesmo completamente no domínio inteiro. A divisão por 256 no código da amostra é um shift-right 8, que é mais rápido do que dizer divisão por e. 100. Isso é verdade para cada poder de 2 como divisor e um só deve cuidar a soma dos pesos é igual à potência de 2. E é claro que se deve cuidar que não haja transbordamento intermediário (considere usar sem assinatura longa) Se você precisar Uma média de corrida mais precisa, in concreto das últimas 10 medidas, você precisa de uma matriz (ou lista vinculada) para mantê-las. Esta matriz funciona como um buffer circular e com cada nova medida, a mais antiga é removida. A média de corrida é calculada como a soma de todos os elementos divididos pelo número de elementos na matriz. O código para a média em execução será algo assim: Desvantagem deste código é que a matriz para manter todos os valores pode se tornar bastante grande. Se você tem uma medida por segundo e quer uma média corrente por minuto, você precisa de uma série de 60, uma média por hora precisaria de uma matriz de 3600. Isso não poderia ser feito dessa maneira em um Arduino, pois ele só possui 2K de RAM. No entanto, ao construir uma média de 2 etapas, pode ser abordado bastante bem (aviso: não para todas as medidas). No código psuedo: Como uma nova matriz estática interna é necessária para cada função runningAverage, isso grita para ser implementado como uma classe. Biblioteca RunningAverage A biblioteca runningAverage faz uma classe da função acima para que ela possa ser usada várias vezes em um esboço. Desacopla a função add () e avg () para ser um pouco mais flexível, e. Pode-se chamar a média várias vezes sem adicionar nada. Observe que todas as instâncias da classe adicionam sua própria matriz para armazenar medidas, e isso aumenta o uso da memória. A interface da classe é mantida tão pequena quanto possível. Nota: com a versão 0.2 os nomes dos métodos são todos mais descritivos. Um pequeno esboço mostra como ele pode ser usado. Um gerador aleatório é usado para imitar um sensor. Na configuração (), o myRA é limpo para que possamos começar a adicionar novos dados. Em loop () primeiro, um número aleatório é gerado e convertido em um flutuador para ser adicionado ao myRA. Em seguida, o runningAverage é impresso na porta serial. Pode-se também exibi-lo em algum LCD ou enviar por ethernet, etc. Quando são adicionados 300 itens, o myRA está limpo para começar de novo. Para usar a biblioteca, faça uma pasta nas suas LISTAS SKETCHBOOKPATH com o nome RunningAverage e coloque o. h e. cpp lá. Opcionalmente, faça um subdiretório de exemplos para colocar o aplicativo de exemplo. 2011-01-30: versão inicial 2011-02-28: destrutor faltando fixo no arquivo. h 2011-02-28: construtor padrão removido 2012--. TrimValue () Yuval Naveh adicionou trimValue (encontrado na web) 2012-11-21: refatorado 2012-12-30: adicionado fillValue () refatorado para publicação 2014-07-03: código de proteção de memória adicionado - se a matriz interna não puder ser alocada tamanho Torna-se 0. Isso é para resolver o problema descrito aqui - forum. arduino. ccindex. phptopic50473.msg1790086msg1790086 - Teste extensivamente. Classe de classe RunningAverage. h RunningAverage. cppFiltering Accelerometer Data com Matlab e Arduino 15 de abril de 2016 por Ryan Morrison Continuando com minha exploração da interface MATLABArduino, esta publicação examina dois métodos de remoção de ruído dos dados do sensor: média móvel exponencial e filtros de média móvel simples. Como um precursor a isso, uma introdução à comunicação em série e o traçado de dados com Arduino e MATLAB podem ser encontrados na minha publicação anterior. Todo o código usado nessas postagens está disponível no meu depósito GitHub. Mais uma vez, estou usando os vídeos do tutorial de matlabarduino. org como referência, ao mesmo tempo que adiciono minhas próprias melhorias de recursos ao longo do caminho. Média móvel exponencial (EMA) A média móvel exponencial atribui um fator de ponderação, com os dados mais recentes com o maior peso. É calculado pela seguinte equação: Por minha publicação anterior, o acelerômetro LSM303DLHC é interagido com um Arduino Uno, a comunicação serial entre Arduino e MATLAB é estabelecida, e MATLAB traça os vetores de aceleração gravitacional. O código MATLAB anterior é modificado para calcular o EMA e exibir parcelas lado a lado de dados crus e filtrados. O resultado é representado a seguir. Observe a diferença entre dados crus e filtrados, pois o controle deslizante altera o valor alfa. Comparação de vetores de aceleração crus (esquerda) e filtrados EMA (direita). No gráfico acima, o acelerômetro é mantido no espaço com o vetor z perpendicular à terra. O movimento e a vibração são aplicados ao acelerômetro para mostrar a resposta a mudanças repentinas na orientação. Ao comparar os dados brutos à esquerda com os dados filtrados à direita, as seguintes observações são feitas: O valor alfa que aproxima 1 resultados na filtragem alta do gráfico filtrado se move muito pouco em resposta ao movimento. O valor alfa que aproxima 0 resulta em baixa filtragem, há pouca diferença entre os lotes crus e filtrados. O valor alfa em torno de 0,5 fornece um nível ótimo de filtragem, a parcela filtrada está livre de flutuação errática e responde ao movimento. Média móvel simples (sma) Como o nome indica, este filtro emprega uma média simples de dados de sensores recebidos. Com cada iteração do loop de código, o valor mais antigo no conjunto de dados é descartado e substituído pela última leitura e uma nova média é calculada. O SMA é dado pela seguinte equação, onde o nível de redução de ruído é determinado por n (número de torneiras). As magnitudes das acelerações do eixo xyz são visualizadas em parcelas 2D usando MATLAB. Ambos os dados em bruto e filtrados são apresentados, e um controle deslizante é usado para ajustar a quantidade de filtragem (número de torneiras). Comparação das magnitudes de aceleração xyz (inferior) filtrada (superior) e SMA (inferior). O acelerômetro é manipulado da mesma maneira que com o filtro EMA. Para resumir os efeitos do filtro SMA: as torneiras zero sem filtragem de leituras de acelerômetro bruto revelam alta sensibilidade a pequenas perturbações. O movimento do acelerômetro vigoroso de dez batidas de alta filtragem não é observado nos resultados filtrados. Cinco eléctrodos de gatilhos de filtragem óptimos são eliminados, mas os resultados filtrados refletem grandes movimentos. Conclusão agora sou bastante competente com o uso do MATLAB para caracterização de sensores e será utilizá-lo em projetos futuros. O que imediatamente vem à mente é aplicar isso na definição de parâmetros de limiar quando se utilizam acelerômetros em aplicações roboticas. Um exemplo é a melhoria feita na detecção de impacto por filtragem de jitter errôneo introduzido pelas vibrações do corpo.

No comments:

Post a Comment