PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Posenberechnung



XAro
17.01.2009, 10:19
Hallo,
ich habe vor, mittels Odometrie die jeweilige Pose (x, z, theta) des RP6 zu berechnen. Ich weiß, dass das vermutlich verhältnismäßig ungenau werden wird, aber versuchen möchte ich es trotzdem. Mein Problem dabei ist es nun, die einzelnen Koordinaten auf Nachkommastellen zu berechnen. Das Problem tritt beispielsweise dann auf, wenn der RP6 nicht mehr eindeutig in x- bzw in z-Richtung fährt. Hierbei müsste ich mit cos() und sin() weitermachen um die "genaue" Position zu bestimmen, und genau da gibt es jetzt das Problem: Er berechnet mir cos() und sin() nur ganzzahlig. Gibt es da ne Möglichkeit, wenigstens auf ein, zwei Nachkommastellen cos(), bzw. sin() zu berechnen?
Ich habe da auch schon mit einem Kumpel drüber gerätselt, jedoch sind wir bisher auf keine Lösung gekommen.
Ich hoffe ihr könnt mir weiterhelfen.

Dirk
17.01.2009, 10:32
Er berechnet mir cos() und sin() nur ganzzahlig. Gibt es da ne Möglichkeit, wenigstens auf ein, zwei Nachkommastellen cos(), bzw. sin() zu berechnen?
?
Ich denke 'mal, dass du die math.h includiert hast und deren Funktionen nutzt. Dann definierst du die Variablen als double und bekommst die nötigen Nachkommastellen.

Gruß Dirk

XAro
17.01.2009, 10:48
hm...also die math.h habe ich includiert und die werte speicher ich auch in einer double-variablen. Es könnte sonst noch sein, dass es einfach an der Ausgabe liegt. Wie ist es denn möglich eine "Double-Zahl" über den RP6 auszugeben? (Sorry, dass ich hier solche Fragen stelle, aber ich habe dazu nichts gefunden und bin noch absoluter Frischling bzgl. des RP6)

Gruß
XAro

oberallgeier
17.01.2009, 11:01
Die Sinusfunktion (und ihre Geschwister) ist in der AVRLib math.h definiert als

double sin ( double __x ) (http://www.nongnu.org/avr-libc/user-manual/group__avr__math.html#g46e799ece7e1dd323d22cdb53c8 1cd73)

da kommt die Variable sowieso als double zurück. Wenn ich mich nicht total irre, rechnet der GCC intern diese Funktionen als single - das spielt aber für Dich sowieso keine Rolle: Es sind auf alle Fälle Argument und Rückgabewert Gleitkommazahlen im double-Format und keine Ganzzahlen.


... Wie ist es denn möglich eine "Double-Zahl" über den RP6 auszugeben? ... :-k Leider kann ich Dir zum RP6 nicht helfen. Aber wenn Du nicht weißt wie das ausgegeben wird - dann ist wohl Deine Ausgabekonvertierung das Problem.

Dirk
17.01.2009, 15:09
Hallo XAro,

Es könnte sonst noch sein, dass es einfach an der Ausgabe liegt.
Ja, der RP6 hat in seinen Libs keine fertige Ausgabefunktion für Gleitkommazahlen.

Hier eine Funktion, die eine float Variable in einen String umwandelt, den man dann mit den RP6-Befehlen ausgeben kann:

/**
* This function makes a string out of a float value.
* Example:
* float myvar = 11.34;
* char text[6];
* float2string(myvar,2,text); // 2 Dezimalstellen
* writeString(text); // o.ä. z.B. auf das Display
*/
void float2string(float value, int decimal, char* valuestring)
{
int neg = 0;
char tempstr[20];
int i = 0;
int j = 0;
int c;
long int val1, val2;
char* tempstring;
tempstring = valuestring;
if (value < 0) {neg = 1; value = -value;}
for (j=0; j < decimal; j++) {value = value * 10;}
val1 = (value * 2);
val2 = (val1 / 2) + (val1 % 2);
while (val2 !=0) {
if ((decimal > 0) && (i == decimal)) {
tempstr[i] = (char)(0x2E); //0x2E = Punkt
i++;
}
else {
c = (val2 % 10);
tempstr[i] = (char) (c + 0x30); //0x30 = Null
val2 = val2 / 10;
i++;
}
}
if (neg) {
*tempstring = '-';
tempstring++;
}
i--;
for (;i > -1;i--) {
*tempstring = tempstr[i];
tempstring++;
}
*tempstring = '\0';
}
Gruß Dirk

XAro
17.01.2009, 16:38
Hallo Dirk,

vielen vielen Dank für deine Methode :D . Das Programm läuft und ich kann weiterarbeiten. Du hast mir sehr weitergeholfen!! Danke auch an oberallgeier!!

TobeFFM
20.01.2009, 20:38
Xaro, hastes schon fertig implementiert? ich hab mithilfe der odometrie und koppelnavigation auch schon bewegungsmuster erstellt, aber auf nem uni-roboter, und selbst dort war es ziemlich ungenau..
Ich fänds super, wenn du mal ein Bild der errechneten Strecke posten könntest, weil ich vorhatte, das auch für den RP6 zu implementieren..

andieh
24.01.2009, 13:21
Das interessiert mich auch brennend. irgendwie ist das rumgefahre und lediglich auf Objekte reagieren dann doch irgendwie öde!

mare_crisium
24.01.2009, 19:44
Hallo, zusammen!

Vielleicht hilft Euch die angehängte pdf-Datei hier

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=399422#399422

weiter?

mare_crisium

TobeFFM
28.01.2009, 10:20
hi mare_crisium, danke für den link. ne, mir gings eigentlich nicht um die diversen möglichkeiten, wege zu messen, sondern speziell um die koppelnavigation mit den radencodern des rp6..

Hast du deine Messdaten schon mal geplottet und z.B. mit überlagerten Fotos von oben vom Robo verglichen? Sowas wäre mal interessant..Wenn das genau genug ist könnte ich mir überlegen gegen meine Überzeugung doch mal nen Maussensor zu verwenden...

So wie's aussieht meldet sich Xaro nicht mehr, also heisst das wohl doch auf gut Glück selbst implementieren..

mare_crisium
28.01.2009, 14:58
TobeFFM,

ja, ich meinte auch die Koppelnavigation - so wie in der Datei "Koppelnavigation_Algorithmus_104b.pdf" beschrieben, die Du unter dem Link findest. Die ist nämlich unabhängig davon, welche Methode man zur Wegmessung verwendet, ;-) dafür brauchst Du nicht gleich auf Maussensoren umzusteigen!

Um den Algorithmus anzuwenden, musst Du nur zwei Werte immer wieder messen, um den Ort zu berechnen: Den Weg s und den Drehwinkel delta phi, die seit der vorangegangenen Messung zurückgelegt wurden.

Beide Werte kannst Du auch aus den Drehencoder-Messwerten ausrechnen, wobei die Berechnung davon abhängt, wie Deine Radencoder genau ausgewertet werden. Meistens (z.B. beim Asuro) wird die Zeit gemessen, die vergeht, während sich das Rad um einen Sektor (oder Schlitz) weiterdreht. Andere zählen die Anzahl Sektoren (oder Schlitze), die während eines festen Zeitintervalls an der Lichtschranke vorbeikommen.

Welche der Methoden verwendet Dein RP6?

Ciao,

mare_crisium

P.S.:
Geplottete Bahnkurven (wenn auch ohne Photo) sind in dem Thread auch zu sehen
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=398008#398008

TobeFFM
28.01.2009, 22:42
ich glaub ich hab mich falsch ausgedrückt.. wie koppelnavigation funktioniert weiß ich, wie man es implementiert auch.
das einzige was mich hier interessiert ist die genauigkeit der _drehgeber_ des rp6 und ob es reicht, die zu verwenden um vernünftige ergebnisse zu erhalten