Depois de
experimentar a inteligência artificial, o piloto automático do
meu tanque decidiu dar um passo atrás e aprender a navegar pelos bons e velhos satélites.
A imagem é apresentada, sugerindo que qualquer transporte por GPS pode se aquecer sob o controle de um navegador.

Raspberry Pi + GPS
Primeiro, foi adquirido um módulo GPS USB simples.
Guiado pelo artigo
Adafrukt , iniciei a implementação.
Apesar de o artigo ter sido escrito há 6 anos, nada mudou muito no mundo da navegação antiga.
Apenas algumas nuances não corresponderam:
- o pedaço de ferro foi descoberto como / dev / ttyACM0 em vez de / dev / ttyUSB0
- ao instalar o gpsd, eu mesmo não encontrei o dispositivo, era necessário registrar-se em / etc / default / gpsd:
DEVICES="/dev/ACM0"
- para python-3 gps, o pacote deve ser entregue manualmente, não acompanha gpsd
O dispositivo em si se parece com uma unidade flash USB comum:

E fiquei preso por muito tempo, porque meu GPS não viu as coordenadas.
O dispositivo funcionou, informou a versão, o fabricante e outras informações úteis, mas nada mais.
A princípio, pensei que ele ainda estivesse com defeito. De experiências anteriores, ainda tenho um cartão SD do Raspbian 2017, no qual o GPS funcionava.
Inicializado a partir dele e - eis que - o GPS ganhou vida, piscou uma lâmpada e tomou um banho nas coordenadas de registro.
Eu montei meu cérebro por uma semana, comparei todas as configurações, comecei a pecar em um novo Raspbian de buggy e estava me preparando para reconstruir o gpsd na depuração, quando, de repente, no fórum Raspberry, em um dos tópicos sobre problemas de GPS (e existem muitos deles), me deparei com conselhos para remover o dispositivo a rua com tempo limpo e deixe encontrar satélites, que podem levar até meia hora.
Essa ideia veio à minha mente, mas aparentemente o tempo não estava claro o suficiente, mas então tudo coincidiu e o dispositivo ganhou vida. Se você se aprofundar um pouco mais, as informações necessárias sobre os satélites serão armazenadas em cache no firmware do dispositivo e não poderão ser controladas pelo Raspbian.
Como meu aplicativo pode obter dados de almanaque / efemérides / pseudo-faixas?
Desculpe, ainda não há uma maneira fácil de fazer essas coisas através do GPSD. O motivo é que não há uma maneira consistente de fazer com que os receptores GPS reportem essas informações.
Muitos não enviam nada. Outros (incluindo alguns, mas nem todos os dispositivos que enviam pacotes binários SiRF) os enviam ocasionalmente nas informações SUBFRAME, mas você precisa saber exatamente como percorrer os campos SUBFRAME para obtê-lo e a documentação dos que estão no IS-GPS-200E (acima). - o protocolo aéreo usado pelos satélites GPS) é extremamente obscuro. Outros ainda relatam variar subconjuntos de dados de almanaque / efemérides / pseudo-faixas de maneiras razoavelmente diretas, mas em frases de proprietários de fornecedores que são extremamente específicas para tipos de receptores individuais, mal documentadas ou não documentadas, e geralmente precisam ser ativadas por seqüências de controle igualmente específicas e até piores documentado.
O mecanismo complicado funcionou e é hora de tirar proveito dele.
O script para ler dados do gpsd em python é muito simples:
import gps gs = gps.gps("localhost", "2947") gs.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) for i in range(0,10): report = gs.next() print (report)
API do Google Maps
Eu controlo o tanque pelo telefone, então tive que estudar trabalhando com o Google Maps.
O Google fez um bom trabalho simplificando o trabalho com mapas, para que não houvesse problemas.
O Android Studio pode criar um projeto vazio com um mapa, de onde é necessário transferir cuidadosamente todos os detalhes importantes para o projeto principal.
O Google exige um registro de
chave para funcionar com a API do Google Maps, isso é feito de graça (por enquanto).
Ampliei a interface REST do tanque para que ele desse suas coordenadas, transfira as coordenadas para o mapa, desenhe um ícone de tanque e tudo parecerá decente.
Em seguida, você precisa abrir o caminho.
Um ponto no mapa seleciona o destino e o alimenta na
API de rotas .
Directions é um serviço da Web que pega as coordenadas de dois pontos e, em resposta, despeja um monte de informações sobre a rota percorrida, incluindo endereços, nomes e explicações importantes Mas eu precisava apenas de uma sequência de etapas. Selecionamos as coordenadas e as desenhamos no mapa.
Agora, há tudo o que é necessário para controle e gerenciamento visual.

Navegação GPS
Além do telefone para o tanque, o primeiro ponto da rota é transmitido.
O tanque tem um pequeno problema - no momento inicial, ele não sabe sua direção.
O problema é facilmente resolvido pela bússola, mas qualquer um pode lidar com a bússola ...
Foi possível perceber que, nos primeiros segundos, o tanque passa simplesmente à frente, recebendo as coordenadas do início e do fim do caminho e calculando sua direção a partir delas. Vale ressaltar que os mesmos dados podem ser obtidos diretamente do GPS, existe um campo de trilha, que mostra o desvio do ângulo para o polo norte.
Mas, em qualquer caso, para que isso seja preenchido posteriormente, é necessário movimento.
Cálculo de direção:
def azimuth(pos1, pos2): lat1 = toRadians(pos1["lat"]) lon1 = toRadians(pos1["lon"]) lat2 = toRadians(pos2["lat"]) lon2 = toRadians(pos2["lon"]) dlat = lat2 - lat1 dlon = lon2 - lon1 x = math.sin(dlon) * math.cos(lat2) y = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dlon) return math.atan2(x, y)
Observo que o GPS nem sempre funciona com precisão, e é possível que as coordenadas do início e do fim do caminho de teste apresentem um erro que torna as medições sem sentido (mesmo na medida em que, ao avançar, a coordenada do final do caminho está atrasada).
Nesse caso, o GPS indica a direção da pista com muita confiabilidade, portanto esse campo foi usado por padrão e, se não estava lá, tive que navegar pela diferença de coordenadas.
Tendo se orientado no terreno, o tanque gira aproximadamente onde necessário (aproximadamente - porque é difícil determinar com precisão a direção sem uma bússola ou giroscópio) e se move por vários segundos. Então ele novamente recebe as coordenadas, verifica a direção, vira, cavalga. E assim por diante até que o alvo esteja dentro do raio de erro.
Em geral, o maior problema é o erro nas coordenadas do GPS, por causa do qual o tanque perde a direção e começa a correr em direções diferentes.
Tudo vai para o fato de que sem uma bússola você não pode sobreviver.
Referências
- Artigo introdutório sobre a configuração de um módulo GPS para o Raspberry Pi
- Serviço para trabalhar com GPS no Linux
- Local útil com fórmulas para calcular a distância e a direção pelas coordenadas de dois pontos
- Código fonte do firmware do tanque GPS
- Documentação do Google Maps para Android