PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei der Ausrichtung nach Gradzahl: rechts oder links herum drehen?



efb
31.03.2014, 18:03
Also ich verzweifle hier gerade an einem eigentlich klitzekleinem Problem :confused::

Ich habe einen RP6 mit Kompass. Die Werte liegen äquivalent zu 0-360 Grad als 0-255 vor.

Ich weis, in welche Richtung in Grad der RP6 zeigt und weis, wohin ich will.

Wie aber bekomme ich jetzt heraus, ob er sich zur neuen Gradzahl um die eigene Achse links- oder rechtsherum drehen soll? Er soll sich dabei natürlich in Richtung des kleinsten Winkels richten.

Das Problem ist der 0-Durchgang bei der Programmierung und jedesmal wenn ich denke, jetzt klappt es, macht er mit anderen Wertepaaren wieder etwas anders, als gedacht...

Ich brauche mal einen Denkanstoß, gibt es da eine Winkelfunktion, mit der man weiterkommt :(?

Vielen Dank und viele Grüße

Ernst

markusj
31.03.2014, 18:36
Das läuft auf eine einfache Fallunterscheidung raus. Wenn die Differenz (delta) von soll- und ist-Position betragsmäßig größer als 180° ist, muss sich der Roboter um 360° - abs(delta) drehen, die Richtung ist dabei invertiert (also bei delta < 0 in positiver Richtung, bei delta > 0 in negativer Richtung).

mfG
Markus

Peter(TOO)
31.03.2014, 18:53
Hallo Ernst,

Einfach zuerst die Differenz der beiden Werte bilden und zwar den kleineren vom grösseren Wert abziehen.
Ist der Wert grösser als 128 musst du über die 0 drehen.
Dann musst du noch feststellen ob die 0 links oder recht von Startwert liegt.



diff = MAX(start, end) - MIN(start,end);
if ( diff > 128 )
{
if ( start > end )
{
// linksrum
}
else
{
// rechtsrum
}
}
else
{
if ( start > end )
{
// rechtsrum
}
else
{
// linksrum
}
}


MfG Peter(TOO)

efb
02.04.2014, 18:59
Vielen Dank Euch beiden, jetzt läufts!

ich hab´s jetzt so gemacht:




if ((ziel-ist)<128 && (ziel-ist)>0)
{
rotate(30, RIGHT, 10,IDLE);
}
else
{
rotate(30, LEFT, 10,IDLE);
}




edit:

nun ist mir doch nach Monaten aufgefallen, das das gar nicht so funktioniert, keine Ahnung wieso mir das vorher als richtig erschienen ist...

Also doch lieber genau das Prinzip, so wie Peter(TOO) es geschrieben hat:

Bei mir ist Kompass der Istwert.



if (Kompass>ziel)
{
diff=Kompass-ziel;
}
else
{
diff=ziel-Kompass;
}


if ( diff > 128 )
{
if ( Kompass > ziel )
{

rotate(30, RIGHT, 10,IDLE);

}
else
{

rotate(30, LEFT, 10,IDLE);

}
}
else
{
if ( Kompass > ziel )
{

rotate(30, LEFT, 10,IDLE);

}
else
{

rotate(30, RIGHT, 10,IDLE);

}
}