hast du schon mal 1/cos versucht?
Geht das auch nicht?
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.
Vielen Dank im Voraus.
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);//
}
hast du schon mal 1/cos versucht?
Geht das auch nicht?
Was soll ich mit dem 1/cos denn machen? Das gibt mir ja keinen Winkel als Lösung..
Was heisst denn "es wird nichts angezeigt"?
Es wird ncihts ausgegeben? Die Variable ist Null?
"Leer" kann sie ja nicht sein.
Es wird halt kein graph gezeigt. ob es 0 ist oder leer seh ich nicht. aber ich versteh auch nicht warum es nicht einfach gerechnet wird. bei den anderen Rechnungen geht ja auch alles.
man, ..mach ein 5 zeiliges programm für den arduino und probier erst mal ob acos richtig angenommen wird.
Hmm, du könntest mit einer Tabelle arbeiten, ist eh schneller.
5-zeiliges Programm zeigt, dass er den acos annimmt. Womit die Frage bleibt, warum es im obrigen Programm an der einen Stelle nicht geht.
Tabellen für was?
Wobei ich auch wenn es bessere Methoden gibt, doch gerne den Fehler finden würde.
Ne Sinus, bzw. Kosinus Tabelle
Einem ondit zufolge sei das Suchen von Arcos-Werten in Tabellen schneller als das Rechnen. Mal abgesehen vom Suchalgorithmus, von der möglichen Genauigkeit bei Zwischenwerten und dem Speicherverbrauch der Tabelle habe ich eine schnelle Näherungslösung besser gefunden (klick - Posting vom 19. April 2010, 09:36), die für meine Zwecke ausreichend schnell und ausreichend genau ist.Zitat von Zimt Creme
Eben, da liegt des Pudels arcus cosinus. Beim mega8 (und mega168, ~32 rechnet der GCC (meiner) korrekt, egal ob die Funktion in der Lib oder eine Näherungsformel genommen wird. Und das liegt ja nicht am Controller . . .Zitat von Zimt Creme
Bist Du mit vs1 vielleicht ausserhalb des Definitionsbereiches ?
............Bild hier
Ciao sagt der JoeamBerg
Lesezeichen