verschil tussen twee koersen uitrekenen

Status
Niet open voor verdere reacties.

pientertje

Gebruiker
Lid geworden
4 jan 2009
Berichten
28
Hallo,

Ik ben bezig met een robotje die moet kunnen navigeren. Deze moet dus een afwijking in de koers kunnen uitrekenen. Ik krijg de te sturen koers binnen met een gps + een berekening. De huidige koers komt uit een kompasje. Dit is me allemaal wel gelukt, maar loop ik tegen iets stoms aan. Hoe kan ik efficiënt het verschil tussen twee koersen uitrekenen. In pseudo code had ik wel dit bedacht:
Code:
A = gps
B = kompas

verschil = B - A

if (verschil > 180)
{
     tja, wat nu?

}

Alvast bedankt
 
zal je iets duidelijker kunnen zijn wat je precies wilt ik begrijp het niet helemaal
 
stel je wil het verschil weten tussen de koersen 20 en 100 graden. Dat is makkelijk. Doe 100-20=80. Maar nu heb je een probleem met de 360 graden grens, wat als je het verschil tussen 20 en 320 wil weten is dat 60 en niet 300.
 
Laatst bewerkt:
Hi,

ik vrees dat de hoek tussen 320 en 020 toch 60 graden is en niet 80

Je zou kunnen proberen (in dit geval).

Bereken het verschil naar 360 (in dit geval 360-320=40) en tel daarbij de hoek "rechts van de noord" op. Hou rekening met een plus/min verschil tussen de GPS-koers en de kompaskoers (ofwel GPS is al dan niet west van de kompasaanwijzing)
 
je hebt gelijk, stom.

Ja het verschil moet negatief zijn als je de te sturen koers links van je ligt en positief als deze rechts van je ligt.
 
je hebt gelijk, stom.

Ja het verschil moet negatief zijn als je de te sturen koers links van je ligt en positief als deze rechts van je ligt.

OK,
te sturen is kompas = B
GPS is gevaren = A

Stel:
GPS vertelt dat je 010 hebt gedaan bij een gewenste koers van 340.
In dit geval is het verschil: (A+360-B)*(-1)
GPS vertelt dat je 340 hebt gedaan bij een gewenste koers van 010
In dit geval is het verschil: A-B+360

Het lijkt dus "cosmetisch" maar het scheelt een vermenigvuldiging met -1

Je houdt nu alleen een probleem over bij een hoek van 180+ graden. Dan kun je beter voor anker gaan

EDIT: voor de duidelijkheid kun je dit even in een kompasroosje tekenen. Dan wijst het zich vanzelf

EDIT2: het volgende werkt voor mij als het noorden tussen kompas en GPS in ligt:

tel bij de laagste waarde 360 op en trek GPS van koers af. Dan heb je ook het teken meteen goed.
 
Laatst bewerkt:
Ik begrijp nog niet precies of dit is wat je wilt, maar volgens mij berekent dit de kleinste hoek van A naar B (negatieve hoek is linksom):

Code:
verschil = B - A;
if (verschil < 180)
    verschil = -360 - verschil;
if (verschil > 180)
    verschil = -360 + verschil;
 
Hi,
het puzzeltje liet me niet los:

@ Arjan B: ik mis de situatie voor de waarde 180

Ik begrijp uit de vraag dat Pientertje (of zijn robot) ergens via een bepaalde richting (koers) naar toe wil. De GPS vertelt 'm dat hij van de geplande richting afwijkt. Vraag: hoeveel moet ik in welke richting bijsturen om weer in de goede richting te komen.

Mijn oplossing zou als volgt zijn, zonder rekening te houden met de factor tijd en snelheid:
Draai de "taartpunt" rechtsom zo dat de koers 000 wordt (in de berekening)
en dan:

GPSwaarde := GPSwaarde +(360-geplandeKoers) // het verschil koers<->Noord bij GPS optellen, ongeacht waarde

IF GPSwaarde>360 then GPSwaarde=GPSwaarde-360

IF GPSwaarde<181 then // G=180 betekent linksom of rechtsom corrigeren is lood om oud ijzer
correctie=-GPSwaarde // correctie linksom
else
correctie=360-GPSwaarde // correctie rechtsom
end if

Dit is het meest efficiente wat ik er van kan maken

TOEVOEGING Met deze berekening moet je er rekening meehouden dat je route parallel aan de oorspronkelijk route gaat lopen. Je correctiehoek moet uiteindelijk groter/kleiner worden afhankelijk van de positie om op de lijn terug te komen.
 
Laatst bewerkt:
@city guy verschil = B - A. Als verschil = 180, dan maakt het niet uit of je linksom of rechtsom draait, dus kan het gewoon 180 blijven.

Ik zie nu wel een mintekentje verkeerd staan in mijn code:
Code:
verschil = B - A;
if (verschil < -180)
    verschil = -360 - verschil;
if (verschil > 180)
    verschil = -360 + verschil;
 
@city guy verschil = B - A. Als verschil = 180, dan maakt het niet uit of je linksom of rechtsom draait, dus kan het gewoon 180 blijven.

Ik zie nu wel een mintekentje verkeerd staan in mijn code:
Code:
verschil = B - A;
if (verschil < -180)
    verschil = -360 - verschil;
if (verschil > 180)
    verschil = -360 + verschil;

op basis van de vraag geef ik liever een waarde terug (positief of negatief) voor een afwijking 180. Aangezien Pientertje een plus of min situatie schetst moet bij een correctie van 180 graden ook linksom of rechtsom doorgegeven worden. Dat geldt niet als robotje ook moet kunnen beslissen op absolute waarde 180, maar die indruk heb ik niet. Jouw oplossing zal werken maar de 180 blijft voor het robotje een beetje: ".... en wat nu ... ?"
 
het zit zo, ik dacht dat het teveel zou afleiden, maar goed: uit de gps komt een positie. De robot heeft een positie waar hij heen moet. Dan rekent hij een rhumb line (een lijn, niet de kortste, maar wel over de hele route dezelfde koers. Deze lijn gaat dus niet met de kromming van de aarde mee.wiki) uit. Hier komt dus een koers uit, en deze koers kan elke seconde opnieuw berekend worden, daardoor blijf je niet parallel aan je route varen. Dan moet er uit het verschil tussen de kompaskoers en de te sturen koers een stuuruitslag berekend worden. Daarom moest ik het verschil weten.
 
het zit zo, ik dacht dat het teveel zou afleiden, maar goed: uit de gps komt een positie. De robot heeft een positie waar hij heen moet. Dan rekent hij een rhumb line (een lijn, niet de kortste, maar wel over de hele route dezelfde koers. Deze lijn gaat dus niet met de kromming van de aarde mee.wiki) uit. Hier komt dus een koers uit, en deze koers kan elke seconde opnieuw berekend worden, daardoor blijf je niet parallel aan je route varen. Dan moet er uit het verschil tussen de kompaskoers en de te sturen koers een stuuruitslag berekend worden. Daarom moest ik het verschil weten.

wordt dat ook niet een loxodrome genoemd? Maar goed: hoe staat het met de antwoorden op je vraag?
 
ik ga hier voor
Code:
verschil = B - A;
if (verschil < -180)
    verschil = -360 - verschil;
if (verschil > 180)
    verschil = -360 + verschil;

met een uitzondering voor verschil = abs(180)
 
ok,
mocht je gelegenheid hebben, dan blijf ik nieuwsgierig naar de oplossing vanhet 180-dilemma

signing off
 
het betreft een zeilbootje, dus daarom is bij 180 en misschien zelfs wel 170 tot 190 de keuze afhankelijk van de wind, gijpen of overstag.
 
In mijn stukje code staat positief voor rechtsom en negatief voor linksom. Dat had ik erbij gezegd ^^. Ik snap dus nog steeds niet wat het probleem is met verschil = 180, het is een positief getal dus hij gaat 180 graden rechtsom.

Edit: Al lees ik nu de laatste post van pientertje en zie ik inderdaad een reden om uitzondering te maken wanneer verschil rond 180/-180 ligt.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan