Olá, estou criando uma espécie de pedômetro em uma pulseira com um acelerômetro MPU6050, e para isso estou contando com o seguinte código https://github.com/Perseus14/Pedometer/blob/master/Pedometer.ino. Consegui fazer o código funcionar, mas estou em dúvida no seguinte cálculo feito no algoritmo:

int mag = sqrt (pow (x - angle_x, 2) + pow (y - angle_y, 2) + pow (z - angle_z, 2)); (A)

Nessa linha de código que coloquei ele calcula o vetor de magnitude do sinal, mas para fazer esse cálculo x, y e z são equivalentes aos ângulos anteriores e ângulo_x, ângulo_y, ângulo_z são os atuais. Minha dúvida é em relação a essa subtração de valores, pois a fórmula de cálculo do vetor magnitude do sinal é a seguinte:

int mag = sqrt (pow (x, 2) + pow (y, 2) + pow (z, 2)); (B)

Alguém consegue entender por que os valores foram subtraídos na primeira fórmula (A) antes de calcular o vetor de magnitude do sinal?

Obrigado!

Exibições: 84

Responder esta

Respostas a este tópico

olá Darlan.

      A equação (B), é a "genérica" que usamos para calcular o "módulo" (ou amplitude absoluta) de um Vetor. Porém ela se refere às coordenadas (0,0,0) que seria a "origem" do Sistema de Coordenadas.  Seria como se tudo que se movesse, fosse medido em relação a um ponto comum a todos os objetos que se movem.

      Já a equação (A), é o cálculo incremental do "módulo". Ele se refere à amplitude em relação ao ponto anterior que o objeto estava. Isso permite calcular a velocidade e aceleração "momentânea" do objeto, bastando para isso que se conheça o intervalo de tempo entre a leitura da coordenada atual e a leitura da coordenada anterior. Então este é um valor mais realístico que permite várias conclusões sobre a velocidade e aceleração do objeto. Caso o intervalo de tempo entre as leituras seja muito pequeno (claro, isso é relativo), então pode-se dizer que a amplitude e consequentemente a velocidade e acelerações calculadas a partir da variação de amplitude, são valores instantâneos.

      Portanto, para a sua aplicação, e para a maioria, a equação (A) faz sentido, uma vez que se refere à amplitude do deslocamento em relação à posição anterior do objeto.

      E claro, dependendo da sua aplicação, vc precisará mensurar também o intervalo de tempo entre as leituras das coordenadas, caso precise calcular a velocidade e aceleração do objeto.

      Um detalhe:

              Observe que  não faz diferença a ordem da subtração em "pow (x - angle_x, 2)", ou seja poderia ser "pow (angle_x - x, 2)", ou em outras palavras, os sinais (+ ou -)  de "x" e de "angle_x" não alteram o resultado da amplitude, uma vez que esta subtração será elevada ao quadrado (isto é assim com qualquer cálculo de amplitude em matemática/física).  Se precisar analisar a direção/sentido do movimento, você deve calcular o "Produto Vetorial", aplicando o mesmo às coordenadas atual e anterior. Note que isto é a base para o cálculo do "Gradiente" do movimentoCaso queira saber mais sobre isso, aconselho estudar Geometria Analítica e Cálculo Vetorial, o que permitirá expandir sua visão e conhecimento relacionado.

      Abrçs,

      Elcids

Show de bola, muito obrigado Elcids! Você esclareceu muitas dúvidas! Muito Obrigado! 

Você conhece algum artigo ou livro em que eu possa estudar um pouco mais afundo sobre esse assunto?

Abraços!

Olá novamente Darlan.

      Eu sou muito formal em relação a conhecimentos técnicos e toda suba base (principalmente a Matemática e a Física).  Por isso te recomendei estudar "Geometria Analítica" e "Cálculo Vetorial". Pode parecer que não, mas estas áreas da Matemática são simples e nem são assuntos muito "densos".  Ocorre que caso vc não queira, não precisa se aprofundar nestes assuntos, ficando restritos a casos particulares como "análise de movimentos".  Quando estudamos isso em Matemática,  estudamos de forma genérica, de forma que se possa aplicar os mesmos conhecimentos a diversas áreas (movimento, energia, eletricidade e eletro-magnetismo, fluidos, e até mesmo criação de Imagens em Vídeo Games).

      Até onde estudar, vai depender do que vc precisa fazer. Em programação, muitas Interfaces fazem este trabalho para quem usa as Bibliotecas. Então isso tudo (o que conhecer) é muito relativo, e depende das necessidades de cada um.

      Um problema que vejo, é que muitos dessas áreas são ensinadas sem informar objetivos concretos, e esse ensino conta com a "intuição natural" de quem está aprendendo (o que eu considero uma falha imensa). Em outras palavras,  poderiam ensinar dizendo para quem está estudando, onde esta pessoa poderá chegar, e o que ela poderá conseguir com aqueles conhecimentos. E isso deveria ser feito antes de se ensinar (ou então antes de cada nova etapa do aprendizado). Não é bom para ninguém que está aprendendo algo,  que não se saiba as consequências daquele aprendizado. Mas isso é um problema da Metodologia de Ensino (e claro, um assunto muito "profundo" em Pedagogia).

      Se vc pesquisar no Google sobre "Geometria Analítica e Cálculo Vetorial", irá encontrar muita matéria, inclusive de várias Universidades Federais.

      Esse assunto é a base para diversas outras disciplinas exatas e por isso mesmo é ensinado no primeiro semestre do curso de Engenharia (pelo menos era, quando fiz Engenharia Elétrica a 32 anos atrás,  e eu era fascinado por essa área da Matemática porque além do conhecimento que ela te traz ela também "abre" sua mente e sua "visão das coisas"). Mas como eu disse, vá até onde vc precisar ou até onde seus instintos te guiarem.

     Abrçs,

    Elcids

Entendi, Muito Obrigadooo Elcids!

Outra coisinha rsrsrss, eu poderia fazer esse mesmo calculo para a aceleração? Por exemplo, poderia calcular o vetor de magnitude do sinal (SVM) da aceleração da seguinte forma?

int SVM = sqrt(pow(acc_x_previous - acc_x_current, 2) + pow(acc_y_previous - acc_y_current, 2), pow(acc_z_previous - acc_z_current, 2));

Matematicamente isso é possível?

Abraços,

Desculpa incomodá-lo novamente rsrsrs.

sim vc pode. Mas veja:

      No caso da Aceleração (e vale também para a velocidade),  já está implícito que tanto o valor "acc_x_previous" como o "acc_x_current" foram calculados já considerando um intervalo de tempo "dt" (um "delta t", ou mais corretamente "diferencial de tempo").  Assim qualquer interpretação do resultado do cálculo da magnitude da Aceleração usando essa equação que vc postou, deve considerar este intervalo de tempo. Não sei qual Taxa de Amostragem vc está usando para a leitura dos dados do Acelerômetro, mas se o intervalo de tempo  entre as leituras (a amostragem) for suficientemente pequeno (como eu disse anteriormente, isso é relativo),  vc poderá interpretar a magnitude da Aceleração calculada dessa forma,  como sendo a "aceleração instantânea" do objeto. A mesma interpretação vale para velocidade.

      Então o importante nesse caso, é saber o intervalo de tempo  entre as amostras (esse intervalo é o inverso da Taxa de Amostragem em Hz), e assim interpretar corretamente o resultado do cálculo considerando esse "dt".

      Ah sim,  quase me esqueço:   cuidado, pois o intervalo de tempo que vc faz as leituras,  poderá  ser  diferente  do intervalo resultante da "verdadeira" Taxa de Amostragem  do Acelerômetro.  Assim, sempre use o intervalo de tempo  entre as suas leituras (e "esqueça" a Taxa de Amostragem "real" do Sensor).

      Abrçs,

      Elcids

Entendi, muito obrigado!

Abraços!

Ok.

veja a consideração que acrescentei no final do post anterior, sobre usar o intervalo de tempo  entre suas leituras do Acelerômetro, pois isto é muito importante.

      Abrçs,

      Elcids

Bom dia Darlan,

Acho importante  você estudar também as informações sobre o sensor, fornecidas pelo fabricante:

https://invensense.tdk.com/products/motion-tracking/6-axis/mpu-6050/

https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Data...

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2020   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço