Pessoal, bom dia! Alguém já implementou alguma função para calcular distância entre coordenadas?! Tipo, deixo salvo uma coordenada no programa, fico lendo o GPS, e calculando a distância do ponto pré determinado, quando chegar perto dispara uma ação!

Achei alguns exemplos em java, php, etc. na internet, traduzi para o arduino mas pelo visto não funcionou não!

Alguém já fez ou viu isso!?

Exibições: 3466

Responder esta

Respostas a este tópico

Olá Márcio

Estou fazendo algo parecido , uso as coordenadas do GPS para calcular os angulos de apontamento de uma antena parabólica, para um determinado satélite, e um sistema de servo mecanismo para acionar a antena. O que posso dizer sobre este assunto é que o microcontrolador utilizado deve ter capacidade de calculo razoavel, fiz  com barrramento de 8 bits mas já conclui que 16 a 32 bits é o ideal, não posso lhe dizer se linguagem java é boa para a solução de equações trigonométricas que é o caso em questão. Tenho feito em  C e vou tentar agora com o Bascom-AVR.

Olá Marcio,

Segue formula para o calculo da distancia entre dois pontos da terra. O cálculo tem duas restrições:

- A terra é considerada uma esfera perfeita.

- Não existem elevações (positivas ou negativas) entre os dois pontos.

A formula baseia-se no método ‘Haversine’ o qual funciona legal tanto para grandes distancias quanto para as pequenas.

a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c  

Aonde R é o radio da terra (radio medio = 6.371km);
note que os ângulos precisam estar em radianos antes de ser colocados nos cálculos.

 

Segue implementação em  Java:

 

var R = 6371; // km

var dLat = (lat2-lat1).toRad();

var dLon = (lon2-lon1).toRad();

var lat1 = lat1.toRad();

var lat2 = lat2.toRad();

 

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +

        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);

var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c;

Esse calculo pode ser feito por qualquer microcontrolador, porem vai precisar de duas camadas de calculo intermediario, já que os microcontroladores trabalham com numeros inteiros. A primeira camada e a camada de punto flutuante, a segunda camada é a camada de calculos trigonometricos e é ai, que o microcontrolador pode ficar lento. A quantidade de bits de processamento não é o problema mais sim a velocidade do cálculo, mais ainda, se você precisa fazer os calculos em tempo real num veiculo controlado. O que pode acontecer é que quando o microcontrolador terminar o calculo, o veiculo pode não estar mais na posição em que o calculo deu inicio.

Boa sorte,


Samuel

Joe e Samuel, boa noite! Obrigado pelas respostas! Estou usando o TinyGPS, e ele já tem implentado o calculo entre pontos.. muito bom!!! Joé, não sei se é pela aplicação que estou usando, mas funciona perfeitamente, e o cálculo não fica muito lento não...

Olá Marcio !

Fico contente em saber que vc já resolveu seu problema, o meu é que estou trabalhando com resolução de 12 bits a precisão especificada é de 0,1 Graus, nos eixos de saída, e são tres equações a serem resolvidas após os dados serem adquiridos do GPS, Uma para elevação outra para azimute e uma terceira para a polarização, feito isto ai então é o o microcontrolador vai comandar o servomecanismo, ainda estou trabalhando com 8 bits com o PIC 18F4550, mas já estou separando os calculos para um microcontrolador dedicado só para isto, um AVR.

Qual a precisão que vc necessita ?

Muito boa a explicação do Samuel, gostaria de aproveitar a oportunidade e perguntar para o Samuel ...Olá Samuel, como faço para dividir o calculo em duas camadas ?

No meu caso o problema não esta só no tempo de calculo e tb no espaço fisico que o firmware toma na memória de programa.

Abraços a todos.

Olá Joe,

No processamento repetitivo de calculos eu geralmente trabalho em assembly, e com isso consigo um desempenho melhor.

Qual é o processador que você esta usando?

Samuel

 

Olá Samuel

 

O PIC,  18F4550, o problema maior que vejo no momento são as conversões de no. inteiros para ponto flutuante e vice versa toma muitas instruções do PIC, Qual algoritimo vc usa para calculos trigonometricos, em assembler,  O CORDIC ?

 

Abraços

 

Joe

 

 

Olá Joe,

Sim eu uso o Cordic.

Para esse tipo de requerimentos (calculos com ponto flutuante, trigonometricos, FFT, filtros, etc) eu optei por utilizar um DSP (da Freescale), o mesmo tem um custo baixo e o mais interessante, conta com a instrução MAC en assembler e ciclos 'do' implementados em hardware, o que facilita bastante a implementação dos algoritmos aritmeticos, alem de contar com uma RAM de duas portas, o que permite o acesso simultaneo da memoria por dois elementos (CPU-CPU ou CPU-DMA).

Abraços,

Samuel

 

Ola Samuel !

 

Estou desenvolvendo um protótipo conforme ja comentei acima, e no momento necessito mais é testar os conceitos eletromecânicos, que já estão montados e funcionando, quando eu for detalhar a IHM, interface homem-máquina, para transformar a idéia em produto industrial, gostaria de contar com sua colaboração se for possível, e se for de seu interesse, me  de um e-mail para contato ou telefone. Não será tão sofisticada a ponto de necessitar de DMA, mais uma coisa com uma tela de  visual bonito fica mais atraente...

 

Abraços

 

Joe

Distância geodésica, certo?

Eu já fiz esses cálculos, mas considerei um raio médio da Terra, ou seja, calculei uma aproximação da distância geodésica entre duas coordenadas geográficas.

Montei um .doc disso, mas não sei se te ajuda.

Joé, valeu pelo retorno!!! Cara, o que você está fazendo está bem além da minha aplicação! rs.. Bem mais simples,  o que estou querendo, precisão? alguns metros! rs..

 

É ..ja tenho um tempão investido nisso...rsrsrs, Mas se vc precisa de metros de precisão vc necessitara de um DGPS (Link), O colega Carlos Renato tb ja andou pensando nisso, gostaria de deixar uma pergunta aqui para ele, Carlos vc já tem ou ja sabe algo quanto a relação entre a velocidade e a precisão (rms) do rumo dado pelo GPS, principalmente em velocidades abaixo de 20km/h ?

 

Abraços a todos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço