GPS-kurs mjukvaru-dämpning, AVR assembler

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av Andax »

Se sida med formel, en bra bit ner under "Bearing".

Där finns t.ex. ett exempel för excel som borde gå att konvertera:

bearing =ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1), SIN(lon2-lon1)*COS(lat2))
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av sodjan »

Den här sidan verkar kunna det mesta och har formler:
http://www.movable-type.co.uk/scripts/latlong.html

(Hur kom det sig att din end-point hamnade straxt utanför Kelibia
i Tunisen ? Jag bodde där under 5 år på 70-talet... :-) )

EDIT: Jahaja, samma sida som Andax lyckades hitta... :-)
nifelheim
Den första
Inlägg: 2490
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av nifelheim »

Gps mottagaren vet aldrig vad du har för kurs, den räknar ut den genom att ta skillnaden till föregående position,som den mätt upp.

"Static navigation" finns på SIRF chippet kolla om det är på, då kommer den att funka dåligt om du kör väldigt långsamt,
men det ska "jämna ut" kurs och positions felen som du får av att felet i positionen varierar.
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av Icecap »

Att GPS-positionen kan variera vet vi ju och om vi påstår att det är kanske ±5m just nu betyder det i verkligheten att det kan vara +5m i förra värdet och -5m nu, med "hög" hastighet är detta ett försumbart fel men ju lägre hastigheten är ju större felvisning på riktningen blir det.

Samtidig är det två koordinater som ger detta fel och att det kommer att hända är säkert! Och det är precis av den orsak att GPS-kursen är som den är, uträkningen är ganska säkert helt OK, det är upplösningen som inte räcker till vid låga hastigheter.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av Glattnos »

Andax och Sodjan: Ska jag tolka det som att formeln inte går att förenkla mer? Alltså hela formeln måste finnas innan det går att lösa någon del av den? Och hur ska man stoppa in koordinaterna i formeln? Jag provade att räkna om det till enbart minuter och stoppade in värden och formel i exel men resultatet av uträkningen blev ju inte rätt så något fel gör jag ju.

nifelheim: "Static Navigation" är inte på. Hittade ett forum där någon hade samma problem som mig med ett liknande GPS-chip från samma tillverkare. Personen ville ändra lika som jag för att få mindre lynniga fart och kurs-angivelser. Svaret var att det inte gick att ändra det utan det enda som gick att göra var att aktivera "Track Smoothing" som dämpade lite eftersom den "rätade ut vägen" lite som jag förstod det, det var dock inte samma sak som att ta positionerna med längre tidsintervall. Jag har inte testat det ännu, ska göra det senare för att se hur det blir då.

Icecap: Det låter på dig som att jag inte kan få bättre precision än vad jag har med min GPS-sensor, bara för att jag kör sakta. Det är väll inte farten som avgör utan sträckan mellan positionerna? Om man räknar ut kurs och fart med långsammare frekvens så ökar ju precisionen.
T.ex. vid 2 knop kommer man ca 1 meter per sekund. GPS:en räknar ut kursen ca 1 gång i sekunden vilket betyder att kursen alltid är uträknad utifrån två positioner som ligger en meter ifrån varandra(jag är faktiskt förvånad att kursen inte pendlar MER än 20 grader).
Låter man det istället gå 30 sekunder så blir det 30 meter mellan positionerna som används till beräkningen. Om nu noggrannheten är +-15 meter så borde det ju bli så att så länge det är kortare än 30 meter mellan positionerna så finns det en risk för att få vilken kurs som helst.

Tänker jag helt fel eller vadå?

Jag börjar nog att knacka ihop ett assembler-program med look-up tabell nu, så jag kommer någon vart :-)
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av Icecap »

Att använda en sträcka på 1m för att räkna kursen ut och noggrannheten anges till t.ex. ±5m är ju ganska enkelt inte användbart, det ser du själv. Du kan illustrera det grafisk vid att rita 2 lådor med en sidolängd på upplösningen. Deras avstånd ska vara 1m från centrum till centrum. Sedan kan du se hur många sätt och vinklar du kan placera en 1m pinne inom dessa lådor utan att den sticker ut från någon av dom. Tips: det är sjukt många!

Men att göra en fördröjning på t.ex. 30 mätningar gör att det blir en ganska annan sträcka att mäta över och därmed mycket mer exakt. Och det kan illustreras vid att ta lådorna ovan och placera dom med 30m centrum till centrum, där blir det ganska lätt att se att största skillnaden inte varierar så värst mycket.

Jag skulle vilja påstå att fördröjningen som behövs för att få en bra riktning helt enkelt beror på hastigheten och att avståndet mellan onoggrannhets-lådorna ska vara minst lika stor som lådornas längd eller bredd och gärna det dubbla.

Vid 1m/s kan det alltså räcka med kanske 5-10 sekunders fördröjning på positionerna innan du får en bra och stabil kurs.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av Glattnos »

Icecap: Okej, det bekräftar det jag skrev. :-)

Sodjan: Jag skulle vilja segla till Tunisien men i övrigt var det mest en slump att positionen hamnade där. Jag tänkte på medelhavet och gissade på en koordinat som jag trodde var där någonstans :-)
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av Andax »

Glattnos,

När du beräknar bäringen gäller det att veta vad COS och SIN förväntar sig för vinkelenheter. I vissa programspråk skall vinklarna vara i grader (0 till 360 grader, alternativt -180 till 180 rader) och i andra (som C etc) förväntas vinklarna vara uttryckta i radianer (dvs mellan 0 och 2*PI, alternativt mellan -PI till PI).

bearing =ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1), SIN(lon2-lon1)*COS(lat2))

I formeln går det att göra ett antal förenklingar och approximationer. Tex SIN(x) ungerfär lika med x då x är nära 0. Dvs SIN(lon2-lon1) kan sättas som (lon2-lon1). För små skillnadr blir felet litet.

Sen kan man t.ex. taylor expandera sin(a+x) och cos(a+x), där a är en konstant och x är en avvikelse kring denna punkt.
Dvs har man kända tabellvärden kan man med bara multiplikation och addition räkna fram ganska noggranna värden när man befinnersig nära den fixa punkten.

atan2 är i princip samma sak son atan fast med korrekt kvadranthantering. gär att lösa med lite if-satser och vanlig atan (som också går att tabellera eller taylor utveckla).
Användarvisningsbild
BER
Inlägg: 399
Blev medlem: 9 mars 2005, 00:02:10
Ort: Östergötland

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av BER »

Går det inte göra enklare?

Som någon skrev tidigare går det att skala longituden beroende på latituden. Om området begränsas till att vara inom norden så borde skalningen bli hyffsat korrekt.

På det lokala planet inom en nautisk mil så bör förhållandet mellan lat,lon och x,y vara linjärt utan att få skalningsfel med ansatsen att endast ett par graders noggrannhet behövs. Det vill säga skala bara om lat,lon (med justering enligt ovan) beräkna delta x och y. Beräkna kursen med arctan2.

Om en noggrannhet önskas på +- 2° så plocka en koordinat tillräckligt långt bort (60 m) som besökt tidigare och räkna delta. (60 m borde fungera om positionsnoggrannheten är inom 1 m på GPS:en, har inte kontrollerat uträkningen så den kan vara fel)
Att medelvärdesbilda positionen vet jag inte om det blir så bra i alla situationer. Felfördelningenmönstret beror på många faktorer bland att på vilka satelliter som viktas in i positionslösningen, vilket i sin tur kan vara olika beroende på vilken sida GPS mottagaren är om till exempel en ö. Detta kanske inte är ett problem om man inte tänkt använda kursen för att pressionsnavigera mellan några grynnor eller liknande.

Står man däremot kvar en hel ”GPS:period” så att satelliterna är tillbaka i samma konstellation som när mätningen började så erhåller man i de flesta fall en medelposition som är närmre den faktiska positionen än vad de enskilda positionerna under mätningen varit.
benpalm
Inlägg: 37
Blev medlem: 17 januari 2011, 03:27:41
Ort: Falun
Kontakt:

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av benpalm »

Påminner mig om ett projekt där jag testade en kompass. Den spottade ur sig
konstiga värden då o då. Jag gjorde så att jag slängde bort det värdet som
avvek för mycket...

Hittade kodsnutten där man matar in värdet i 1/10-dels grader
Det är en array med värden (m_compSamples) som medelvärdesbildas.
Ligger värdena på bägge sidor om 0 grader så justeras för det.
Tror det är nåt sånt. Ok, lite quick'n dirty...
:

Kod: Markera allt


#define NBR_OF_CMP_SAMPL    5
static SHORT m_compSamples[NBR_OF_CMP_SAMPL];
static BYTE m_cmpSamplFillPos = 0;

///////////////////////////////////////////////////////////////////////
SHORT SM_CompassMakeAverage(SHORT sample)
{
    BYTE index, loop, remove;
    SHORT tmp;
    SHORT tempSampl[NBR_OF_CMP_SAMPL];
    BOOL hitHigh = FALSE, hitLow = FALSE;
    m_compSamples[m_cmpSamplFillPos++] = sample;
    if(m_cmpSamplFillPos >= NBR_OF_CMP_SAMPL) m_cmpSamplFillPos = 0;
    // Check if the samples are on both sides of zero
    for(index=0; index < NBR_OF_CMP_SAMPL; index++) {
        tmp = tempSampl[index] = m_compSamples[index];
        if(tmp > 2700) {
            hitHigh = TRUE;
        }
        else if(tmp < 900) {
            hitLow = TRUE;
        }
    }
    // Normalize if so
    if(hitHigh && hitLow) {
        for(index=0; index < NBR_OF_CMP_SAMPL; index++) {
            if(tempSampl[index] < 1800) {
                tempSampl[index] += 3600;
            }
        }
    }
    // Remove the one that is most away 
    // 1. Bubble sort
    for(loop=0; loop < NBR_OF_CMP_SAMPL; loop++) { 
        for(index=1; index < (NBR_OF_CMP_SAMPL); index++) {
            tmp = tempSampl[index-1];
            if(tmp > tempSampl[index]) { // swap
                tempSampl[index-1] = tempSampl[index];
                tempSampl[index] = tmp;
            }
        }            
    }
    // Remove the most extreme value. Must be highest or lowest
    if( (tempSampl[1]- tempSampl[0]) > 
        (tempSampl[NBR_OF_CMP_SAMPL-1]- tempSampl[NBR_OF_CMP_SAMPL-2]) ) {
        remove = 0; // Remove this pos
    }
    else {
        remove = NBR_OF_CMP_SAMPL-1; // Remove this pos
    }
    
    // calculate mean value
    tmp = 0;
    for(index=0; index < NBR_OF_CMP_SAMPL; index++) {
        if(index != remove) {
            tmp += tempSampl[index];
        }
    }
    
    tmp /= (NBR_OF_CMP_SAMPL-1);
    if(tmp >= 3600) tmp -= 3600;
    
    return tmp ;
}

Gimbal
Inlägg: 8685
Blev medlem: 20 april 2005, 15:43:53

Re: GPS-kurs mjukvaru-dämpning, AVR assembler

Inlägg av Gimbal »

Glattnos skrev:Jag får ju en kurs ca 1 gång i sekunden från sensorn. Men den kan pendla rejält när man kör sakta(fast man kör rakt).

Blir det inte såhär med ditt exempel(som fungerar för övrigt):
Om man ligger på kurs 0 så blir hälften av värdena ca 0-10 grader och hälften ca 350-359. Då blir genomsnittet typ 180 vilket är åt fel håll.

Jag skulle börjat med att testa och köra ett rullande medelvärde på kursen du får från GPS'en. (Mest för att det är lättast)

Problemet runt 359-0 grader löser du med några "if" satser där du kollar om det nya värdet skiljer mer än 180 grader från det förra, dra då ifrån eller lägg till 360 grader beroende på åt vilket håll det skiljer. Du kommer då få värden som överstiger 360, tex 370, eller går under 0 text -5. Men det är inga problem för medelvärdesberäkningen. Fixa bara till resultat innan du presenterar det.
Skriv svar