PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo Controller



robin
29.09.2008, 20:03
Hi,

Ich bin gerade dabei einen Servo Controller zu Programmieren. Für einen 4-Beinigen Roboter.

Ich verwende AVR Studio und einen Mega 168 mit 20Mhz also sollte ich genug rechenleistung haben.

Er soll 12 Servos in 4 ms Steuern, was auch nicht weiter schwer ist.

In den restlichen 16 ms soll er berechnungen vornehmen, die etwas komplizierten sind:



Servo(1) = arctan(128-(x/y))

Servo(2) = arctan(Wurzel((128-x)²+y²))-4/(200-2)+180-y/2)

Servo(3) = 2*arcsin((1/2*wurzel((128-x)²+y²))/10)


x,y und z sind dabei die bewegungen, die der Körper des Roboters macht. Sie werden vom Hauptcontroller übertragen.

Meine Frage ist jetzt, wie kann ich am einfachsten einen arctan bzw arcsin und Wurzel rechnen?

Dafür gibts es ja keine vorgefertigten befehle.

Für arctan und arcsin werde ich warscheinlich eine Tabelle nehmen müssen. Und bei der Wurzel? über ein Näherungsverfahren?

ich hoffe ihr habt bessere Vorschläge, oder vlt auch einfachere.

ps. meine assembler kenntnisse sind nicht die besten (bin z.Z. bei timern und interupts) sollte aber nicht so wichtig sein, weil es sich nur um rechnungen handelt.

mfg robin

oberallgeier
29.09.2008, 21:54
Hi Robin,

sieht so aus, als würdest Du da irgendeine Rechenmethode abgekupfert haben aus einer Fachliteratur, mit der Du die Winkelstellungen der Gelenke aus den Raumkoordinaten der Bein-Endpunkte rechnest - oder Du hast Dir so etwas selbst hergeleitet. Dann könnte es eine Möglichkeit geben, das Ganze durch maximal eine Wurzel, Rest nicht-transzendent, zu rechnen, wenn Du den Pythagoras sinnvoll anwendest. Überleg Dir das mal.

Aber vielleicht rechnest Du etwas Anderes, zumal ja dasteht, dass x, y und z Bewegungen sind - na und dann musst Du halt diese transzendenten Funktionen durch (abgebrochene) Reihenentwicklungen (Taylor) rechnen. Dürfte zeitaufwendig werden, zumal ich bei fünften und siebenten Potenzen vermute, dass es NUR noch real Sinn macht. Selbst wenn Du eine Mathelib für eine Hochsprache bekommst - es wird böse viel Zeit kosten.

Da Du alles in Assembler rechnen willst fürchte ich, dass Du an eine Integerberechnung denkst. Na da kann/will ich jetzt nichts Konstruktives beisteuern. Ich habe auf nem m168/20MHz in C eine kurze Realrechnung gemacht (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=388755#388755) (fünfter Absatz im zitierten Posting) und die dauert schon reichlich. Vielleicht ist das für Dich ein Anhaltspunkt zu Deiner Annahme:
... Mega 168 mit 20Mhz also ... genug rechenleistung ...

robin
29.09.2008, 22:15
hi,

die Rechnungen habe ich mir selbst hergeleitet^^.

Die Möglichkeit mit nur einer Wurzel gibt es leider nicht, hab ich zumindest nicht erkannt^^.

Hab leider nur die hälfte verstanden von dem was du geschrieben hast (Studierst du Mathe??).
Dein vorschlag mit der Taylor näherung hab ich nicht verstanden, was bringt mir das, wenn ich viel zeit verbrauch? ich hab doch nur 16 ms und muss in dieser Zeit alles ausrechnen und evtl. noch 3 Byte empfangen.

Aus diesem Grund habe ich auch hier gepostet, damit mir eine einfachere vlt. sogar schnellere Lösung vorgeschlagen wird und nicht etwas noch komplizierters.

Aber trotzdem danke für deine bemühungen, was auch immer du mir damit sagen wolltest.^^

Ich werde sofern mir niemand eine besser Möglichkeit vorschlägt meine Berechnung mit 2 Tabellen Lösen (Arctan & Artcsin) und einer Näherung für die Wurzel hab da auch schonmal etwas gefunden, ist aber schon zu lange her, find ich jetzt auf die schnelle nicht mehr.

mfg robin

oberallgeier
30.09.2008, 00:02
Du hast nach einer Berechnung gefragt

... einen arctan bzw arcsin und Wurzel rechnen? ...Deshalb hatte ich Dir kurz die Möglichkeit skizziert, die ich kenne. Und diese Funktionen sind eben leider gerade die, die in Digitalrechnern am längsten brauchen. Das ist nicht meine Schuld - und ich weiß nicht, ob jemand schnelle Rechenmethoden kennt. Ich würde Dir ja gerne einen Arithmetik-Coprozessor empfehlen, wenn ich so etwas für Atmel-Controller kennen würde. Gibts aber wohl nicht. Hoffentlich hat jemand bessere Ratschläge.

Du hast natürlich recht, dass Du mit einer fertigen Tabelle vermutlich recht schnell arbeiten kannst. Das dürfte schon ein guter Weg sein.

Viel Glück.