PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino kann einen "acos" nicht berechnen. [gelöst



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.

Ls4
08.02.2011, 15:53
hast du schon mal 1/cos versucht?
Geht das auch nicht?

Zimt Creme
08.02.2011, 16:07
Was soll ich mit dem 1/cos denn machen? Das gibt mir ja keinen Winkel als Lösung..

TobiKa
08.02.2011, 16:22
Was heisst denn "es wird nichts angezeigt"?
Es wird ncihts ausgegeben? Die Variable ist Null?
"Leer" kann sie ja nicht sein.

Zimt Creme
08.02.2011, 16:46
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. ](*,)

funkheld
08.02.2011, 16:56
man, ..mach ein 5 zeiliges programm für den arduino und probier erst mal ob acos richtig angenommen wird.

TobiKa
08.02.2011, 16:57
Hmm, du könntest mit einer Tabelle arbeiten, ist eh schneller.

Zimt Creme
08.02.2011, 17:12
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.

TobiKa
08.02.2011, 17:16
Ne Sinus, bzw. Kosinus Tabelle

oberallgeier
08.02.2011, 17:40
... Tabellen für was ...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 (http://forum.diegeodaeten.de/index.php?mode=thread&id=2946) vom 19. April 2010, 09:36), die für meine Zwecke ausreichend schnell und ausreichend genau ist.


... Wobei ich ... doch gerne den Fehler finden würde.Eben, da liegt des Pudels arcus cosinus. Beim mega8 (und mega168, ~328) rechnet der G CC (meiner) korrekt, egal ob die Funktion in der Lib oder eine Näherungsformel genommen wird. Und das liegt ja nicht am Controller . . .

Bist Du mit vs1 vielleicht ausserhalb des Definitionsbereiches ?

............http://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Arccos.svg/500px-Arccos.svg.png

funkheld
09.02.2011, 08:47
irgendeine variable muss als "volatile" bestimmt werden, weil der wert irgendwo im arduino nicht gehalten wird für die rechnung.

gruss