Beräkna kurs m.h.a. koordinater?
Beräkna kurs m.h.a. koordinater?
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.
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.
Re: Beräkna kurs m.h.a. koordinater?
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/
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/
Re: Beräkna kurs m.h.a. koordinater?
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).
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).
-
- Inlägg: 8457
- Blev medlem: 15 april 2006, 18:57:29
- Ort: Typ Nyköping
Re: Beräkna kurs m.h.a. koordinater?
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.
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.
Re: Beräkna kurs m.h.a. koordinater?
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.
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.
Re: Beräkna kurs m.h.a. koordinater?
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?
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?
-
- Inlägg: 8457
- Blev medlem: 15 april 2006, 18:57:29
- Ort: Typ Nyköping
Re: Beräkna kurs m.h.a. koordinater?
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).
Re: Beräkna kurs m.h.a. koordinater?
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
Se:
http://www.movable-type.co.uk/scripts/latlong.html
Re: Beräkna kurs m.h.a. koordinater?
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.
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.
Re: Beräkna kurs m.h.a. koordinater?
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.
Re: Beräkna kurs m.h.a. koordinater?
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...
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...
Re: Beräkna kurs m.h.a. koordinater?
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?
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?
Re: Beräkna kurs m.h.a. koordinater?
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
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
Re: Beräkna kurs m.h.a. koordinater?
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...
Och vinklar under en viss gräns avrundar man till "0".
Det är vinklarna därimellan som är intressanta...