Beräkna kurs m.h.a. koordinater?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Beräkna kurs m.h.a. koordinater?

Inlägg av Glattnos »

Jag skulle vilja räkna ut vinkeln(kursen) med hjälp av två GPS-koordinater.
Tex:
Räkna ut kursen från
Lat. 6206.4570 (grad,grad,min,min. min-decimaler)
Long.01329.1080 (grad,grad,grad,min,min. min-decimaler)
till
Lat. 6110.8050
Long. 01430.2500

Borde ju bli någon typ av Syd-ost(typ 110-160 grader).

Detta skulle jag vilja göra i min AVR och hellst i assembler. Jag har provat med papper och penna först men bara kommit på beräkningar där mycket decimaler(alltså typ 1,2456) blir inblandade vilket känns lite krångligt. Skulle vilja göra det lite enklare. Jag behöver inte ha helt exakt riktning.
Jag skulle kunna spara ett antal riktningar i processorns minne(kallas det struct då?)och sedan plocka det värde som är närmast, alltså dela 360 med typ 72, 256 eller något lämpligt, räcker nog med 5 graders noggrannhet men ju mer exakt desto bättre.

Men hur skulle man kunna räkna ut vilket värde som är närmast?
Jag har sökt en del men hittar mest exempel i C vilket jag inte kan, och sedan gillar jag assembler så det känns trist om jag skulle behöva lära mig C bara för att få till detta.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 15563
Blev medlem: 16 april 2006, 17:04:10

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av mrfrenzy »

Att lära sig C kommer bespara dig mycket tid i framtiden, både på detta och andra liknande projekt. Det blir mycket enklare att göra alla typer av beräkningar då.

Dave har gjort en liten utläggning om detta, i stort sett håller jag med honom. http://www.eevblog.com/2009/11/21/eevbl ... ogrammers/
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av Glattnos »

mrfrenzy: Okej, jag förstår inte riktigt vad Dave pratar om, men det verkar som att han sågar "genvägar" till programmering. Men är inte C på AVR en "genväg" om man jämför med assembler på AVR?
Om inte jag har fattat fel så blir ett program i C oftast större och slösar mer processorkraft än ett program skrivet i assembler.

Men jag håller med om att beräkningar(och kanske programmeringen överlag)borde bli enklare om man skriver i C och jag borde kanske lära mig C(kanske när jag behärskar assembler bra och vet hur processorn fungerar). Men detta är inte en tråd om vilket språk som är bäst. Frågan kvarstår, hur kan man lösa mitt problem i assembler? För det som går att göra i C går att göra i assembler(annars har jag fattat fel).
limpan4all
Inlägg: 8457
Blev medlem: 15 april 2006, 18:57:29
Ort: Typ Nyköping

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av limpan4all »

Kolla om du inte kan ställa om din GPS till ett lite bättre datumformat.
RT90 är ett sådant format då får du ut X och Y koordinaterna i meter istället för i grader minuter, sekunder.
Detta gör att matematiken hamnar på högstadienivå och enkelt kan lösas i assembler.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av bearing »

I Prycyon AVRlib finns några filer som behandlar GPS-data, t.ex. nmea.c. Har inte lusläst filen, så vet inte om det här är lösningen på ditt problem, men jag tror det är en hjälp på vägen.

EDIT: finns det inte ett färdigt fält värde för kurs i NMEA-datan? har för mig det, i så fall behöver du ju inte räkna ut den själv.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av Glattnos »

limpan4all: Det är en EM-411-GPS modul, och den verkar inte gå att ställa in på RT90. Men blir det enklare med meter? Jag kan väl räkna om det till meter först kanske.

bearing: Jo, det finns redan ett fält för aktuell kurs. Men jag måste ju räkna ut vilken kurs jag ska hålla från punkt A till punkt B. Eller hur kan man annars göra?
limpan4all
Inlägg: 8457
Blev medlem: 15 april 2006, 18:57:29
Ort: Typ Nyköping

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av limpan4all »

Med två punkter i ett linjärt metriskt koordinatsystem så behöver du bara räkna om till skillnaden (subtraktion) sen konvertera till riktning och avstånd (SCR på X^2+Y^2 är avståndet ARCTAN X/Y är vinkeln).
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9126
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av AndersG »

Jag skulle nog göra det i C, det blir flyttal och trigonometri, så det är ganska hårigt att göra det i assembler.

Se:
http://www.movable-type.co.uk/scripts/latlong.html
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av Glattnos »

Nu har jag kommit så långt att jag har skillnaden i meter på Latitud resp. Longitud. Dessa ligger i en varsin 16-bitars variabel. Men är det någon som har förslag på hur man kan få fram vinkeln utan att använda några decimaler(flyttal?)
Med penna och papper blir det ju: TAN var1/var2 men hur kan man göra det i assembler?

Behöver som sagt inte bli exakt mer än på 1-2 grader.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av bearing »

ARCTAN borde kunna fixas med hjälp av en tabell. Gör t.ex. en 16-bitars tabell som innehåller tan(v)*256 för 0-89 grader. ARCTAN(var1/var2) fås genom att först beräkna kvot=var1*256/var2, sedan loopa genom tabellen och jämföra kvot med tabellvärdet.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av sodjan »

Som Bearing säger, för bästa prestanda gör som före datorer och handräknare, slå i tabeller !
Hur tabellerna ska se ut beror helt på önskad precision i resultatet. Om 1-2 grader täcker
så blir det ju bara 90st (1 grad) till 45st (2 grad) *olika* slutresultat. Kolla också på om du
kanske kan avrunda dina två 16-bitars varbaler till mindre tal före vinkelberäkningen, du
kanske man ligga inom 1-2 grader även med 8-bitars tal (?). Behövs lite analys där...
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av Glattnos »

bearing: Tack så mycket! Det tänkte jag inte på.

Nu blev det (var1*256/var2)/256 = ett värde mellan 1 och 65535 som kommer att motsvara 0 - 89 grader(inte proportionellt).
Har jag fattat rätt då eller tänker jag fel?

sodjan: Jag kan väll nu(eller på en gång efter sista divisionen) dela värdet med 256 igen så blir 0 - 89 grader indelat i 256 riktningar(ett varv blir 256*4=1024 delningar på ett varv). Blir lite väl exakt det med. Om jag skrotar 2 bit till så blir det väll 64*4=256 riktningar på ett varv, 360/256 = 1,4 grader noggrannhet i snitt(blir väll lite olika beroende på riktning).
Är resonemanget riktigt?
Nerre
Inlägg: 27256
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av Nerre »

Gör tabellen först (går att göra i t.ex. Excel) så ser du vad du behöver för upplösning för att få vettig vinkel i "ändarna".

Jag gjorde ett litet snabbt test, jag gjorde en tabell en vinklarna 0-90 och en kolumn med tangens av vinkeln och sen en kolumn där jag multiplicerade tangens med 256.

I början av tabellen ser det ut så här

1 0,017455065 4,468496622
2 0,034920769 8,93971699
3 0,052407779 13,4163915
4 0,069926812 17,90126386

men i slutet blir det värre

86 14,30066626 3660,970562
87 19,08113669 4884,770992
88 28,63625328 7330,88084
89 57,28996163 14666,23018
90 1,63246E+16 4,17909E+18
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av sodjan »

Ja, jo, men 90 grader är ju ointressant som vinkel.
Och vinklar under en viss gräns avrundar man till "0".
Det är vinklarna därimellan som är intressanta...
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: Beräkna kurs m.h.a. koordinater?

Inlägg av ahlsten »

CORDIC är en fin metod för dylika problem (i stort sett det ni redan kommit fram till, men med lite finesser som man får utan att uppfinna hjulet på nytt).
Skriv svar