O meu GPS anda maluco?
Um dos seguidores do blog perguntou "porque razão ao correr com amigos as aplicações mostram valores diferentes mesmo tendo ido os dois lado a lado" e eu fui chateado pela malta do CnC para responder a esta questão.
É o que vou tentar explicar na óptica de utilizador e baseado na minha experiência com sensores do mesmo género. Sendo que a conversa pode tornar-se demasiado chata para alguns, deixo aqui a versão TL,DR ou se calhar de forma mais adequada "Demasiado nerd, não vou ler".
Na primeira parte irei falar sobre mesmo ficheiro de dados enviado para várias aplicações e na segunda irei mostrar a comparação entre os ficheiro sem tratamento, o Strava, e um gps de gama profissional.
Parte 1: TL,DR version
Os sensores de gps de baixo custo têm um desvio padrão associados que facilmente rondarão 3 a 5 metros sem obstrução da linha de visão dos satelites e boas condições climatéricas para posições horizontais. Para posições verticais este erro pode aumentar entre 2 a 3 vezes em muitos casos. Para isso as aplicações recorrerem a modelos externos de mapeamento de altitudes (Digital Elevation Models) e ,caso estejam disponíveis, fusão de outros sensores (barómetros) de forma a incrementar a precisão.
O algoritmo utilizado para a detecção de movimento pode ser também diferente e por tanto, os tempos de movimento e estimativas de média de min/km será obviamente afectada pela escolha destes algoritmos em cada aplicação.
Vejamos os exemplos na tabela seguinte, onde o mesmo ficheiro (.gpx) foi enviado para três aplicações diferentes e o tratamento é todo feito apenas sobre a informação de gps. É importante referir este ponto porque desta forma garante-se que não existe fusão de informação de outros sensores.
Strava | TomTom MySports | Runkeeper | |
---|---|---|---|
Distância | 0.5km 1 | 0.59km | 0.59km |
Duração | 3m:20s | 3m:20s | 3m:20s |
Tempo Movimento | 3m:10 | -- | -- |
Ritmo médio | 5m:19s | 5m:37s | 5m:36s |
D+ | 10m | 13m | 15m |
Portanto facilmente vemos que, para uma distância curta existem pequenas variações que provavelmente se irão demarcar mais com a duração da actividade. Logo, é perfeitamente normal aplicações diferentes resultarem em valores diferentes pela escolha dos algoritmos usados.
Parte 2: Let's go nerd all the way!
Para contexto, vamos apenas dar uma ou duas notas sobre o funcionamento do GPS.
Basicamente, o sistema de GNSS (GPS é o sistema GNSS pertencente aos EUA) está continuamente a transmitir mensagens (algumas são codificadas e estão apenas disponíveis para militares). Todas as mensagens são moduladas e transmitidas sobre uma frequência base (que varia dependente da constelação GNSS usada) em que um dos campos é o horário em que foram enviados do satélite. Então, um receptor de GPS pode usar esta informação para determinar a posição. Se eu sei que a mensagem "A" chegou ao meu receptor no instante t1 mas foi enviada no instante t0 posso estimar a distância ao satélite A como sendo a velocidade da luz vezes a diferença de tempo (d = C[t1-t0]).
Utilizando o mesmo método para outros satélites permite realizar a triangulação como mostra nesta imagem:
Na realidade precisamos de pelo menos 4 satélites porque, à partida, não sabemos se o relógio do nosso receptor está correcto ou não e resolvendo um sistema de quatro equações a quatro incógnitas, o receptor irá calcular também o desfazamento entre os relógios.
Sabendo qual a frequência a que o sinal é transmitido, também existe forma de determinar a velocidade a que nos movimentamos devido ao efeito de Doppler. De forma simples, pensem num carro que está a apitar a passar por vocês. Já repararam como o som muda à medida que este se movimenta? O princípio é o mesmo. A variação da frequência depende da velocidade de deslocamento.
Então, os receptores de satélite podem ser melhores do que outros de acordo com a capacidade e precisão dos seus relógios internos e na realização de cálculos e detecção das frequências utilizadas pelas constelações.
Obviamente existem muitos mais erros mas não quero parecer demasiado nerd.
Shut up and show me the data!
Coisas que saltam logo à vista: na projecção horizontal (parte inferior direita) as coisas aparentam comportar-se até bastante bem, apesar traçado do Strava não ser coincidente com o traçado de raw (o que seria de esperar). Significa que o Strava aplica algum processamento adicional sobre as coordenadas (talvez uns filtros de média móvel para remover possíveis outliers).
Outro aspecto que é facil perceber é que no ficheiro sem tratamento (parte superior, lado direito), o ponto inicial e final não coincidem. O do strava está perfeitamente suave, o que indica claramente que segue um qualquer modelo DEM para fazer as correções.
Os dados da Novatel servem aqui um pouco como a referência de comparação e, mesmo assim, podemos ver o quanto instável ele é:
Mas será que essas estimativas são assim tão importantes?
Vejamos a distância calculada pelo dois casos (Strava vs Raw):
Strava | Raw | Novatel | |
---|---|---|---|
Total | 591.9967 m | 601.4523 m | --2 |
Variação de altitude máxima | 14.4012 m | 19.0031 m | 8.8478 m 3 |
Numa volta tão pequena produziu uma diferença de ~ 10 m.
Como algumas marcas melhoram a precisão na altura?
Usando a fusão de barómetros. Como sabem, algum relógios com GNSS indicados para desportos têm barómetros. Isto porque a pressão atmosférica vai reduzindo à medida que a altura vai aumentando. O barómetro não está sujeito ao mesmo tipo de erros (que ronda os 0.5m, por exemplo, no Bosch BMP180) do GNSS mas é influenciado pela variação das condições climatéricas e é por este caso que algumas marcas aconselham a deixar o relógio ligado e relativamente parado durante cerca 15 a 30 min na zona onde vamos correr para que os sensores possam ser calibrados automáticamente.
Se quiserem pesquisar mais sobre gnss, a novatel disponibiliza uma introdução que considero muito boa em http://www.novatel.com/an-introduction-to-gnss/chapter-1-gnss-overview/.
Para quem é demasiado nerd, deixo aqui um artigo interessante onde se realizaram experiências com dois telemóveis um com barómetro e outro sem para mostrar melhoramento na posição do GNSS.
Footnotes:
1: Apesar de apresentar com distância total 0.5 km, graficamente pode verificar-se que é aproximadamente 0.6 km. ↩
2: Não contenho dados de apenas uma volta. Os dados mostrados correspondem a várias voltas. ↩
3: Valores não filtrados. Usando o filtro para remover outliers resulta em cerca de 5.9093m . ↩