BROB - Základy robotiky (2016) GPS navigace pro plovoucího robota třídy KAMbot (S.12) Autoři: Vedoucí projektu: Jan Mazoch, Jakub Hadámek, Lukáš Hvizdák Ing. Lukáš Kopečný, Ph.D.
Zadaní Navrhněte a realizujte GNS (GPS) modul pro plovoucí verzi robotu KAMbot. Vytvořte algoritmus pro autonomní navigaci robotu pomocí GNS modulu.
Obsah Úvod 1 Problematika navigace pomocí GPS 1 Popis funkce main a programu 1 Popisy funkcí volaných v mainu 1 Formát NMEA 3 Propojení Raspberry Pi 2 B s GPS modemem NEO 6M 3
Úvod Cílen našeho projektu byl návrh GPS navigace, výběr GPS čipu a naprogramování softwaru (dále pouze sw) řídicího KAMbota. GPS čip jsme vybrali NEO-6M (NEO-6M-0-001). Sw vypočítavá z GPS souřadnic vektor a aktuální úhel natočení kormidla, v našem případě reprezentovaného servomotorem. Jako hardware jsme zvolili Raspberry Pi 2.0, s operačním systémem Raspbian (Kernel v. 4.1).
Problematika navigace pomocí GPS Při návrhu autonomní navigace GPS je nutné se rozhodnout, jakým způsobem budeme zjišťovat směr vektoru, jímž se robot pohybuje a jaká je jeho relativní poloha vůči cílovým souřadnicím. V našem případě vypočítáváme úhel pohybového vektoru od cílových souřadnic pomocí funkce atan2, který vrací azimut (úhel od severu). Popis funkce main a programu V programu definuje strukturu struct coordinates { double longtitude; double latitude; }, která obsahuje zeměpisnou délku a šířku. V mainu vytváříme proměnné typu struct coordinates, actual_position pro aktuální polohu, old_postion pro předešlou polohu a target pro cílové souřadnice. Ze souřadnic v actual_position a old_positon definuje pohybový vektor. Dále se v main volají funkce k jednotlivým výpočtům. Popisy funkcí volaných v mainu struct coordinates position(file *stream); Funkce čte stream a zároveň separuje GPS souřadnice z ttyama0, což je sériová komunikace mezi GPS modemem a Raspberry Pi. Probíhá zde přepočet z jednotlivých znaků uložených v proměnné char na souřadnice ve formátu double. Rovněž testuje zda-li má GPS signál. double angle(struct coordinates actual_position, struct coordinates target); Funkce vypočítavá úhel do aktuální pozice k cílovým souřadnicím pomocí dvou úhlů. Úhel 1 prom. "uhel1" vypočítavá azimut od pohybového vektoru. Úhel 2 prom. "uhel2" vypočte azimut od cílových souřadnic (úhel 360 nebo 0 je úhel k severu a úhel 180 je k jihu). Námi hledaný úhel k cílovým souřadnicím je rozdíl úhlu 2 a úhlu 1. double distance(struct coordinates actual_position, struct coordinates target); Funkce počítá vzdálenost dvou souřadnic, pomocí goniometrických funkcí aby byl přepočet přesný kvůli zemskému zakřivení. Pro naše použití se jedná o nadbytečnost ale vzhledem k možnosti využití na jiném projektu jsme se to rozhodly zakomponovat.
Formát NMEA GPS posílá data ve formátu NMEA. NMEA je standard, původně určený pro automatizovaný přenos dat mezi jednotlivými zařízeními elektroniky lodí. Všechny zprávy mají stanoven formát podle následujícího schematu: $XXYYY,a1,a2,a3,...,an*cc Zprávu tvoří řádek ASCII znaků (písmen a číslic), který ukončuje znak odřádkování. Každý řádek začíná znakem $, po kterém následují dva znaky určující typ vysílače (v našem případě GP jako GPS). Další dva znaky udávají o který druh zprávy se jedná. Nás zajímá buďto zpráva GGA, nebo GLL, které obě obsahují aktuální šouřadnice (délku a šířku). Původně jsme chtěli odečítat také azimut, ale po několika testech, které skončili neúspěchem (azimut udával nesmyslné hodnoty), jsme došli k závěru, že si veškeré úhly bude mepřepočítávat sami pomocí souřadnic. Ve zprávě GLL nám položka udává zeměpisnou šířku, při čemž první dva znaky jsou stupně a za nimi hned následují minuty. Dále je za čárkou N, které nám říká, že se jedná o severní šířku. Za další čárkou je zeměpisná délka ve stejném formátu jak šířka, následované písmenem E, které značí východní délku. Celá zpráva vypadá takto: $GPGLL,0011.82542,N,01715,99646,E,455,V,N*64 Propojení Raspberry Pi 2 B s GPS modemem NEO 6M Propojení je snadné stačí k tomu pouze 4 drátky, rozdělení sběrnice GPIO u Raspberry viz obr.1 níže. Propojte mezi sebou Rx z GPS na Tx u Raspberry, Tx z GPS na Rx Raspberry, napájení +3V na +3V a GND.
Obrázek 1 schématu sběrnice GPIO u Raspberry Pi 2 B.
Obrázek 2 přepočtu úhlu