-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Arduino kann einen "acos" nicht berechnen. [gelöst

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.11.2010
    Beiträge
    11

    Arduino kann einen "acos" nicht berechnen. [gelöst

    Anzeige

    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.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.07.2005
    Beiträge
    232
    hast du schon mal 1/cos versucht?
    Geht das auch nicht?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.11.2010
    Beiträge
    11
    Was soll ich mit dem 1/cos denn machen? Das gibt mir ja keinen Winkel als Lösung..

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Was heisst denn "es wird nichts angezeigt"?
    Es wird ncihts ausgegeben? Die Variable ist Null?
    "Leer" kann sie ja nicht sein.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    06.11.2010
    Beiträge
    11
    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.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.02.2010
    Beiträge
    167
    man, ..mach ein 5 zeiliges programm für den arduino und probier erst mal ob acos richtig angenommen wird.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Hmm, du könntest mit einer Tabelle arbeiten, ist eh schneller.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    06.11.2010
    Beiträge
    11
    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.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Ne Sinus, bzw. Kosinus Tabelle

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Zitat Zitat von Zimt Creme
    ... 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 vom 19. April 2010, 09:36), die für meine Zwecke ausreichend schnell und ausreichend genau ist.

    Zitat Zitat von Zimt Creme
    ... Wobei ich ... doch gerne den Fehler finden würde.
    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 . . .

    Bist Du mit vs1 vielleicht ausserhalb des Definitionsbereiches ?

    ............
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •