Die Frage habe ich wohl "etwas" unterschätztZitat von HannoHupmann
Zitat von HannoHupmann
@5Volt Junki, das wäre ja noch der einfache Teil, denn das ist nur die Bewegung Fusspitze von der Endposition zurück in die Ausgangsposition. Hier kann man ohne Probleme eine feste "Bahn" vorgeben die der Roboter immer abfährt. Wobei allerdings schon wieder die Frage ist, ob es immer die gleiche Anfangsposition sein sollte oder ob die sich auch ändert.
Im Moment Kämpfe ich mehr damit dass ich eine Bewegung haben: z.B. Gerade aus laufen und dazu noch eine Lage des Körpers z.B. 10° um die x-Achse udn 14° um die y-Achse. Daraus ergeben sich nun eine beliebige Anzahl von zwischenpunkten die alle irgendwie berechnet und der Bein IK (die rechnet daraus dann die Servowinkel s0, s1 und s2) übergeben werden müssen. Mein Problem ist also weniger wie die Winkel für die Servos ermittelt werden sondern mehr wie die sogenannte Trajektorie erstellt wird und an die IK übergeben. Dummerweise will ich keinen Industrieroboter programmieren mit fester Bahnbewegung von Punkt A zu Punkt B, das wäre ja wieder einfach sondern ein System entwickeln das auf die Lageänderungen zu jedem Moment reagieren kann und sich entsprechen anpasst.
Abgesehen davon arbeiten im Vinculum 8 Microcontrollern a 10MHz parallel, die natürlich alle gleichzeitig arbeiten möchten und trotzdem zusammen spielen sollen.
Die Frage habe ich wohl "etwas" unterschätztZitat von HannoHupmann
Zitat von HannoHupmann
Bei deinem Gerade auslaufen und Drehen fehlen ein Paar angaben. z.B. Wie schnell soll er sich drehen, oder soll die Drehung bis zum ende des Geradeaus Laufens fertig sein? Wenn ja, fehlt eine Angabe zur Strecke
Ohne dieser Angabe wird es schwer eine Bewegung zu berechnen.
Am einfachsten dürfte es sein, wenn du eine Maximal Geschwindigkeit vorgibst für die Achsen und das Drehen und dann den gemeinsamen Teiler Aus alles Bewegungen zu ermitteln.
Also X_max 1cm/s und Drehung_max 1°/s bei einer Bewegung um X 50cm und 14°:
Daraus würden sich dann eine Bewegung mit X=1cm/s und Drehung von 14/50°/s ergeben. Hoffe du verstehst, was ich meine.
Oder aber du musst all deinen Bewegungen eine Geschwindigkeit vorgeben, ähnlich wie bei G-Code einer CNC-Maschine.
@robin schon richtig, das hab ich versucht mit der Analogie zu einem Industrieroboter zu zeigen. Bei dem wäre es in der Tat einfach: ein Tool-Center-Point (TCP) wird in relation zum Basis Koordinaten System bewegt. Dabei wird die Bewegung als Verschiebung und Rotation des TCP dargestellt. Die Bahn auf der sich der TCP von A (Ausgangspunkt) zu B (Endpunkt) bewegt wird als Bahnkurve bezeichnet. Diese kann im einfachsten Fall eine Gerade sein oder eine komplexe Kurve. Die eigentliche Bewegung wird nun beliebig viele kleine Teilschritte zerlegt (interpoliert) und an die Inverse Kinematik des Roboters übergeben und mit hilfe der DH-Matrix die Gelenkwinkel berechnet. Dazu kommt noch deine erwähnte Vorgabe der Geschwindigkeit. Soweit ist das für Industrieroboter auch recht verständlich. Für eine Geradeausbewegung eines Hexapods könnte ich das gleiche Prinzip anwenden. Ich hatte eben keinen TCP sondern eine Fussspitze die auf einer Geraden entlang geführt wird und über die IK kann ich jeden einzelnen Servowinkel berechnen. Das ganze für 6 Beine mit unterschiedlichen Geraden wenn es keine Bewegung "gerade aus" ist. So hab ich es bisher bei meinem Phoenix² gemacht und es funktioniert auch gut. Vorgabe der Richtung + Anzahl der Schritte + konstante Geschwindigkeit oder Vorgabe der der x,y Koordinaten des Drehpunkts + Wieviel Grad um den Drehpunkt gedreht werden soll + Konstante Geschwindigkeit. Allerdings konnte ich immer nur eine Vorgabe verarbeiten und ein Schritt bestand aus einer definierten Länge die nicht unterschritten werden konnte.
Jetzt möchte ich das ganze etwas komplexer machen:
1) Die Länge eines Schritts soll sehr viel kleiner werden
2) Die Lage des Körpers soll wärend der Schritte ausgeglichen werden
3) Die Füsse sollen selbst entscheiden wann der Fuss gehoben wird und wieder an den Anfang gefahren wird.
4) Alle Beinbewegungen sollen unabhängig voneinander parallel laufen
Im Prinzip kann der Roboter eine Bewegung vollführen die ihn sagen wir 1m gerade aus laufen lässt und dabei eine vollständige Drehung des Körpers um 360° durchführt. D.h. die translatorische und rotatorische Bewegung überlagern sich. Dabei stosse ich auf zwei Probleme:
A) Wie erzeuge ich eine Bahnkurve die genau diese Bewegung dar stellt
B) Wie müssen die daraus resultierenden Bahnkurven für die Beine 1 bis 6 aussehen
C) Wie übergebe ich die resultierenden Bahnkurven an die Inverse Kinematik der Beine
D) Wie kann ich berücksichtigen, dass die resultierende Bahnkurve bei jedem Schritt durch die Lageregelung des Roboters verändert wird
Bisher habe ich auf Videos zu Hexas immer nur gesehen wie die Bewegungen nacheinander gemacht werden und nicht gleichzeitig. Es müsste aber auch möglich sein, dass alles gleichzeitig passiert und mein Anspruch für das Vinculum ist kein geringerer.
Anderes Thema:
Gewicht: Gerade habe ich mein Hexabot gewogen und er bringt jetzt mit Akkus und allem 2,8kg auf die Waage. D.h. bei 4 Beinen 0,7kg pro Bein bzw. 0,7kg*g =7N . Die Oberschenkellänge beträgt 14,5cm und damit ergib sich ein Drehmoment von 101,5Ncm was für meine Servos zuviel ist da die nur 73Ncm schaffen. Also heißt es nun entweder auf 5 Beine am Boden gehen und dann würden es immernoch 81,2Ncm sein oder stärkere Servos verwenden. Alternativ: Diät und >0,8kg abnehmen! Zumindest wenn ich weiter den vollen Arbeitsraum ausnutzen möchte.
Wird der volle Arbeitsraum nicht ausgenutzt und wie geplant die Beine nur im 45° Winkel eingesetzt verändert sich der Abstand von Schulter zu Fusspunkt auf 10,25cm womit der Schulterservo gerade so 71,75Ncm benötigt was ganz knapp unter den 73Ncm bleibt. Da ich aber noch etwas Gewicht zuladen muss (Sensoren, Platinen weitere Komponenten) bleibt mir wohl nur die Lösung mit besseren Servos und Gewicht abnehmen.
Hallo,
Ich nehme an, die Schritte werden trotzdem zentral koordiniert werden? Ansonsten könnte es ja zu Problemen kommen, wenn etwa die beiden hintersten Beine gleichzeitig der Meinung sind, einen Schritt machen zu müssen?3) Die Füsse sollen selbst entscheiden wann der Fuss gehoben wird und wieder an den Anfang gefahren wird.
Alles was du brauchst, sind Transformationen, die dir aus der Position des Robotermittelpunkts und den drei Winkeln, die die Drehungen des Körpers beschreiben, die Positionen der einzelnen Befestigungspunkte der Beine berechnet. Dann kannst du ja mit mehr oder weniger Standard-IK die Servowinkel bei bekanntem Fußpunkt berechnen.A) Wie erzeuge ich eine Bahnkurve die genau diese Bewegung dar stellt
"Bahnkurve" klingt für mich viel zu sehr nach "Berechnung vor Ausführung". Wenn du hingegen für jeden Punkt die Servowinkel nacheinander berechnest (z.B. du veränderst für eine Vorwärtsbewegung die X-Koordinate schrittweise um ein gewisses delta) und für die Lageregelung statt der Soll- die Istwinkel verwendest, sollte alles möglich sein.D) Wie kann ich berücksichtigen, dass die resultierende Bahnkurve bei jedem Schritt durch die Lageregelung des Roboters verändert wird
Schöne Grüße
Die Bewegung sollte doch theoretisch kein Problem sein, Du hast ja 2 Koordinatensysteme:
1. Das des Raumes in dem du dich Bewegst
2. Das des Roboters
(3-9). Die der einzelnen Beine, sind aber Ausschnitte von 2.
Das erste System gibt die Bewegung deines Torsos in X,Y,Z Richtung und die Ausrichtung des Roboters angegeben. Es wird ein Vektor zwischen der Aktuellen Position des Roboters und dem Zielpunkt gespannt (theoretisch sind hier auch Kurven möglich). Also wie wenn sich der Roboter auf einer Karte von Punkt A nach Punkt B bewegen würde und in Richtung Süden schaut.
Jetzt wird ein kleines Teilstück der Bewegung ins zweite System umgewandelt. Dieses liegt um alle Achsen gedreht im ersten System und dem entsprechend wird das Teilstück von System 1 in 2 umgewandelt. Jetzt können auf dieses Teilstück in System 2 die Korrekturmaßnahmen (vom vorherigen Teilstück) aufaddiert werden. Und diese Ergebnisse werden dann als delta X, delta Y,..... an die IK übergeben.
Die IK von jedem Bein wird zum Mittelpunkt des Torsos berechnet.
Die Randbedingungen von den Teilstücken werden durch die Maximalgeschwindigkeit des Roboters (evtl auch Minimalgeschwindigkeit wegen Rundungsfehlern als Drehung um 0,00001° pro step) bzw einer Vorgegebenen Geschwindigkeit festgelegt.
Damit sollten alle deine Bedingungen erfüllt sein und auch das laufen einer Kurve müsste machbar sein, solange die Teilstücke nicht zu groß sind, sonst wirds ein Dreieck .
Vorteil von dem Ganzen, du hast eine einfach Schnittstelle mit dem ersten Koordinatensystem auf dem Sogar noch Mapping integriert werden kann etc.
Frage bleibt die Aufteilung zwischen den Controllern. Die Beste Möglichkeit wird wohl sein, IK und Servoansteuerung auf einen Controller und alles was zur Berechnung der Lage und das addieren des Korrekturfaktors auf das "Gehirn" zu verteilen.
Dadurch bleibt dein IK+Servocontroller System fertig und muss "nie mehr" verändert werden (wers glaubt ). Die ganzen Änderungen im Code werden dann nur im "Gehirn" notwendig, bedeutet, hast du z.B. einen anderen Beschleunigungssensor zur Korrektur Berechnung verwendest muss an der IK nichts mehr geändert werden
@Ikarus_177 den Ansatz haten wir ein paar Beiträge weiter vorn auch schon diskutiert und an dem werde ich auch festhalten. Bahnkurve bedeutet in der Tat vorberechnet, da es ja eine Zentrale Vorgabe geben muss wohin der Roboter laufen soll. Das würde ich als die "Bahnkurve" definieren (sprich einen Meter gerade aus und dabei eine 360° Drehung). Allerdings ändert sich die Lage des Roboters wärend der Bewegung immer wieder so, dass diese "Vorberechnung" nur teilweise gültig ist und der Weg der zurück gelegt wird in entsprechende viele Teilstücke zerlegt ist. So wie du das mit dem dx, dy gemacht hast nur dass es bei mir noch ein dh (Höhe) geben wird für jeden "Schritt"
Dein Einwand mit beide Beine hinten oder beide Beine vorne ist richtig und muss entsprechend im Programm verhindert werden, ich weis nur noch nicht ob das Zentral oder Lokal passiert.
@robin
Genau so denke ich dass es in der theorie funktionieren könnte. Das ist im Endeffekt ziemlich ähnlich zu dem was Ikarus_177 beschrieben hat. Die Bewegung im Raum wird zerlegt in Teilschritte und dann in Servobewegungen umgerechnet.
Langsam ergibt sich auch für mich ein Bild wie es aussehen könnte und schwierig wird es nun nur das ganze theoretische Gebilde in einen funktionierenden Code umzusetzen (insbesondere der Mathematik) und dann auf meine µC Struktur zu verteilen.
Ich verwende wieder (wie bei meinem Phoenix²) einen Propeller Chip von Parallax der hat 8 µC integriert die alle unabhängig voneinander arbeiten können und sich einen gemeinsamen Memory Pool teilen.
Im Moment denke ich, dass jeder Cog (so nennen die die einzelnen µC) ein Bein bekommt und damit zwei Cogs übrig bleiben für die zentrale Berechnung der Bewegung.
Da die Cogs auf einen gemeinsamen Memory Pool zugreifen können sie hier ohne Probleme ihr dx, dy und dh Werte abholen und selbstständig in die Servowinkel s0, s1 und s2 Umrechnen und ausführen. Nach jedem dx, dy, dh Schritt warten sie auf neue Werte oder halten die Position. Außerdem könnte jeder Cog selbst prüfen ob die Übergabewerte in Ordnung sind oder zu illegalen Servowinkeln führen (Berechnungsfehler) würden. Auch die Regelung, dass sich die Beine vorn oder hinten nicht gleichzeitig vom Boden abheben, sollte hier erfolgen.
Der Charm dieses µC sind wirklich die 8 unabhängig und echt parall arbeitenden Kerne. Bei meinem Phoenix² arbeite ich teilweise parallel, dort berechnet Cog1 die Bewegungen und Cog6 bewegt alle rechten Beine und Cog7 alle Linken. Abgesehen davon unterstützt die Programmiersprache inline Assembler Code, so dass man alles was "schnell gehen soll" in Assembler programmieren kann und alles übrige in SPIN. Achja eine sehr umfangreiche Tabelle mit Cosinus Werten ist auch schon fest implementiert, das heißt er berechnet den Wert nicht sondern schaut einfach nach, was gerade für diese Anwendung im Hexa sehr praktisch ist.
PS: Neue Servos für die Schultern hab ich trotzdem noch gekauft, um nicht in Probleme mit dem Drehmoment zu laufen, denn 73Ncm bei einer Belastung von 72Ncm im 45° Winkel fand ich dann doch zu kritisch. Daher gibt es jetzt einen Satz 142Ncm Servos (Zudem noch Digitale und keine Analogen) für die Schultern, womit selbst bei 90° ausrechend Leistung zur Verfügung steht und der Roboter auf ein Maximalgewicht von 3,9kg kommen dürfte (vier Beine immer am Boden).
Hi Hanno,
die Hexabots, die auf den Lynxmotion-Sets aufbauen, können rein von der Programmierung alles gleichzeitig ausführen. Das Problem bei denen ist nur das das Gamepad nicht genug Achsen hat.
Ich selbst verwende in meinem Mendel eine abwandlung von dem Code in Kombination mit Computerjoysticks. Laufen, den Körper um die Achsen drehn und kurven laufen gleichzeitig ist hier problemlos möglich.
Zum Beispiel kann man um ein Hinternis in einem Bogen herumlaufen und den Kopf des Bots immer auf das Hindernis gerichtet lassen.
Gruß
Daniel
Das Genie beherrscht das Chaos.
ICH bin das Chaos!
Gestern sind endlich meine Platinen gekommen um die LED Treiber zu testen. D.h. ich kann auch an der Front endlich weiter machen. Auch wenn ich immernoch keine Methode gefunden habe die LED Streifen so zu befestigen, dass sie ordentlich aussehen.
Die neuen Servos sind aus HongKong auf dem Weg zu mir, leider meldet sich der Horst nicht, der die neuen Teile fräsen sollte. Hoffe mal der ist nur im Urlaub, nicht dass ich mir eine neue Quelle suchen muss.
Lesezeichen