Raspberry-pi-tank et navigation GPS

Après avoir expérimenté l'intelligence artificielle, le pilote automatique de mon char a décidé de prendre du recul et d'apprendre à naviguer sur les bons vieux satellites.

L'image est mise en scène, laissant entendre que tout transport GPS peut s'auto-chauffer sous le contrôle d'un navigateur.



Raspberry Pi + GPS


Tout d'abord, un simple module GPS USB a été acheté.

Guidé par l'article sur Adafrukt , j'ai commencé la mise en œuvre.

Malgré le fait que l'article ait été écrit il y a 6 ans, rien n'a beaucoup changé dans le monde de la navigation à l'ancienne.

Seules certaines nuances ne correspondent pas:

  • le morceau de fer a été découvert comme / dev / ttyACM0 au lieu de / dev / ttyUSB0
  • lors de l'installation de gpsd, je n'ai pas trouvé le périphérique moi-même, il s'est avéré nécessaire de s'inscrire dans / etc / default / gpsd:
    DEVICES="/dev/ACM0" 
  • pour gps python-3 le paquet doit être livré en main propre, il ne va pas avec gpsd

L'appareil lui-même ressemble à une clé USB standard:



Et puis je suis resté coincé pendant longtemps, parce que mon GPS n'a pas vu les coordonnées.

L'appareil a fonctionné, a rapporté la version, le fabricant et d'autres informations utiles, mais rien de plus.

Au début, je pensais qu'il était toujours défectueux. D'après les expériences précédentes, j'ai toujours une carte SD de Raspbian 2017, sur laquelle le GPS fonctionnait.

Démarré à partir de là et - voilà, le GPS a pris vie et a fait clignoter une ampoule, et s'est douché dans les coordonnées du journal.
J'ai creusé la tête pendant une semaine, comparé toutes les configurations, commencé à pécher sur un nouveau buggy Raspbian et me préparais à reconstruire gpsd dans le débogage, quand soudainement sur le forum Raspberry dans l'un des sujets sur les problèmes GPS (et il y en a beaucoup là-bas), je suis tombé sur des conseils pour retirer l'appareil sur par temps clair et laissez-la trouver des satellites, ce qui peut prendre jusqu'à une demi-heure.

Cette idée m'est venue à l'esprit, mais apparemment le temps n'était pas assez clair, mais tout a coïncidé et l'appareil a pris vie. Si vous creusez un peu plus profondément, il s'avère que les informations nécessaires sur les satellites sont mises en cache dans le firmware de l'appareil et ne peuvent pas être contrôlées par Raspbian.

Comment mon application peut-elle obtenir des données d'almanach / éphémérides / pseudodistance?


Désolé, il n'y a pas encore de moyen facile de faire ces choses via GPSD. La raison en est qu'il n'existe aucun moyen cohérent de faire rapporter ces informations par les récepteurs GPS.

Beaucoup ne l'expédient pas du tout. D'autres (y compris certains mais pas tous les appareils expédiant des paquets binaires SiRF) l'envoient occasionnellement dans les informations SUBFRAME, mais vous devez savoir exactement comment parcourir les champs SUBFRAME pour l'obtenir et la documentation de ceux dans IS-GPS-200E (le plus -le-air protocole utilisé par les satellites GPS) est extrêmement obscur. D'autres encore rapportent qu'ils varient Générer des sous-ensembles de données d'almanach / éphémérides / pseudo-plages de manière raisonnablement simple, mais dans des phrases propriétaires du vendeur qui sont extrêmement spécifiques aux types de récepteurs individuels, mal documentées ou non documentées, et qui doivent souvent être activées par des séquences de contrôle qui sont tout aussi spécifiques et même pires documenté.
Le mécanisme délicat a fonctionné et il est temps d'en profiter.
Le script pour lire les données de gpsd en python est très simple:

 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 Google Maps


Je contrôle le réservoir depuis le téléphone, j'ai donc dû étudier le travail avec Google Maps.
Google a fait un bon travail en simplifiant le travail avec les cartes, il n'y a donc pas eu de problème.
Android Studio peut créer un projet vide avec une carte, d'où il est nécessaire de transférer soigneusement tous les détails importants vers le projet principal.

Google nécessite un enregistrement de clé pour fonctionner avec l'API Maps, cela se fait gratuitement (pour l'instant).

J'ai élargi l'interface REST du char pour qu'il donne ses coordonnées, transfère les coordonnées sur la carte, dessine une icône de char et tout semble assez décent.

Ensuite, vous devez ouvrir la voie.

Un point sur la carte sélectionne la cible et l'alimente dans l' API Directions .

Directions est un service Web qui prend les coordonnées de deux points et en réponse, décharge un tas d'informations sur l'itinéraire emprunté, y compris des adresses, des noms remarquables et des explications. Mais je n'avais besoin que d'une séquence d'étapes. Nous sélectionnons les coordonnées et les dessinons sur la carte.

Maintenant, il y a tout le nécessaire pour le contrôle visuel et la gestion.



Navigation GPS


Plus loin du téléphone vers le réservoir, le premier point de l'itinéraire est transmis.

Le char a un petit problème - au départ, il ne connaît pas sa direction.
Le problème est facilement résolu par la boussole, mais n'importe qui peut gérer la boussole ...

Il a été possible de sortir du fait que pendant les premières secondes, le char passe simplement devant, recevant les coordonnées du début et de la fin du chemin et calculant sa direction à partir d'elles. Il convient de noter que les mêmes données peuvent être obtenues directement à partir du GPS, il existe un champ de suivi, qui montre l'écart par rapport à l'angle par rapport au pôle nord.

Mais en tout cas, pour que cela se remplisse ensuite, il faut du mouvement.

Calcul de la direction:

 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) 

Je note que le GPS ne fonctionne pas toujours avec précision, et il se pourrait bien que les coordonnées du début et de la fin du trajet de test soient avec une erreur rendant les mesures dénuées de sens (même dans la mesure où en avançant, la coordonnée de la fin du trajet est derrière).

Dans ce cas, le GPS donne la direction via la piste de manière assez fiable, donc ce champ a été utilisé par défaut, et s'il n'était pas là, j'ai dû naviguer par la différence de coordonnées.

Après s'être orienté sur le terrain, le char tourne approximativement là où cela est nécessaire (approximativement - car il est difficile de déterminer avec précision la direction sans boussole ni gyroscope) et se déplace pendant plusieurs secondes. Puis il reçoit à nouveau les coordonnées, vérifie la direction, tourne, roule. Et ainsi de suite jusqu'à ce que la cible soit dans le rayon d'erreur.

En général, le plus gros problème est l'erreur dans les coordonnées GPS, à cause de laquelle le réservoir perd sa direction et commence à se précipiter dans différentes directions.

Tout vient du fait que sans boussole, vous ne pouvez pas survivre.

Les références


  1. Article introductif sur la configuration d'un module GPS pour le Raspberry Pi
  2. Service pour travailler avec GPS sur Linux
  3. Site utile avec des formules pour calculer la distance et la direction par les coordonnées de deux points
  4. Code source du firmware du réservoir GPS
  5. Documentation Google Maps pour Android

Source: https://habr.com/ru/post/fr447654/


All Articles