-
-
Neuer Benutzer
Öfters hier
Hi Meckpommer
Benchmark Sinusfunktion
wie gewünscht hier ein Benchmark für die Sinus/Arcsinusfunktion. Er berechnet, angefangen von 0 bis einschließlich 90 Grad jeden Sinus im Raster von 1 Grad Schritten, zur Kontrolle rechne ich diesen in der Schleife über arcsin wieder zurück. Die benötigte Zeit liegt laut Simulation mit AVR Studio bei 4 Mhz Takt bei 312014,5 uS ohne Optimierung wobei ich den Winkel in Degree berechne (siehe faktor). Mit Optimierung ist das mit 310218,0 nur unerheblich weniger.
52,25/43,25 uS gehen davon auf den Programmstart.
Anbei das Programm dazu.
#include <avr/io.h>
#include <math.h>
double winkel;
double sinus;
double winkel_back;
static double faktor_degree = 180/M_PI;
// winkelberechnung im degree
void main (void)
{ for (winkel = 0; winkel <= 90; winkel +=1)
{ sinus= sin(winkel/faktor_degree);
winkel_back = asin (sinus)*faktor_degree;
}
asm volatile("nop");
}
Wenn du mags kannst du mir die Ergebnisse deines Benchmark ja Mitteilen. Ich bin schon gespannt erwarte aber nur unwesentliche Unterschiede. Da diese wie ich glaube auf ähnlichen Algorythmen beruhen.
Derzeit arbeite ich beim mega8 mit 8Mhz internem Takt.
So nun weiter. Du sprichst hier von 6 Aufrufen (ich verstehe das so das du trigon funktionen damit meinst) pro Bein. Also ich komme da auf 3, ich muß allerdings dazusagen das ich den Offset zwischen Drehpunkt Hüfte-Knie derzeit noch vernachlässige. Natürlich verwende ich auch noch Berechnungen zum rechtwinkligen Phytagoras, diese sollten von der benötigten Rechenzeit aber eher eine untergeordnete Rolle spielen. Hier mein Code dazu.
uint8_t winkel_berechnen (double l,double b,double h)
{ /* in länge breite höhe */
double w1,w2,w3, ZW;
ZW = sqrt(l*l+(b)*(b));
w1 = asin (l/ZW)*faktor_degree; /*erscheint IO*/
ZW = sqrt(h*h+ZW*ZW);/* schräge lage b-h*/
if (ZW < schenkel2*2)
{ w3 = 2*asin((ZW/2)/schenkel2*faktor_degree; /*erscheint IO*/
w2 = 180-90-(w3/2)-asin(h/ZW)*faktor_degree;/* erscheint IO*/
if (w2 > 90)
w2 = 90;
winkel1 = w1;
winkel2 = w2;
winkel3 = w3;
return (1);
return (0);
}
Die Winkel zum oben genannten Code sind Hüft(1) Bein(2) Fuß(3)
Da du erwähnst das du für den Hüfte-Knie Offset nochmal 6 (trigon?) berechnungen benötigst gehe ich davon aus das deine Uberlegungen ein wenig "hinten rum" gedacht sind. Ebenso verhält es sich meines erachtens mit Knie-Fuß (6 geschätzte von dir).
Meine Überlegungen sehen dazu folgendermaßen aus.
Nimmt man an das das Bein komplett angewinkelt ist und rechtwinkelig weg steht, so ist die einzige Möglichkeit den Fuß weiter zu entfernen das Fußgelenk. Die einzige Möglichkeit den Fuß nach vorn/hinten zu setzten Das Hüftgelenk. Das Kniegelenk hat also die aufgabe beide feststehenden Größen miteinander zu verbinden und wird deshalb zuletzt berechnet.
Nun berechne ich zuerst die Richtung des Hüftgelenks als Vector zwischen l(änge) und b(reite) mit einem Zwischenergebnis der Entfernung des Fußes in der Horizontalen (dieses wird später nochmals verwendet).
Als nächstes wird (als zwischenergebniss)die Entfernung des Fußes im Raum berechnet (also die Raumdiagonale zwischen Pos 0,0,0 und Fußpunkt) unter verwendung des ersten Zwischenergebnisses als Kathete und der h(öhe).
Die If abfrage vergesen wir hier mal sie dient der Fehlerabfrage wenn die Raumkoordinate außerhalb des erreichbaren liegen.
Bei W3 wird der Winkel des Fußes berechnet, er steht durch die oben erwähnte Raumdiagonale fest. Man teilt die Raumdiagonale durch 2 (Gegenkathete) und verwendet die Beinlänge (Hypothenuse). Das Ergebniss ist der halbe Fußwinkel.
Bis jetzt habe wir 2 Winkel bereits berechnet, der 3. (w2) ist der Kniewinkel, Bedenkt man das die Summe aller winkel im Dreieck 180 Grad betragen muß und ich mit rechtwinkligen Dreiecken rechne steht der Gesamtwinkel des Hüftgelenkes zur raumdiagonalen schon fest (180 -90- w3/2) hiervon ist lediglich der Winkel der Raumdiagonalen zur Ebene abzuziehen.
Das wars schon!
Zugegeben so rein mit Text klingt es schwierig, ich habe daran auch ein wenig "geknüstert". Am besten ist wenn du dir Bilder dazu machst dann geht das.
Also brauche ich durch meine vereinfachungen (beide schenkel gleich lang; Offset vernachläsigt) 2* Phytagoras 3* Trigon. Das ganze klappt neben dem Interrupt der 20/18 Stervosignale mit 50HZ in ca. 1/10 Sec (berechnung für alle 6 Beine).
Zugegeben für eine Bahnsteuerung noch en bischen zu wenig, aber Point to Point mit 10 HZ ist doch schon mal was und als Option hab ich ja noch die 16 Mhz.
Als letztes sei noch angemerkt, es war von mir nie beabsichtigt alles (komplette Botteuerung) in einen Mega8 zu packen. Errinnert euch an den Anfang mir ging es eigentlich erst einmal darum reichlich Servos mit eimen ATmega8 anzusteuern. Da ich hierzu nichts wirklich befriedigendes im Netzt gefunden hatte hab ich mir gedacht das dieses evtl. auch für andere interressant sein könnte. Aufgrund der Verbleibenden Rechenpower habe ich mich dann mal an die Inverse Kinematik gewagt. Mal sehen wie es weitergeht.
gruß hopix
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen