Kalman filter moving average matlab


este thread pergunta quando um filtro de Kalman de tempo discreto é melhor / diferente de uma média móvel simples das observações: não há resposta definitiva. alguém pode dar um exemplo definitivo onde o filtro kalman, idealmente no caso 1D simples, faz algo diferente (e melhor) do que manter uma média móvel, e indicar as condições em que o filtro kalman seria reduzido a uma média móvel simples? O filtro kalman não pesaria todos os pontos de dados igualmente porque sua variação é inicialmente menor e melhora com o tempo. mas parece que isso só importaria perto das observações iniciais e que uma vez que a variância convergisse, o filtro kalman pesaria cada observação igualmente como uma média móvel, então não veja quando os dois são diferentes e por que / quando o filtro faria melhor . perguntou 17 de fevereiro de 15 às 23:52 como a primeira resposta (com a maioria dos votos) diz, o filtro kalman é melhor em qualquer caso, quando o sinal está mudando. Observe a declaração do problema. Eles usam o algoritmo para estimar alguma voltagem constante. Como poderia usar um filtro de Kalman para isso ser melhor do que apenas manter uma média de execução? Estes exemplos apenas casos de uso simplificados do filtro usando um filtro kalman para estimar uma tensão constante é definitivamente, um exagero. Nesse problema em particular, é melhor usar a média de execução, que sabemos ser o melhor estimador para as distribuições gaussianas. Neste exemplo, a tensão medida é a tensão real V, mas com algum ruído tipicamente modelado como 0 média de Gaussian (ruído branco). para que nossas medidas sejam gaussianas com meanV e sigmasigma noise. O filtro kalman é mais adequado para estimar coisas que mudam com o tempo. O exemplo mais tangível é rastrear objetos em movimento. Vamos imaginar o lançamento de uma bola, sabemos que ela fará um arco parabólico, mas o que nossos estimadores mostrarão como um filtro de Kalman estará muito próximo da trajetória real porque diz que a medida mais recente é mais importante que as antigas (quando a covariância é baixo que é). A média de corrida leva todas as medidas igualmente trajetória azul-bola, média vermelha (desculpe, não kalman se eu tiver tempo de jogar lá se eu tiver tempo, mas eu ficaria muito mais perto da linha azul supondo que você modelou bem o sistema O filtro de Kalman, por outro lado, diz, se nossa convenção e residual eram pequenos (o que significa que tínhamos uma boa estimativa), então vamos ficar com a estimativa anterior e ajustá-la um pouco com base no residual (ou nossa estimativa). erro). Agora, como o nosso xhat kk está muito próximo do estado atual, quando fizermos a próxima atualização, usaremos um estado do sistema que corresponda ao estado real. Em x30, a média corrente diz, a condição inicial y (0) é tão importante quanto y (29), é isso, e você tem um grande erro. O filtro kalman foi responsável por isso. Ele disse que desde o nosso erro da última vez foi enorme, vamos fazer uma mudança drástica na nossa estimativa (nosso xhat) então quando usá-lo para a próxima atualização, será mais perto do que realmente está acontecendo Espero que faça algum sentido que acabei de notar sua pergunta é sobre uma média móvel x kalman. Respondi rodando avg vs kalman (esse é o tópico do link que você forneceu) Apenas para adicionar um pouco mais de informação especificamente à média móvel (em janela). A média móvel é um melhor estimador de mudança de valores. Uma vez que só leva em conta amostras mais recentes. Infelizmente, ele tem um atraso associado a ele, especialmente em relação à mudança de derivativos (basta olhar para t30, onde a derivada está passando de positiva para negativa). Isso ocorre porque a média é lenta para ver a flutuação. Qual é tipicamente porque nós o usamos, para remover a flutuação (ruído). O tamanho da janela também desempenha um papel. Uma janela menor é geralmente mais próxima dos valores medidos, o que faz sentido e soa bem, certo. A desvantagem disso é se você tem medições barulhentas, uma pequena janela significa que mais ruído aparece mais na saída. Vamos olhar para a outra questão novamente medições com média 0,5, sigma 0,1 z 0,3708435, 0,4985331, 0,4652121. a média das 3 primeiras amostras é 0,448629 não exatamente próxima do valor esperado de 0,5. Isso mostra novamente que, com a janela menor, o ruído tem um efeito mais profundo na saída. Então, logicamente, nosso próximo passo é pegar janelas maiores, para melhorar nossa imunidade ao ruído. Bem, as janelas maiores são ainda mais lentas para refletir as mudanças reais (mais uma vez olhe para t30 em meu gráfico) e o caso mais extremo de janelas é basicamente a média em execução (que já sabemos que é ruim para alterar dados) Agora de volta ao mágico filtro kalman. Se você pensar sobre isso, é semelhante a uma média de 2 amostras em janela (semelhante não é o mesmo). Olhe para X kk na etapa de atualização, ele pega o valor anterior e adiciona a ele uma versão ponderada da amostra atual. Você pode pensar, bem, o que acontece com o ruído? Por que ele não é suscetível ao mesmo problema que a média de janelas com um pequeno tamanho de amostragem? Porque o filtro kalman leva em conta a incerteza de cada medição. O valor de ponderação K (ganho de kalman) pode ser considerado como uma razão entre a covariância (incerteza) de sua estimativa e a covariância (incerteza) da estimativa atual (na verdade, é o residual, mas é mais fácil pensar dessa forma) . Portanto, se a última medição tiver muita incerteza, K diminui e, portanto, a amostra mais recente reproduz um rolamento menor. Se a última medição tiver menos incerteza do que a previsão, k aumenta, e agora as novas informações terão um papel maior na próxima estimativa. Portanto, mesmo com um pequeno tamanho da amostra, o filtro kalman ainda está bloqueando muito o ruído. De qualquer forma, espero que responda a pergunta window vs kalman janela agora respondida 18 fev 15 at 3:34 Outro take: O filtro de Kalman permite adicionar mais informações sobre como o sistema que você está filtrando funciona. Em outras palavras, você pode usar um modelo de sinal para melhorar a saída do filtro. Claro, um filtro de média móvel pode dar resultados muito bons quando você está esperando uma saída próxima a constante. Mas assim que o sinal que você está modelando é dinâmico (pense em medições de fala ou posição), então o filtro de média móvel simples não mudará rápido o suficiente (ou nada) comparado com o que o Filtro de Kalman fará. O filtro de Kalman usa o modelo de sinal, que captura seu conhecimento de como o sinal muda, para melhorar sua saída em termos da variação da verdade. respondeu 18 de fevereiro de 15 às 13: 11Tive tentando entender os filtros de Kalman. Aqui estão alguns exemplos que me ajudaram até agora: eles usam o algoritmo para estimar uma voltagem constante. Como poderia usar um filtro de Kalman para isso ser melhor do que apenas manter uma média em execução? Estes exemplos são apenas casos de uso simplificados do filtro (Se sim, o que é um exemplo onde uma média de execução não é suficiente) Por exemplo, considere o seguinte programa Java e saída . A saída de Kalman não corresponde à média, mas eles estão muito próximos. Por que escolher um sobre o outro SIM é um exemplo simplista demais, mais enganoso do que educar. Em caso afirmativo, o que é um exemplo em que uma média de execução não é suficiente Qualquer caso em que o sinal está mudando. Imagine o veículo em movimento. Calculando médias significa que assumimos o valor do sinal a qualquer momento para ser igualmente importante. Obviamente está errado. A intuição diz que a última medição é mais confiável que a de uma hora antes. Um exemplo muito bom para experimentar é da forma frac. Tem um estado, então as equações não se complicam. Em tempo discreto, poderia ser assim: Existe o código que o usa (Sinto muito o seu Matlab, eu não usei Python recentemente): Existem algumas dicas: Sempre defina Q e R maiores que zero. O caso Q 0 é um exemplo MUITO RUIM. Você diz ao filtro: não há perturbação agindo na planta, então, depois de um tempo, o filtro acreditará apenas em suas previsões baseadas no modelo, em vez de observar as medições. Matematicamente falando Kk a 0. Como sabemos, os modelos não descrevem a realidade perfeitamente. Experimente com alguma imprecisão de modelo - modelError Altere a suposição inicial do estado (xpost (1)) e veja quão rápido ele converge para diferentes Q, R e Ppost inicial (1) Verifique como o ganho de filtro K muda com o tempo dependendo de Q e R respondeu outubro 3 12 at 22:37 Na verdade, eles são a mesma coisa em certo sentido, vou mostrar o seu algo por trás do filtro de Kalman e você ficará surpreso. Considere o seguinte problema mais simples de estimativa. Nós recebemos uma série de medidas z1, z2, cdots, zk, de uma constante desconhecida x. Assumimos que o modelo aditivo começa com zi x vi, i1,2, cdots, k (1) e onde vi são ruídos de medição. Se nada mais for conhecido, então todos concordarão que uma estimativa razoável de x dadas as k medições pode ser dada a partir de agora. Podemos agora reescrever acima do eq. (2) por simples manipulação algébrica para começar k hat frac (zk-hat) (3) fim Eq. (3) que é simplesmente Eq. (2) expresso em forma recursiva tem uma interpretação interessante. Ele diz que a melhor estimativa de x após a medição k é a melhor estimativa de x após as medições k-1 mais um termo de correção. O termo de correção é a diferença entre o que você espera medir com base na medição k-1, ou seja, e o que você realmente mede zk. Se rotularmos a correção de frac como Pk, então, novamente, a manipulação algébrica pode escrever a forma recursiva de Pk como começar PkP-P (P 1) P Acredite ou não, as equações (3-4) podem ser reconhecidas como a filtragem de Kalman. equações para este caso simples. Qualquer discussão é bem-vinda. Para dar um pouco de sabor, veja esta lista de livros: Eu tenho GrewalAndrews com MatLab, também GrewalWeillAndrews sobre GPS. Esse é o exemplo fundamental, GPS. Aqui está um exemplo simplificado, eu entrevistei para um trabalho onde eles estavam escrevendo software para manter o controle de todos os caminhões entrando e saindo de um enorme pátio de entregas, para o Walmart ou algo parecido. Eles tinham dois tipos de informação: com base em colocar um dispositivo RFID em cada caminhão, eles tinham informações muito boas sobre a direção de cada caminhão com medições possíveis muitas vezes por segundo, mas acabaram crescendo em erro, assim como qualquer aproximação ODE. Em uma escala de tempo muito mais longa, eles poderiam ter a posição GPS de um caminhão, o que dá uma boa localização imparcial, mas tem uma grande variação, você obtém posição dentro de 100 metros ou algo assim. Como combinar estes É o principal uso do filtro de Kalman, quando você tem duas fontes de informação, dando tipos de erro aproximadamente opostos. Minha idéia, que eu teria dito a eles se eles tivessem me pago, era colocar um dispositivo em cada semi onde a cabine encontra o trailer, dando o raio de viragem atual. Isso poderia ter sido integrado para fornecer informações muito curtas sobre a direção que o caminhão estava tomando. Bem, isso é o que eles fazem com quase tudo em movimento hoje em dia. Aquele que eu achava bonito era fazendas na Índia, mantendo o controle de onde os tratores estavam. O corpo em movimento não precisa se mover rapidamente para trazer as mesmas questões. Mas, claro, o primeiro grande uso foi o projeto Apollo da NASA. Meu pai conheceu Kalman em algum momento. Papai trabalhou principalmente na navegação, inicialmente mísseis para o Exército, posteriormente submarinos para a Marinha. O que é isso? Resposta: O filtro de Kalman é útil para rastrear diferentes tipos de objetos em movimento. Foi inventado originalmente por Rudolf Kalman na NASA para rastrear a trajetória da espaçonave. No fundo, o filtro de Kalman é um método de combinar medições e previsões ruidosas (e possivelmente ausentes) do estado de um objeto para obter uma estimativa do seu verdadeiro estado atual. Os filtros de Kalman podem ser aplicados a muitos tipos diferentes de sistemas dinâmicos lineares e o 8220state8221 aqui pode se referir a qualquer quantidade mensurável, como a localização, velocidade, temperatura, voltagem ou uma combinação desses objetos. Em um artigo anterior, mostrei como a detecção de faces pode ser executada no MATLAB usando o OpenCV. Neste artigo, combinarei esse detector de rosto com um filtro de Kalman para criar um rastreador de rosto simples que possa rastrear um rosto em um vídeo. Se você não estiver familiarizado com os filtros de Kalman, sugiro que você leia primeiro como funcionam os filtros alpha alpha. Eles são uma versão simplificada do filtro de Kalman que são muito mais fáceis de entender, mas ainda aplicam muitas das principais idéias do filtro de Kalman. Rastreamento de rosto sem um filtro de Kalman O detector de face baseado em OpenCV pode ser aplicado a todos os quadros para detectar a localização do rosto. Como ele pode detectar várias faces, precisamos de um método para encontrar a relação entre uma face detectada em um quadro e outra face no próximo quadro. 8212 esse é um problema combinatório conhecido como associação de dados. O método mais simples é a abordagem de vizinhos mais próximos, e alguns outros métodos podem ser encontrados neste artigo de pesquisa sobre rastreamento de objetos. No entanto, para simplificar bastante o problema, o rastreador que eu implementei é um único rastreador de face e assume que há sempre um rosto no quadro. Isso significa que todo rosto detectado pode ser considerado o mesmo rosto de uma pessoa. Se mais de um rosto for detectado, somente o primeiro rosto será usado. Se nenhum rosto for detectado, será considerado um erro de detecção. O código MATLAB abaixo irá detectar a localização da face em uma sequência de imagens e exibir as coordenadas da caixa delimitadora em um arquivo CSV. Podemos então executar o nosso detector de rosto e gerar um arquivo de saída, faces. csv. assim: No vídeo abaixo, executei este script no banco de dados do FGnet Talking Face (que é gratuito para download) e exibi as caixas delimitadoras sobrepostas na seqüência de imagens. Você pode baixar uma cópia do arquivo faces. csv que foi usado para gerar o vídeo a partir daqui. A caixa delimitadora segue aproximadamente o rosto, mas sua trajetória é bastante ruidosa e o vídeo contém numerosos quadros onde a caixa delimitadora desaparece porque o rosto não foi detectado. O filtro de Kalman pode ser usado para suavizar essa trajetória e estimar a localização da caixa delimitadora quando o detector facial falhar. Filtragem de Kalman: Os detalhes corajosos O filtro de Kalman é um filtro recursivo de dois estágios. Em cada iteração, ele executa uma etapa de previsão e uma etapa de atualização. A etapa de previsão prevê a localização atual do objeto em movimento com base em observações anteriores. Por exemplo, se um objeto está se movendo com aceleração constante, podemos prever sua localização atual, com base em sua localização anterior, usando as equações de movimento. A etapa de atualização toma a medida da localização atual do objeto8217s (se disponível), e combina isso com a localização atual prevista, para obter uma localização atual estimada a posteriori do objeto,. As equações que governam o filtro de Kalman são dadas abaixo (tiradas do artigo da Wikipédia): Estágio de previsão: Estágio previsto (a priori): Previsto (a priori) covariância de estimativa: Estágio de atualização: Inovação ou residual de medição: Inovação (ou residual) : Ótimo ganho de Kalman: Atualizado (a posteriori) estimativa de estado: Atualizado (a posteriori) estimativa de covariância: Eles podem ser difíceis de entender no início, então vamos ver o que cada uma dessas variáveis ​​é usada: é o estado atual vetor, como estimado pelo filtro de Kalman, no momento. é o vetor de medição tirado no momento. mede a precisão estimada no tempo. descreve como o sistema se move (idealmente) de um estado para o seguinte, isto é, como um vetor de estado é projetado para o seguinte, assumindo que nenhum ruído (por exemplo, sem aceleração) define o mapeamento do vetor de estado para o vetor de medição. e definir o processo gaussiano e o ruído de medição, respectivamente, e caracterizar a variância do sistema. e os parâmetros de entrada de controle são usados ​​apenas em sistemas que possuem uma entrada que pode ser ignorada no caso de um rastreador de objetos. Observe que em um sistema simples, o estado atual e a medição conterão o mesmo conjunto de variáveis ​​de estado (somente uma versão filtrada de) e será uma matriz de identidade, mas muitos sistemas do mundo real incluirão variáveis ​​latentes que não são medido diretamente. Por exemplo, se estivermos rastreando a localização de um carro, poderemos medir diretamente sua localização a partir de um dispositivo GPS e sua velocidade a partir do velocímetro, mas não sua aceleração. No estágio de previsão, o estado do sistema e sua covariância de erro são transferidos usando a matriz de transição definida e podem ser implementados no MATLAB da seguinte forma: No estágio de atualização, primeiro calculamos a diferença entre os estados previstos e medidos. Calculamos então a matriz de ganho de Kalman, que é usada para ponderar entre nossos estados preditos e medidos e é ajustada com base em uma razão de erro de predição para o ruído de medição. Por fim, o vetor de estado e sua covariância de erro são atualizados com o estado medido. Pode ser implementado em MATLAB como: Ambos os estágios atualizam apenas duas variáveis:, a variável de estado e a variável de covariância de erro de predição. Os dois estágios do filtro correspondem ao modelo de espaço de estados tipicamente usado para modelar sistemas dinâmicos lineares. O primeiro estágio resolve a equação do processo: O ruído do processo é aditivo ruído branco gaussiano (AWGN) com média zero e covariância definido por: O segundo é a equação de medição: O ruído de medição também é AGWN com média zero e covariância definida por: o sistema Para implementar um filtro de Kalman, temos que definir várias variáveis ​​que modelam o sistema. Temos que escolher as variáveis ​​contidas por e, e também escolher valores adequados para, e, assim como um valor inicial para. Definiremos nosso vetor de medidas como: onde e os cantos superior esquerdo e inferior direito da caixa delimitadora em torno do rosto detectado, respectivamente. Esta é simplesmente a saída do detector facial de Viola e Jones. Uma escolha lógica para nosso vetor de estado é: onde e os derivados de primeira ordem. Outros vetores também são possíveis, por exemplo, alguns documentos introduzem uma variável 8220scale8221, que assume que a caixa delimitadora mantém uma proporção fixa. A matriz de transição define as equações usadas para fazer a transição de um vetor de estado para o próximo vetor (sem levar em consideração nenhuma medida). Ele está conectado à equação do processo: Let8217s observa algumas equações básicas que descrevem o movimento: Podemos expressar esse sistema usando a seguinte recorrência: Essas mesmas equações também podem ser usadas para modelar as variáveis ​​e suas derivadas. Voltando à equação do processo, podemos modelar este sistema como: A matriz de ruído do processo mede a variabilidade do sinal de entrada para longe das transições 8220ideal8221 definidas na matriz de transição. Valores maiores nesta matriz significam que o sinal de entrada tem maior variação e o filtro precisa ser mais adaptável. Valores menores resultam em uma saída mais suave, mas o filtro não é tão adaptável a grandes alterações. Isso pode ser um pouco difícil de definir e pode exigir um ajuste fino. Com base em nossa definição do ruído de medição acima, nossa matriz de ruído de processo é definida como: A matriz de medição é mapeada entre nosso vetor de medição e o vetor de estado. Ele está conectado à equação de medida: As variáveis ​​e são mapeadas diretamente de para, enquanto as variáveis ​​derivadas são variáveis ​​latentes (ocultas) e, portanto, não são medidas diretamente e não são incluídas no mapeamento. Isso nos dá a matriz de medição: A matriz define o erro do dispositivo de medição. Para um instrumento físico, como um velocímetro ou voltímetro, a precisão da medição pode ser definida pelo fabricante. No caso de um detector de rosto, podemos determinar a precisão empiricamente. Por exemplo, podemos descobrir que nosso detector facial de Viola e Jones detecta rostos dentro de 10 pixels da localização real da face 95 do tempo. Se assumirmos que esse erro é distribuído por Gauss (que é uma exigência do filtro de Kalman), isso nos dá uma variação de 6,5 pixels para cada uma das coordenadas, então o vetor de ruído de medição é dado por: Diminuindo os valores em médias nós estamos otimisticamente assumindo que nossas medições são mais precisas, então o filtro executa menos suavização e o sinal previsto seguirá o sinal observado mais de perto. Por outro lado, o aumento significa que temos menos confiança na precisão das medições, portanto, mais suavização é realizada. A matriz de covariância estimada é uma medida da precisão estimada no tempo. Ele é ajustado ao longo do tempo pelo filtro, portanto, precisamos fornecer apenas um valor inicial razoável. Se soubermos com certeza a variável de estado exata na inicialização, poderemos inicializar em uma matriz de todos os zeros. Caso contrário, deve ser inicializado como uma matriz diagonal com um grande valor ao longo da diagonal: onde. O filtro preferirá as informações das primeiras medições sobre as informações já existentes no modelo. Implementando o rastreador de rostos O script a seguir implementa o sistema que definimos acima. Ele carrega os resultados de detecção de face do arquivo CSV, executa a filtragem de Kalman e exibe as caixas delimitadoras detectadas. Os resultados da execução deste script são mostrados no vídeo a seguir: Claramente, podemos ver que este vídeo tem uma caixa delimitadora mais suave e precisa do que a versão não filtrada mostrada anteriormente, e o vídeo não tem mais quadros com detecções ausentes. Comentários finais No futuro, pretendo escrever um artigo sobre o filtro de Kalman estendido (EKF) e o filtro de Kalman sem perfume (UKF) (e o filtro de partículas similar). Estas são ambas as versões não lineares do filtro de Kalman. Embora os rastreadores de rostos geralmente sejam implementados usando o filtro linear de Kalman, as versões não lineares têm algumas outras aplicações interessantes no processamento de imagens e sinais. Oi alister. bom tutorial. Finalmente, aprendi algo novo sobre o filtro kalman. Eu tenho uma pergunta, estou planejando combinar este filtro kalman com o meu projeto de detecção humana HOG. Você acha que é possível e eu quero perguntar sobre o parâmetro R, aqui você afirma que R eye (4) 42.25. É sempre constante para objetos diferentes, por exemplo, o corpo humano ou este valor é apenas para a parte do rosto? Olá alister, eu quero saber como você calcula a matriz Q Eu realmente não entendo isso. Olá, obrigado pelas postagens, acabei de encontrar este blog hoje e acho que você tem as informações que estou pesquisando sobre minha dissertação. Estou trabalhando de filtro kalman para rastreamento facial. Eu realmente não tenho muita idéia sobre o filtro kalman e ficaria feliz se você pudesse me colocar nele. realmente precisa do seu guia sobre como proceder. no entanto, desejo implementá-lo com o MATLAB. Ficarei muito feliz se puder voltar para mim. Olá, Muito obrigado por este maravilhoso relatório e implementação. Eu queria saber se você poderia explicar um pouco mais a escolha da matriz. Eu não vejo a relação entre as equações de movimento expressas antes. Por exemplo, o primeiro coeficiente do estado é calculado como: x dxt d2xt / 2 T Parece que há algum problema de unidade aqui, já que você está adicionando posição e velocidade juntos. Além disso, uma vez que você tenha a expressão do estado x, como você obtém a matriz Q Você argumenta com base na nossa definição do ruído de medição acima, nossa matriz de ruído de processo é definida como ... 8221. No entanto, qual é a relação entre o ruído de medição e a matriz do processo? Qual definição você se refere? Eu sinto que você deve basear isso na definição do ruído do processo. Agradecemos antecipadamente, Lucas

Comments