Nachdem
ich mit künstlicher Intelligenz experimentiert hatte, beschloss der Autopilot
meines Panzers , einen Schritt zurückzutreten und das Navigieren in den guten alten Satelliten zu lernen.
Das Bild ist inszeniert und weist darauf hin, dass sich jeder GPS-Transport unter der Kontrolle eines Navigators selbst erwärmen kann.

Himbeer Pi + GPS
Zunächst wurde ein einfaches USB-GPS-Modul gekauft.
Anhand des Artikels über
Adafrukt habe ich mit der Implementierung begonnen.
Trotz der Tatsache, dass der Artikel vor 6 Jahren geschrieben wurde, hat sich in der Welt der Navigation der alten Schule nicht viel geändert.
Nur einige Nuancen stimmten nicht überein:
- Das Stück Eisen wurde als / dev / ttyACM0 anstelle von / dev / ttyUSB0 entdeckt
- Bei der Installation von gpsd habe ich das Gerät selbst nicht gefunden. Es stellte sich heraus, dass eine Registrierung in / etc / default / gpsd erforderlich ist:
DEVICES="/dev/ACM0"
- für python-3 gps muss das paket von hand geliefert werden, es geht nicht mit gpsd
Das Gerät selbst sieht aus wie ein normaler USB-Stick:

Und dann blieb ich lange stecken, weil mein GPS die Koordinaten nicht sah.
Das Gerät funktionierte, meldete die Version, den Hersteller und andere nützliche Informationen, aber nichts weiter.
Zuerst dachte ich, dass er immer noch defekt war. Aus früheren Experimenten habe ich noch eine SD-Karte von Raspbian 2017, auf der GPS funktioniert hat.
Von ihm gebootet und - siehe da - GPS wurde lebendig und blinzelte mit einer Glühbirne und duschte in den Protokollkoordinaten.
Ich habe mir eine Woche lang den Kopf zerbrochen, alle Konfigurationen verglichen, angefangen, auf einem neuen Buggy-Raspbian zu sündigen, und war gerade dabei, gpsd im Debug neu zu erstellen, als ich plötzlich im Raspberry-Forum in einem der Themen zu GPS-Problemen (und es gibt viele davon dort) auf Ratschläge stieß, zu denen ich das Gerät bringen sollte die Straße bei klarem Wetter und lassen Sie es Satelliten finden, die bis zu einer halben Stunde dauern kann.
Diese Idee kam mir in den Sinn, aber anscheinend war das Wetter nicht klar genug, aber dann stimmte alles überein und das Gerät wurde lebendig. Wenn Sie etwas tiefer graben, stellt sich heraus, dass die erforderlichen Informationen zu den Satelliten in der Firmware des Geräts zwischengespeichert sind und nicht von Raspbian gesteuert werden können.
Wie kann meine Anwendung Almanach- / Ephemeriden- / Pseudobereichsdaten abrufen?
Leider gibt es noch keine einfache Möglichkeit, diese Dinge über GPSD zu erledigen. Der Grund dafür ist, dass es keine einheitliche Möglichkeit gibt, GPS-Empfänger dazu zu bringen, diese Informationen zu melden.
Viele versenden es überhaupt nicht. Andere (einschließlich einiger, aber nicht aller Geräte, die SiRF-Binärpakete versenden) versenden es gelegentlich in SUBFRAME-Informationen, aber Sie müssen genau wissen, wie Sie die SUBFRAME-Felder durchsuchen, um es zu erhalten, und die Dokumentation derjenigen in IS-GPS-200E (the over) -das Luftprotokoll, das von GPS-Satelliten verwendet wird) ist äußerst dunkel. Wieder andere Berichte variieren Teilmengen von Almanach- / Ephemeriden- / Pseudoentfernungsdaten auf relativ einfache Weise, jedoch in herstellerspezifischen Sätzen, die für einzelne Empfängertypen äußerst spezifisch sind, schlecht dokumentiert oder nicht dokumentiert sind und häufig durch gleichermaßen spezifische und noch schlechtere Kontrollsequenzen aktiviert werden müssen dokumentiert.
Der knifflige Mechanismus hat funktioniert und es ist Zeit, ihn auszunutzen.
Das Skript zum Lesen von Daten aus gpsd in Python ist sehr einfach:
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)
Google Maps API
Ich steuere den Tank vom Telefon aus, also musste ich lernen, mit Google Maps zu arbeiten.
Google hat gute Arbeit geleistet, um die Arbeit mit Karten zu vereinfachen, sodass es keine Probleme gab.
Android Studio kann ein leeres Projekt mit einer Karte erstellen, von der aus alle wichtigen Details sorgfältig auf das Hauptprojekt übertragen werden müssen.
Google benötigt eine
Schlüsselregistrierung , um mit der Maps-API arbeiten zu können. Diese Registrierung ist (vorerst) kostenlos.
Ich habe die REST-Oberfläche des Panzers so erweitert, dass er seine Koordinaten angibt, die Koordinaten auf die Karte überträgt, ein Panzersymbol zeichnet und alles recht anständig aussieht.
Als nächstes müssen Sie den Weg ebnen.
Ein Punkt auf der Karte wählt das Ziel aus und füttert es in der
Wegbeschreibungs-API .
Directions ist ein Webdienst, der die Koordinaten von zwei Punkten verwendet und als Antwort eine Reihe von Informationen über die zurückgelegte Route ausgibt, einschließlich Adressen, bemerkenswerter Namen und Erklärungen. Aber ich brauchte nur eine Abfolge von Schritten. Wir wählen die Koordinaten aus und zeichnen sie auf die Karte.
Jetzt gibt es alles Notwendige für die visuelle Kontrolle und Verwaltung.

GPS-Navigation
Weiter vom Telefon zum Tank wird der erste Punkt der Route übertragen.
Der Tank hat ein kleines Problem - zu Beginn kennt er seine Richtung nicht.
Das Problem lässt sich leicht mit dem Kompass lösen, aber jeder kann mit dem Kompass umgehen ...
Es war möglich, durch die Tatsache herauszukommen, dass der Panzer in den ersten Sekunden einfach vorausfährt, die Koordinaten des Beginns und des Endes des Pfades empfängt und daraus seine Richtung berechnet. Es ist erwähnenswert, dass die gleichen Daten direkt vom GPS abgerufen werden können. Es gibt ein Trackfeld, das die Abweichung vom Winkel zum Nordpol anzeigt.
In jedem Fall ist jedoch Bewegung erforderlich, damit sich das später füllt.
Richtungsberechnung:
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)
Ich stelle fest, dass GPS nicht immer genau funktioniert, und es kann sich herausstellen, dass die Koordinaten des Beginns und des Endes des Testpfads fehlerhaft sind und Messungen bedeutungslos machen (selbst in dem Maße, in dem beim Vorwärtsbewegen die Koordinate des Endes des Pfads zurückliegt).
In diesem Fall gibt das GPS die Richtung durch die Spur ziemlich zuverlässig an, daher wurde dieses Feld standardmäßig verwendet, und wenn es nicht vorhanden war, musste ich anhand der Koordinatendifferenz navigieren.
Nachdem sich der Panzer am Gelände orientiert hat, dreht er sich ungefähr bei Bedarf (ungefähr - weil es schwierig ist, die Richtung ohne Kompass oder Gyroskop genau zu bestimmen) und bewegt sich einige Sekunden lang. Dann erhält er wieder die Koordinaten, prüft die Richtung, dreht sich um, fährt. Und so weiter, bis sich das Ziel innerhalb des Fehlerradius befindet.
Im Allgemeinen ist das größte Problem der Fehler in den GPS-Koordinaten, wodurch der Tank die Richtung verliert und in verschiedene Richtungen zu rasen beginnt.
Alles hängt damit zusammen, dass man ohne Kompass nicht überleben kann.
Referenzen
- Einführungsartikel zum Einrichten eines GPS-Moduls für den Raspberry Pi
- Dienst für die Arbeit mit GPS unter Linux
- Nützliche Stelle mit Formeln zur Berechnung der Entfernung und Richtung anhand der Koordinaten zweier Punkte
- Quellcode der GPS-Tank-Firmware
- Google Maps-Dokumentation für Android