Zimt Creme
08.02.2011, 14:50
Hi,
Ich versuche mich momentan an den ersten Schritten für Inverse Kinematik.
Das Problem ist, dass mir Processing 1.2 bei einem bestimmten Rechenschritt kein Ergebniss anzeigt.
Da alle anderen Werte normal ausgegeben werden, vermute ich es liegt an der Variablen vS1. Alle Werte die vS1 benötigen werden auch nicht angezeigt.
Zum Anzeigen benutze ich den Graph-Beispiel-Code.
Die Werte für vS11 und vS12 lassen sich anzeigen.
void setup() {
Serial.begin(9600);
}
/*Inverse Kinematik.
Ausgabe von Schulter- und Ellbogenwinkel.
Geometrische Lösung.
2 Armsegmente in ++Lage
*/
double vHandX = 11; //X-Wert der Armspitze
double vHandY = 11; //Y-Wert der Armspitze
double vOarm = 10; //Oberarmlänge
double vUarm = 10;//Unterarmlänge
double vImag;//Länge der imaginären Gerade zwischen Armspitze und Schulter
double vS11;//Zwischenrechnung für vS1
double vS12;//Zwischenrechnung für vS1
float vS1; //Winkel zwischen Oberarm und imaginärer Gerade
float vS2;// Winkel zwischen imaginärer Gerade und X-Koordinatenachse
float vS;// Winkel zwischen Oberarm und X-Koordinatenachse
float vE;//Winkel zwischen Oberarm und Unterarm
void loop() {
if (vHandX > 0 && vHandY > 0) //Um vorerst auf den ersten Quadranten zu beschränken
{
vImag = sqrt(sq(vHandX) + sq(vHandY));//Pytagoras
vS11 = sq(vOarm)-sq(vUarm)+sq(vImag);//Zwischenrechnung
vS12 = vS11 / (2*vOarm/vImag);//Zwischenrechnung
vS1 = acos(vS12);//Kosinussatz
vS2 = acos(vHandY/vImag);//Kosinus
if (vS1>vS2)//Abhängig vom Winkel zwischen Oberarm und Unterarm, die Berechnung von vS und vE.
{
vS = vS1;//s.o
vE = 2*PI-((vS1-vS2)*vImag/vUarm);//s.o
}
if (vS1<=vS2)//s.o
{
vS = vS1 + vS2;//s.o
vE = vImag*vS1/vUarm;//s.o
}
}
Serial.println(vS*100);//Ausgabe von vS und vE. 100fach vergrößert.
delay(10);//
Serial.println(vE*100);//
delay(10);//
}
Vielen Dank im Voraus.
Ich versuche mich momentan an den ersten Schritten für Inverse Kinematik.
Das Problem ist, dass mir Processing 1.2 bei einem bestimmten Rechenschritt kein Ergebniss anzeigt.
Da alle anderen Werte normal ausgegeben werden, vermute ich es liegt an der Variablen vS1. Alle Werte die vS1 benötigen werden auch nicht angezeigt.
Zum Anzeigen benutze ich den Graph-Beispiel-Code.
Die Werte für vS11 und vS12 lassen sich anzeigen.
void setup() {
Serial.begin(9600);
}
/*Inverse Kinematik.
Ausgabe von Schulter- und Ellbogenwinkel.
Geometrische Lösung.
2 Armsegmente in ++Lage
*/
double vHandX = 11; //X-Wert der Armspitze
double vHandY = 11; //Y-Wert der Armspitze
double vOarm = 10; //Oberarmlänge
double vUarm = 10;//Unterarmlänge
double vImag;//Länge der imaginären Gerade zwischen Armspitze und Schulter
double vS11;//Zwischenrechnung für vS1
double vS12;//Zwischenrechnung für vS1
float vS1; //Winkel zwischen Oberarm und imaginärer Gerade
float vS2;// Winkel zwischen imaginärer Gerade und X-Koordinatenachse
float vS;// Winkel zwischen Oberarm und X-Koordinatenachse
float vE;//Winkel zwischen Oberarm und Unterarm
void loop() {
if (vHandX > 0 && vHandY > 0) //Um vorerst auf den ersten Quadranten zu beschränken
{
vImag = sqrt(sq(vHandX) + sq(vHandY));//Pytagoras
vS11 = sq(vOarm)-sq(vUarm)+sq(vImag);//Zwischenrechnung
vS12 = vS11 / (2*vOarm/vImag);//Zwischenrechnung
vS1 = acos(vS12);//Kosinussatz
vS2 = acos(vHandY/vImag);//Kosinus
if (vS1>vS2)//Abhängig vom Winkel zwischen Oberarm und Unterarm, die Berechnung von vS und vE.
{
vS = vS1;//s.o
vE = 2*PI-((vS1-vS2)*vImag/vUarm);//s.o
}
if (vS1<=vS2)//s.o
{
vS = vS1 + vS2;//s.o
vE = vImag*vS1/vUarm;//s.o
}
}
Serial.println(vS*100);//Ausgabe von vS und vE. 100fach vergrößert.
delay(10);//
Serial.println(vE*100);//
delay(10);//
}
Vielen Dank im Voraus.