LusoRobótica - Robótica em Português

Robótica => Projectos de robótica => Tópico iniciado por: MAntunes em 24 de Novembro de 2016, 22:50

Título: Navegação Inercial
Enviado por: MAntunes em 24 de Novembro de 2016, 22:50
Boas pessoal,
tenho neste momento um projeto entre mãos que consiste em estimar a posição de um robot usando a informação de um IMU e posteriormente combinar essa informação com a dos encoders do robot.
Eu percebo toda a fisica que está por trás de todo o processo, mas depois de muita pesquisa não consigo encontrar um exemplo decente da melhor maneira para implementar. A leitura dos encoders não é problema para já, mas a integração das variáveis da aceleração e velocidade angular é que se estão a tornar complicadas. Se alguém pudesse dar umas dicas neste aspeto estaria muito agradecido.

Já agora, se alguém conhecer algum artigo do género "Filtro de Kalman para totós" também agradecia.

Estou livre para responder a qualquer dúvida.
Cumps,
Miguel
Título: Re: Navegação Inercial
Enviado por: ralex em 25 de Novembro de 2016, 00:34
Boa noite a todos.
Verifica estes links... talvez ajudem um pouco...

http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies (http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies)

http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/ (http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/)

https://home.wlu.edu/~levys/kalman_tutorial/ (https://home.wlu.edu/~levys/kalman_tutorial/)

http://www.instructables.com/id/Guide-to-gyro-and-accelerometer-with-Arduino-inclu/ (http://www.instructables.com/id/Guide-to-gyro-and-accelerometer-with-Arduino-inclu/)

http://stanford.edu/class/ee267/lectures/lecture11.pdf (http://stanford.edu/class/ee267/lectures/lecture11.pdf)

Cumps.
Título: Re: Navegação Inercial
Enviado por: KammutierSpule em 25 de Novembro de 2016, 09:40
Quando tiveres resultados dessa black magic partilha aqui no forum!
Título: Re: Navegação Inercial
Enviado por: senso em 25 de Novembro de 2016, 11:08
Um filtro da Kalman pode ser tão simples quanto:
out = var*a + var2*(1-a);

a é uma variavel(para simplificar) float que varia de 0 a 1 e que é basicamente uma percentagem, ou seja, se a for 0.3 estás a dar um peso de 30% á variavel var e um peso de 70% á var2.
Tal como um PID que no papel é uma confusão tremenda de sopa de alfabeto grego em código são literalmente uma duzia de linhas em C.
Basicamente aquela salsa de arrays é quanto tens um monte de variáveis.

Para fazeres a fusão do acelerómetro com o giro e magnetometro(caso tenhas) nada como o código do Sebastian Madgwick que é bastante mais leve/rápido que hardcore kalman e é utilizado em tudo quanto é código de controlo para multi-rotores:
http://x-io.co.uk/open-source-imu-and-ahrs-algorithms/ (http://x-io.co.uk/open-source-imu-and-ahrs-algorithms/)
Título: Re: Navegação Inercial
Enviado por: MAntunes em 25 de Novembro de 2016, 14:36
Obrigado a todos!
Vou dar uma leitura atenta a todos os artigos!

Espero conseguir resultados satisfatórios e no final certamente que mostrarei esses resultados!
Vou implementar tudo num PIC24F.
Título: Re: Navegação Inercial
Enviado por: metRo_ em 25 de Novembro de 2016, 21:19
Um filtro da Kalman pode ser tão simples quanto:
out = var*a + var2*(1-a);

Isso e' um filtro passa-baixo um filtro de kalman e' algo mais que isso e que para sistemas lineares te garante a estimacao optima do erro.... Mas sim, um filtro complementar pode ser suficiente. Existem imensos projectos e papers sobre a utilizacao de IMU em robots, procura por exemplo por pacotes de ROS de odometria.
Título: Re: Navegação Inercial
Enviado por: MAntunes em 27 de Novembro de 2016, 22:08
Obrigado mais uma vez.
Continuo sem encontrar nenhum paper que explique de maneira simples como fazer a integração das variaveis :/ tudo o que encontro é apenas sobre a orientação e o mais importante para mim é a posição..
Mas vou continuar à procura!

Edit: https://www.quora.com/How-do-I-implement-a-calculation-of-a-position-based-on-acceleration-measured-by-a-9DOF-IMU-with-sensor-fusion-in-C++ (https://www.quora.com/How-do-I-implement-a-calculation-of-a-position-based-on-acceleration-measured-by-a-9DOF-IMU-with-sensor-fusion-in-C++)
Encontrei essa resposta e parece-me um bom começo!
Não usa o giroscópio, mas penso que pelo mesmo raciocinio consigo obter a orientação.
Infelizmente na minha cadeira de Sensores Inteligentes não falamos de fusão de sensores, o que é um grande handicap  :-\
Título: Re: Navegação Inercial
Enviado por: artur36 em 27 de Novembro de 2016, 23:04
Precisas da orientação precisamente para calculares a posição.
Assumindo que começas numa posição conhecida usas a orientação é aceleração para ires calculando as variações relativas da posição
Título: Re: Navegação Inercial
Enviado por: senso em 28 de Novembro de 2016, 03:01
Mas depender de um IMU/acelerómetro para posição dá barraca depressa, porque acc tem ruido e é incerto, ao integrares duas vezes acc para teres posição em meia duzia de metros tens demasiado erro, precisas no minimo de encoders, idealmente gps á mistura.
Título: Re: Navegação Inercial
Enviado por: artur36 em 28 de Novembro de 2016, 08:00
N acho que seja impossível, dependendo da precisão que precisar. Se conhecer de antemão o mapa e puder cruzar os dados com por exemplo um sensor ultrasonico ou eventualmente tags em posições específicas pode ir corrigindo os erros de tempos a tempos.
Título: Re: Navegação Inercial
Enviado por: MAntunes em 19 de Dezembro de 2016, 19:46
Boas pessoal,
para este projeto irei usar a seguinte plataforma robótica: https://www.dfrobot.com/?route=product/product&product_id=555 (https://www.dfrobot.com/?route=product/product&product_id=555) com a seguinte placa: https://www.dfrobot.com/index.php?route=product/product&product_id=1232 (https://www.dfrobot.com/index.php?route=product/product&product_id=1232)
Surgiu então outro problema como comunicar entre todos os micro-controladores presentes.
Penso que ao ligar a plataforma à placa o barramento I2C está partilhada entre ambas sendo que aí não haverá grande problema de comunicação. Ligar tudo isto ao PIC24F que irei usar também não será grande problema pois também suporta I2C.
O problema é que segundo sei apenas pode haver um Master neste barramento, correto?
Estava a pensar em adquirir os dados do IMU e dos encoders no Arduino da plataforma, combina-los utilizando esta biblioteca: https://github.com/arduino-libraries/MadgwickAHRS (https://github.com/arduino-libraries/MadgwickAHRS) e por fim enviá-los para o PIC para fazer o tratamento de toda a informação e enviar ao utlizador. Acham que isto é minimamente fazivel?

Obrigado e cumprimentos!

EDIT: Existe alguma maneira de o PIC enviar um 'request' e o Arduino enviar uma string de dados predefinida?
Título: Re: Navegação Inercial
Enviado por: senso em 19 de Dezembro de 2016, 22:14
Ou tiras os Atmegas das duas placas e fazes código só para um chip...
Já fiz um robot com dois micros, e não vale a pena o tempo que perdes a fazer e debuggar código em 2 micros a interagirem entre si.
Título: Re: Navegação Inercial
Enviado por: MAntunes em 19 de Dezembro de 2016, 23:25
Pois, acho que o mais simples é mesmo tentar portar a biblioteca de Arduino para o PIC..
Título: Re: Navegação Inercial
Enviado por: senso em 19 de Dezembro de 2016, 23:37
De "biblioteca" tem muito pouco, só precisas de uma função..
Título: Re: Navegação Inercial
Enviado por: MAntunes em 04 de Janeiro de 2017, 16:52
Olá de novo.
Desculpem não ter dito mais nada, mas o tempo não tem sido muito.

@senso, concordo contigo.

Vou ter que usar mesmo o PIC24F e o Arduino.
Estou a pensar em adquirir todos os valores com o Arduino, fazer as contas e depois enviar tudo numa string para o PIC, fazer novamente umas contas e apresentar os valores.
Já tenho todos os valores, mas não estou a ver como concatenar tudo numa string e enviar por I2C.

Também já sei como ler a string no PIC. O professor forneceu uns exemplos interessantes.

Existe alguma função em que consiga enfiar floats, ints e tudo seguido numa string?
Título: Re: Navegação Inercial
Enviado por: senso em 04 de Janeiro de 2017, 17:11
sprintf é o que uso, sprintf e sscanf, ou strtok para separar em sub-strings depois para processar.
E prefiro usar tudo em ascii, é legivel a olho nu para debug e o over-head não é assim tão grande quanto isso.
Podes sempre enviar os floats em hex..

Não recomendo nadinha usar "arduino", porque vais ficar sem ram bem depressa que aquilo é alocar ram á parva para tudo e mais alguma coisa e depois dá barraca..
Título: Re: Navegação Inercial
Enviado por: MAntunes em 06 de Janeiro de 2017, 01:14
Obrigado @senso. Foi uma grande ajuda!
E infelizmente o Arduino neste projeto é um mal necessário :-\