Robot Raspberry Pi cu GPS

Cum se face robotul rezervor navigat prin GPS cu Raspberry Pi.

După experimente cu inteligență artificială, am decis să merg cu un vechi mod de navigație – prin GPS.

Raspberry Pi + GPS

La început, a fost cumpărat un simplu dongle GPS-USB.

Apoi l-am configurat pe baza unui articol de la Adafruit. Deși lucrarea are șase ani, există doar câteva detalii modificate:

Rezervor cu dongle GPS:

Apoi am rămas mult timp, deoarece dispozitivul t nu furniza coordonate. Nu a fost rupt – au fost generate unele informații, cum ar fi versiunea, furnizorul, setările și așa mai departe. Multe informații, dar coordonatele.

La început, am crezut că există un defect. Aveam un card SD vechi din experimentele anterioare în care un astfel de dongle funcționa la Raspbian din 2017. Când am încărcat cu acel card – totul a funcționat bine: GPS-ul a început să clipească verde și a livrat coordonatele.

Am făcut o brainstorming peste o săptămână, am comparat toate configurările, am sugerat că noul Raspbian este incompatibil și este pregătit să compileze gpsd din sursele în modul de depanare.

Din fericire, am citit un subiect pe forumul de asistență Raspberry în care cineva a recomandat să scoată robotul afară pentru a-l lăsa să găsească sateliți. Întregul proces poate dura până la 30 de minute.

Am făcut-o deja, dar fără niciun succes. Probabil că timpul era scurt sau cerul prea tulbure. Dar acea zi a fost senină și însorită și în cele din urmă am fost răsplătit.

O căutare mai profundă a descoperit informațiile despre sateliți încărcate și memorate în cache în firmware-ul dispozitivului, iar Raspbian nu are control asupra acestui proces.

Cum poate obține aplicația mea date despre almanah / efemeridă / pseudoranj?

Ne pare rău, nu există încă o modalitate ușoară de a face aceste lucruri prin GPSD. Motivul este că nu există un mod consecvent de a face ca receptorii GPS să raporteze aceste informații.

Mulți nu o livrează deloc. Alții (inclusiv unele, dar nu toate dispozitivele care livrează pachete binare SiRF) îl expediază ocazional în informații SUBFRAME, dar trebuie să știți exact cum să vă descurcați prin câmpurile SUBFRAME pentru a-l obține și documentația celor din IS-GPS-200E – protocolul aerian folosit de sateliții GPS) este extrem de obscur. Alții încă raportează diferite subseturi de date almanah / efemeridă / pseudorange în moduri rezonabile, dar în propoziții proprietarului furnizorului, care sunt extrem de specifice tipurilor individuale de receptori, slab documentate sau nedocumentate și deseori trebuie să fie activate de secvențe de control care sunt la fel de specifice și chiar mai rău documentat.

Sursa este aici.

Codul Python pentru a citi datele din gpsd este foarte simplu:

API Google Maps

Controlez rezervorul cu un telefon prin intermediul unei aplicații Android. Atunci este o idee bună să desenați hărți pentru navigare. Google Maps este cea mai evidentă alegere în acest scop. Acestea oferă documentație completă și Android Studio poate crea un proiect de hărți goale. Am îmbinat codul hărților în aplicația mea rezervor și a funcționat perfect.

Google trebuie să înregistreze o cheie API pentru a funcționa cu API-ul Maps. Este gratuit (cel puțin acum) și simplu.

Apoi am extins interfața REST a rezervorului pentru a obține coordonatele GPS. Aplicația solicită coordonatele și desenează rezervorul pe hartă. Arată bine.

Următorul pas este să construiești un traseu.

Google oferă API Direction pentru crearea rutelor. Direcții – este un serviciu web, care acceptă coordonate de 2 puncte și returnează o mulțime de informații despre traseu cu puncte de referință, adrese, descriere și așa mai departe. De fapt, am nevoie doar de coordonate.

Deci, întregul proces este:

Rezervorul este gata de navigare:

Navigarea tancurilor

În acest moment tancul primește o comandă cu primul punct al traseului.

Există o problemă – rezervorul nu-și cunoaște direcția inițial. Ar fi atât de ușor dacă ar exista o busolă … Dar această configurație nu poartă o busolă.

Apoi am făcut o soluție. Rezervorul se mișcă câteva secunde, cerând date GPS la începutul și la sfârșitul acestei mișcări. Având 2 puncte, este ușor să calculați rulmentul:

Dar nu a fost sfârșitul problemelor. Sa dovedit că uneori GPS-ul returnează date cu erori și această eroare ar putea fi atât de mare încât coordonatele și rulmentul să arate cu sensul invers.

Singurul mod de a face față – utilizați câmpul GPS urmări . Acest câmp conține un unghi față de nordul adevărat. Uneori acest câmp nu este completat și atunci trebuie să ne bazăm pe rulmentul calculat.

După ce rulmentul a fost găsit, rezervorul face o întoarcere către punctul țintă și se mișcă timp de câteva secunde. A face viraje fără busolă nu este o sarcină banală, de asemenea. Oricum, noul rulment măsurat și cursul corectat cu date noi. Acest proces continuă până când rezervorul este suficient de aproape de țintă.

Concluzie

Navigarea numai cu date GPS brute nu este o soluție bună. Este necesară o busolă pentru a face traseele într-un mod fiabil.

De asemenea, există câteva tehnici pentru a netezi erorile GPS. Filtrul Kalman este utilizat pe scară largă, urmând să-l aplic în versiunile viitoare.

Linkuri

Cum se configurează GPS cu Raspberry Pi de la Adafruit

Documentație de service GPSD

Formule pentru a calcula rulmentul și distanța față de coordonate

Google Maps pentru Android

Firmware-ul rezervorului cu suport GPS pe Github

Mai multe informații pe site-ul rezervorului

Pagina Tank despre ProductHunt