Mudanças entre as edições de "Fundamentação Teórica do Projeto - O Sistema GPS e métodos para cálculo de área e distância"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(12 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 30: Linha 30:
  
 
Independente do método utilizado, é possível obter a exatidão da medida da localização lendo o valor da variável <tt>LocationSensor1.Accuracy</tt>.  Usando um conjunto maior de aquisições da localização em um mesmo ponto é possível melhorar a precisão da medição usando uma média de valores.
 
Independente do método utilizado, é possível obter a exatidão da medida da localização lendo o valor da variável <tt>LocationSensor1.Accuracy</tt>.  Usando um conjunto maior de aquisições da localização em um mesmo ponto é possível melhorar a precisão da medição usando uma média de valores.
 +
 +
=Como calcular a média de N valores=
 +
A média de valores é um conceito simples, mas que na programação pode implementada de diferentes formas.  Considere o caso em que se deseja fazer a média de um conjunto de valores <math> \left [ x_1,  x_2,  x_3,  ..., x_N \right ] </math>.
 +
==Método 1==
 +
O método direto consiste em somar os valores e dividir a soma pelo número de valores do conjunto.
 +
 +
<math>x_{med} = \left [ x_1 + x_2 + x_3 + ... + x_N \right ] / N </math>
 +
 +
Este método exige que os valores de x1 a xN estejam todos disponíveis para o cálculo.
 +
 +
==Método 2==
 +
 +
O método iterativo, calcula a média a medida que novos valores são obtidos. Para o cálculo da media de N pontos, segue-se o seguinte método:
 +
;1º passo: Calcula-se a média dos 2 primeiros valores <math>x_{med} = \left [ x_1 + x_2 \right ] / 2</math>, e em seguida guarda-se o número de valores <math>N = 2</math> e o valor da média atual <math>x_{med}  </math>.
 +
;2º passo: A cada novo valor <math>x_N  </math>, calcula-se a média usando a média anterior <math>x_{med}</math> e o novo valor : <math>x_{med} = \left [ x_N + (x_{med} * N) \right ] / (N+1)</math>  e em seguida guarda-se o número de pontos N = N + 1 e o novo valor da média. Este passo é repetido a cada novo valor.
 +
 +
Neste caso a necessidade de armazenamento de valores se reduz a 2 valores (<math>x_{med}  </math> e  <math>N</math>).
  
 
=Como calcular a distância entre dois pontos=
 
=Como calcular a distância entre dois pontos=
Linha 47: Linha 64:
 
<math> x_i =  R \ \cos \phi_i \ \cos \lambda_i \,</math>
 
<math> x_i =  R \ \cos \phi_i \ \cos \lambda_i \,</math>
  
<math> y_i =  R \ \sin \phi_i \ \sin \lambda_i \,</math>
+
<math> y_i =  R \ \cos \phi_i \ \sin \lambda_i \,</math>
  
 
<math> z_i =  R \ \sin \phi_i \,</math>
 
<math> z_i =  R \ \sin \phi_i \,</math>
Linha 60: Linha 77:
  
 
=Como calcular a área de um triângulo=
 
=Como calcular a área de um triângulo=
Veja os possíveis métodos no site [http://mathworld.wolfram.com/TriangleArea.html Wolfram Mathword].
+
 
 +
==[http://es.wikipedia.org/wiki/F%C3%B3rmula_de_Her%C3%B3n Fórmula de Heron]==
 +
 
 +
A fórmula de Herón permite calcular a área de qualquer triangulo conhecendo-se o comprimento dos seus 3 lados <math> d_1, d_2, d_3 </math>:
 +
:<math>\acute{A}rea = \sqrt{s\left(s-d_1\right)\left(s-d_2\right)\left(s-d_3\right)}</math>
 +
 
 +
onde s é o semiperimetro do triangulo:
 +
:<math>s = \frac{d_1+d_2+d_3}{2}</math>
 +
 
 +
Veja outros possíveis métodos no site [http://mathworld.wolfram.com/TriangleArea.html Wolfram Mathword].
 +
 
 
=Campo de Experimentos PJI1=
 
=Campo de Experimentos PJI1=
 
No pátio do estacionamento do IF-SC estão marcados 3 pontos que formam um triângulo (P1,P2,P3). Estes pontos servem de referência inicial para a verificação de funcionamento dos sistemas desenvolvidos no PJI1. As latitudes e longitudes desses pontos com medição através do GPS Garmim 76CSx, resultaram em:
 
No pátio do estacionamento do IF-SC estão marcados 3 pontos que formam um triângulo (P1,P2,P3). Estes pontos servem de referência inicial para a verificação de funcionamento dos sistemas desenvolvidos no PJI1. As latitudes e longitudes desses pontos com medição através do GPS Garmim 76CSx, resultaram em:
Linha 68: Linha 95:
 
   
 
   
 
A medida da distância entre os pontos usando uma trena de fibra resultou na distância de:
 
A medida da distância entre os pontos usando uma trena de fibra resultou na distância de:
:d(P1,P2) = 27,00 m2
+
:d(P1,P2) = 27,00 m
:d(P1,P3) = 22,30 m2
+
:d(P1,P3) = 22,30 m
:d(P2,P3) = 20,65 m2
+
:d(P2,P3) = 20,65 m
  
 
Utilizando a fórmula de Heron obteve-se:
 
Utilizando a fórmula de Heron obteve-se:
Linha 82: Linha 109:
 
* [http://www.anycalculator.com/decimaltodegree.htm Convert Degrees Minutes Seconds to Decimal Degrees]
 
* [http://www.anycalculator.com/decimaltodegree.htm Convert Degrees Minutes Seconds to Decimal Degrees]
 
* [http://transition.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html/ Degrees, Minutes, Seconds and Decimal Degrees Latitude/Longitude Conversions]
 
* [http://transition.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html/ Degrees, Minutes, Seconds and Decimal Degrees Latitude/Longitude Conversions]
 
+
* [http://www.wolframalpha.com/input/?i=27.608417S+48.632750W localização e conversão de unidades] - Wolframalpha
<html>
+
* [http://www.wolframalpha.com/input/?i=27.608417S+48.632750W+to+27.608611S+48.632889W  Cálculo da distância Geodésica] - Wolframalpha
<div class="maincontent">
 
 
 
 
<script type="text/javascript" language="JavaScript">
 
 
 
<!-- Hide JavaScript from Java-Impaired Browsers
 
    var defaultEmptyOK = true;
 
    var decimalPointDelimiter = ".";
 
    function isDigit (c)
 
    {  return ((c >= "0") && (c <= "9")) }
 
    function isEmpty(s)
 
    {  return ((s == null) || (s.length == 0)); }
 
    function isFloat (s)
 
    {  var i;
 
        var seenDecimalPoint = false;
 
        if (isEmpty(s))
 
          if (isFloat.arguments.length == 1) return defaultEmptyOK;
 
          else return (isFloat.arguments[1] == true);
 
        if (s == decimalPointDelimiter) return false;
 
        for (i = 0; i < s.length; i++)
 
        {  var c = s.charAt(i);
 
              if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
 
              else if (!isDigit(c)) return false;
 
        }
 
        return true;
 
    }
 
    function isSignedFloat (s)
 
    {  if (isEmpty(s))
 
          if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
 
          else return (isSignedFloat.arguments[1] == true);
 
        else {
 
            var startPos = 0;
 
            var secondArg = defaultEmptyOK;
 
            if (isSignedFloat.arguments.length > 1)
 
                secondArg = isSignedFloat.arguments[1];
 
            if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
 
              startPos = 1;   
 
            return (isFloat(s.substring(startPos, s.length), secondArg))
 
        }
 
    }
 
    function warnInvalid (theField, s)
 
    {  theField.focus()
 
        theField.select()
 
        alert(s)
 
        return false
 
    }
 
              function convert(form) {
 
                with (form) {
 
                    if  (!(isSignedFloat (DEG.value))) {
 
                          warnInvalid (DEG, "Degrees need to be a Numerical value (Between 0 and 60) "); return false; }
 
                    if  (!(isSignedFloat (MIN.value))) {
 
                          warnInvalid (MIN, "Minutes need to be a Numerical value (Between 0 and 60) "); return false; }
 
                    if  (!(isSignedFloat (SEC.value))) {
 
                          warnInvalid (SEC, "Seconds need to be a Numerical value (Between 0 and 60) "); return false; }
 
                    if  (SEC.value > 60) {
 
                          warnInvalid (SEC, "Seconds need to be a Numerical value (Between 0 and 60) "); return false; }
 
                    if  (SEC.value < 0)  {
 
                          warnInvalid (SEC, "Seconds need to be a Numerical value (Between 0 and 60) "); return false; }
 
                    if  (MIN.value > 60) {
 
                          warnInvalid (MIN, "Minutes need to be a Numerical value (Between 0 and 60) "); return false; }
 
                    if  (MIN.value < 0) {
 
                          warnInvalid (MIN, "Minutes need to be a Numerical value (Between 0 and 60) "); return false; }
 
                    if (DEG.value < 0 ) {
 
                        output.value = (Math.ceil( ((DEG.value * 1) - (MIN.value / 60) - (SEC.value / 3600)) * 10000)) / 10000 ; }
 
                    else {   
 
                        output.value = (Math.floor( ((DEG.value * 1) + (MIN.value / 60) + (SEC.value / 3600)) * 10000)) / 10000; }     
 
      return false;
 
                    }
 
              }
 
// End Hiding -->
 
</script>
 
 
 
<form onsubmit="return convert(this)" action="">
 
<center>
 
<table border="1">
 
<tbody>
 
<tr>
 
<td align="center"><strong>&nbsp;&nbsp;&nbsp;&nbsp; Degrees Minutes Seconds to Decimal Degrees&nbsp;&nbsp; </strong></td></tr>
 
 
 
<tr>
 
<td valign="middle" align="center">
 
<p align="center">Degrees Minutes Seconds <input size="3" name="DEG">°&nbsp;<input size="3" name="MIN">'&nbsp;<input size="3" name="SEC">" </p></td></tr>
 
<tr>
 
<td valign="top" align="center"><input type="submit" value=" Click for Conversion "> <input type="reset" value=" Reset Values "></td></tr>
 
<tr>
 
<td valign="top" align="center"><input size="30" name="output"></td></tr></tbody></table></center></form>
 
 
 
 
</div>
 
</html>
 

Edição atual tal como às 14h40min de 6 de março de 2013

Como adquirir o sinal do GPS no Android

No projeto adicione o LocationSensor ao projeto, altere as propriedades desse objeto para Enabled [x] ProviderLocked [x] ProviderName gps em minusculo (pois GPS em maiúsculo não funciona)

Em seguida obtenha as medidas do GPS usando:

Método 1

Aguarde o disparo do evento when LocationSensor1.LocationChanged e utilize os valores retornados nas variáveis locais latitude, longitude e altitude.

  • Neste caso, cada vez que houver mudança na posição do GPS, um novo evento ocorre e novos dados de localização são recebidos. Esse método fornece poucas medidas do GPS mesmo quando a sua posição é alterada. Aparentemente após o disparo do evento o chip é desligado temporariamente.


Método 2

Para aumentar a velocidade das medições do GPS, inclua um Clock1 no projeto e configure as propriedades para disparar a cada 1 segundo, TimerAlwaysFires [x] TimerEnabled [x] TimerInterval 1000

Aguarde o disparo do evento when Clcck1.Timer e leia os valores das variáveis LocationSensor1.Latitude, LocationSensor1.Longitude e LocationSensor1.Altitude.

  • Neste caso, a cada segundo, independente de haver mudança na posição do GPS, um novo evento do timer ocorre e novos dados de localização são recebidos.
  • Note que mesmo sem alterar a posição do GPS os dados recebidos sofrem variação.

Método 3

Pode acontecer que no método 2 o chip não atualize os dados a cada leitura. Neste caso, após efetuar a leitura, é necessário desabilitar temporariamente o GPS LocationSensor1.Enable = False, e seguida habilita-lo LocationSensor1.Enable = True esperando novamente 1 segundo antes da próxima leitura

GPS-Met3.png

Independente do método utilizado, é possível obter a exatidão da medida da localização lendo o valor da variável LocationSensor1.Accuracy. Usando um conjunto maior de aquisições da localização em um mesmo ponto é possível melhorar a precisão da medição usando uma média de valores.

Como calcular a média de N valores

A média de valores é um conceito simples, mas que na programação pode implementada de diferentes formas. Considere o caso em que se deseja fazer a média de um conjunto de valores .

Método 1

O método direto consiste em somar os valores e dividir a soma pelo número de valores do conjunto.

Este método exige que os valores de x1 a xN estejam todos disponíveis para o cálculo.

Método 2

O método iterativo, calcula a média a medida que novos valores são obtidos. Para o cálculo da media de N pontos, segue-se o seguinte método:

1º passo
Calcula-se a média dos 2 primeiros valores , e em seguida guarda-se o número de valores e o valor da média atual .
2º passo
A cada novo valor , calcula-se a média usando a média anterior e o novo valor : e em seguida guarda-se o número de pontos N = N + 1 e o novo valor da média. Este passo é repetido a cada novo valor.

Neste caso a necessidade de armazenamento de valores se reduz a 2 valores ( e ).

Como calcular a distância entre dois pontos

Se você tiver a localização dada em coordenadas de latitude e longitude de dois pontos e sobre o globo terrestre, pode calcular a distancia entre eles usando diferentes métodos

Método 1

Um método é o cálculo da distância geodésica , o qual considera a distância percorrida sobre uma esfera com raio equivalente ao raio médio da terra .

FONTE: http://mathworld.wolfram.com/GreatCircle.html, http://obsn3.on.br/~jlkm/geopath/

Método 2

Um segundo método é transformar as coordenadas geográficas em coordenadas no plano cartesiano e :

e calcular a distância euclidiana entre os pontos:

Note que este método calcula a distância em linha reta, e é uma aproximação da distância real quando seu valor é pequeno em relação a curvatura da terra (< 1000 km).

FONTE: http://mathworld.wolfram.com/Distance.html

Como calcular a área de um triângulo

Fórmula de Heron

A fórmula de Herón permite calcular a área de qualquer triangulo conhecendo-se o comprimento dos seus 3 lados :

onde s é o semiperimetro do triangulo:

Veja outros possíveis métodos no site Wolfram Mathword.

Campo de Experimentos PJI1

No pátio do estacionamento do IF-SC estão marcados 3 pontos que formam um triângulo (P1,P2,P3). Estes pontos servem de referência inicial para a verificação de funcionamento dos sistemas desenvolvidos no PJI1. As latitudes e longitudes desses pontos com medição através do GPS Garmim 76CSx, resultaram em:

P1 = [-27.608417,-48.632750]
P2 = [-27.608611,-48.632889]
P3 = [-27.608556,-48.632639]

A medida da distância entre os pontos usando uma trena de fibra resultou na distância de:

d(P1,P2) = 27,00 m
d(P1,P3) = 22,30 m
d(P2,P3) = 20,65 m

Utilizando a fórmula de Heron obteve-se:

Area(P1,P2,P3) = 225,04 m2

Campo Experimental do PJI1

Conversor de decimal para graus.minutos.segundos