PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Atan2 problem bei kartesichen Koordinaten und Zielwinkel



Ritchie
17.09.2008, 08:15
Hallo Zusammen,

ich habe ein Problem mit atan2 bei der Verwendung von kartesichen Koordinaten und dem zu erechneten Winkel für die neue Zielposition.

Formel:

deltaWinkel = atan2( deltaY, deltaX ) ;

Habe ich den Wert DeltaY=0, jedoch einen deltaX , so erhalte ich immer einen deltaWinkel von 90°. Dies ist auch richtig nach der Definition von atan2.

Jedoch wenn ich eine Karte abfahre und Punkte anfahren will, welche immer den gleichen Y Wert haben (gerade), ist delta Y = 0.

Mein Robby dreht sich dann aber um 90°, obwohl er eigentlich gerade ausfahren sollte.

Was mache ich falsch? ](*,)

Gruss Ritchie

ikarus_177
17.09.2008, 12:53
Hi,

heißt das also, du vergleichst die Position des Roboters mit der Zielposition, berechnest daraus deltaX und deltaY und aus diesen Werten dann den Winkel?

Du bräuchtest dann noch eine Routine, welche den Punkt, auf dem der Roboter jetzt steht, auf den Null-Punkt des Koordinatensystems verschiebt, und den Zielpunkt in Bezug auf den anderen Punkt ebenfalls. Dann kannst du die atan-Funktion zur Winkelbestimmung einsetzen.


War jetzt nur mal mein Ansatz, da ich bei der IK meines Hexas derzeit mit ähnlichen Routinen zu tun habe.


lg ikarus_177

mare_crisium
17.09.2008, 13:29
Ritchie,

die Formel, die Du verwendest, setzt voraus, dass die Fahrtrichtung Deines Robby in Richtung der x-Koordinate zeigt. Wie mir scheint ;-) , ist Dein Robby anderer Meinung und tut so, als führe er in Richtung der y-Koordinate. Vertausche im Argument des atan2 mal DeltaX und DeltaY. Dann klappt's!

mare_crisium

Ritchie
17.09.2008, 15:12
Nun ja,

das mit X und Y tauschen schaue ich mir mal an:
Hier der Teilausschnitt des Code:



DeltaX = EndPosition.x - StartPosition.x; // Berechne Differenz zum Ziel
DeltaY = EndPosition.y - StartPosition.y; //
if ( DeltaY == 0.0 && DeltaX == 0.0 )
RotationAngle = 0.0;
else
{
RotationAngle = atan2( DeltaY , DeltaX ); // Berechne kürzesten Winkel in WinkelWert
// RotationAngle = fmod( (RotationAngle - BaseOrientation) , (ZWEI_PI));
}

if ( RotationAngle != 0.0 ) // Ist die Ausrichtung o.k.
{
TargetOrientation = BaseOrientation + RotationAngle; // Winkeldifferenz ermitteln
TargetOrientation= AjustToTwoPI(TargetOrientation ); // Anpassung an Vollkreis
RotationPulse = (int) (RotationAngle / RADPROIMPULS); // Endcoder Impulse der Strecke
}
else
{
TargetOrientation = BaseOrientation; // Ausrichtung hat sich nicht geändert
RotationPulse=0; // Keine Drehung notwendig. Ausrichtung korrekt
}


Gruss Ritchie

Ritchie
18.09.2008, 07:11
Hallo,

ich vermute meinen Fehler in der Handhabung des Winkels.

Innerhalb des Programmes arbeite ich mit Winkelangaben von 0-> 2PI.

ATAN2 arbeitet aber mit Angaben von -PI bis +PI.

Da werde ich wohl irgendwo noch einen Bug haben.

Gruss Ritchie