Zum Inhalt springen

Kinematik ​

Kinematik ist die Geometrie der Bewegung, ohne Kräfte. Die Vorwärtskinematik bildet Gelenkwinkel auf die Fußposition ab. Die inverse Kinematik bildet eine Fußposition zurück auf Gelenkwinkel ab. Die Jacobi-Matrix verknüpft Gelenkgeschwindigkeiten mit Fußgeschwindigkeiten. Diese Seite leitet alle drei für das Strido-Bein her, einschließlich seines Kniekoppelgetriebes.

In Strido

  • Beinmodell: packages/strido-core/src/strido/leg.py (foot_position, inverse_kinematics, calf_from_crank, crank_from_calf, transmission_angles), in C++ gespiegelt in firmware/strido_esp32s3/lib/strido_core/.
  • Maße: hardware/kinematics.yaml (legs_linkage, legs_base), aus dem CAD gemessen. Grenzen: hardware/joint_limits.yaml.
  • Praxisleitfaden: Kinematik und Gaits zeigt, wie der Gait diese Funktionen nutzt.

Das Bein als kinematische Kette ​

Jedes Bein hat drei Drehgelenke (Docstring von leg.py; die Konventionen entsprechen dem Unitree Go2):

GelenkAchseNullPositiv
Hüfte q1+xBein senkrechtFuß Richtung +y
Oberschenkel q2+yFemur gerade nach untenKnie nach hinten
Unterschenkel q3+y, relativ zum FemurUnterschenkel in Linie mit Femurnegativ = Knie gebeugt

Aus hardware/kinematics.yaml (Bein vorne links, gerundet): Die Hüfte liegt bei h=(0.1197,0.039,0)m in base_link, die Beinebene liegt d=38.3mm außerhalb der Hüfte (40.2mm bei den Hinterbeinen), der Oberschenkel misst l1=130.0mm und der Unterschenkel l2=124.1mm bis zur Fußmitte.

Oberschenkel und Unterschenkel bewegen sich in einer senkrechten Beinebene. Das Hüftgelenk kippt diese Ebene um x. Das Problem zerfällt also in zwei einfachere: einen ebenen Zweigelenkarm und eine Drehung.

Vorwärtskinematik ​

In der Beinebene zeige u nach vorne und v nach oben, beide vom Oberschenkel-Drehpunkt aus gemessen. Schreiben Sie s2=sin⁡q2 und s23=sin⁡(q2+q3), analog für Kosinus. Knie und Fuß liegen bei:

k=[−l1s2−l1c2],[uv]=[−l1s2−l2s23−l1c2−l2c23]

Die Winkel addieren sich, weil q3 relativ zum Femur gemessen wird; der absolute Winkel des Unterschenkels ist also q2+q3. Die Vorzeichen sind negativ, weil Null „nach unten zeigend“ bedeutet und ein positives q2 den Fuß nach hinten schwingt (Richtung −u).

Als Nächstes die Hüftdrehung. Der Fuß im Hüft-Koordinatensystem vor der Abduktion ist (u,d,v). Drehung um x um q1 und Addition der Hüftposition ergibt:

p=h+Rx(q1)[udv]=h+[udcos⁡q1−vsin⁡q1dsin⁡q1+vcos⁡q1]

Das ist foot_position Zeile für Zeile. Zu den Konventionen der Koordinatensysteme siehe Koordinatensysteme und Rotationen.

Inverse Kinematik ​

Gegeben ist ein Fußziel p, gesucht ist (q1,q2,q3). Sei r=p−h=(rx,ry,rz).

Hüftabduktion ​

Eine Drehung um x lässt die x-Komponente unverändert und erhält die Länge in der y–z-Ebene:

ry2+rz2=d2+v2

Der Fuß liegt unter der Hüfte, also nehmen wir die negative Wurzel:

v=−ry2+rz2−d2

Ist der Term unter der Wurzel nicht positiv, liegt das Ziel innerhalb des Zylinders mit Radius d um die Hüftachse und ist nicht erreichbar. Die Richtung von (ry,rz) ist die um q1 gedrehte Richtung von (d,v), also:

q1=atan2(rz,ry)−atan2(v,d)

Setzen Sie nun u=rx und lösen Sie den Zweigelenkarm. Oberschenkel, Unterschenkel und die Linie vom Drehpunkt zum Fuß bilden ein Dreieck mit den Seiten l1, l2 und ρ=u2+v2. Der Kosinussatz am Knie liefert den Kniewinkel. Mit unserer Konvention (der Knie-Innenwinkel ist π+q3):

ρ2=l12+l22+2l1l2cos⁡q3⟹cos⁡q3=u2+v2−l12−l222l1l2

Es gibt zwei Lösungen, ±arccos, für Knie nach vorne und Knie nach hinten. Strido verwendet q3=−arccos⁡(⋅), ein gebeugtes Knie, das nach hinten zeigt. Ist |cos⁡q3|>1, liegt das Ziel außer Reichweite.

Der Oberschenkelwinkel ist die Richtung zum Fuß minus den Winkel, den der Unterschenkel im Dreieck hinzufügt:

q2=atan2(−u,−v)−atan2(l2sin⁡q3, l1+l2cos⁡q3)

Die Minuszeichen im ersten Term stammen aus der Konvention „Null = gerade nach unten, positiv = nach hinten“. Verwenden Sie atan2, nie atan, damit der Quadrant stimmt.

Das Knie-Viergelenk ​

Der Knieservo treibt q3 nicht direkt an. Ein Parallelogramm (Arm 24.0mm, kurze Koppel 28.3mm, Kurbel 24.0mm) überträgt den Servowinkel auf eine Kurbel ψ am Oberschenkel-Drehpunkt. Ein Viergelenk (Kurbel 26.9mm, lange Koppel 131mm, Tibiakurbel 24.0mm und der Femur 130.0mm als Steg) dreht dann die Tibia. Weil der Steg des Viergelenks der Femur selbst ist:

q3=f(q2,ψ)

Bewegt man nur den Oberschenkel, bewegt sich auch das Knie. crank_from_calf invertiert das geometrisch. Das freie Ende der Kurbel liegt auf einem Kreis mit Radius 26.9mm um den Drehpunkt und zugleich auf einem Kreis mit Radius 131mm (die lange Koppel) um den Tibia-Bolzen. Der Schnitt der beiden Kreise liefert zwei Kandidaten, und der Montagezweig wählt einen aus. circle_intersection gibt None zurück, wenn sich die Kreise nicht treffen. Dann lässt sich das Koppelgetriebe in dieser Pose nicht zusammensetzen.

Diagramm wird gezeichnet…

Die Jacobi-Matrix ​

Die Jacobi-Matrix bildet Gelenkgeschwindigkeiten auf die Fußgeschwindigkeit ab, p˙=J(q)q˙. Ableiten der ebenen Vorwärtskinematik ergibt:

Jplane=∂(u,v)∂(q2,q3)=[−l1c2−l2c23−l2c23−l1s2+l2s23−l2s23],detJplane=−l1l2sin⁡q3

Die vollständige 3×3-Jacobi-Matrix ergänzt die Hüftspalte, ∂p/∂q1=x^×(p−h), und dreht die ebenen Spalten mit Rx(q1). Die Jacobi-Matrix bestimmt auch die Kräfte über τ=J⊤F (siehe Statik und Dynamik).

Für den Antrieb fügt die Kettenregel einen weiteren Faktor hinzu. Die Geschwindigkeit des Knieservos ist ψ˙, und

q˙3=∂f∂q2q˙2+∂f∂ψψ˙

Arbeitsraum und Singularitäten ​

Ohne Gelenkgrenzen erreicht der ebene Fuß einen Kreisring:

|l1−l2|≤ρ≤l1+l2⇒5.9mm≤ρ≤254.1mm

Gelenkgrenzen und Eigenkollisionen schränken das ein. hardware/joint_limits.yaml begrenzt q3 auf [−150∘,−45∘] und das vordere q2 auf [−45∘,125∘], ermittelt durch Abfahren des gestellten CAD auf Kollisionen in einem 5∘-Raster.

Eine Singularität ist eine Pose mit detJ=0. Dort kann sich der Fuß in eine Richtung nicht bewegen, egal wie schnell sich die Gelenke drehen, und die inverse Kinematik wird schlecht konditioniert. Beim ebenen Bein geschieht das bei sin⁡q3=0: Bein vollständig gestreckt (q3=0, am äußeren Rand des Arbeitsraums) oder vollständig eingeklappt. Die Unterschenkelgrenze hält |sin⁡q3|≥sin⁡30∘=0.5 (am Ende bei −150∘; mindestens 0.71 am Ende bei −45∘), sodass das Bein nie in die Nähe kommt. Das ist ein Grund, warum die Standpose das Knie deutlich gebeugt hält.

Das Viergelenk hat eigene Singularitäten. Wenn die lange Koppel mit der Kurbel oder mit der Tibiakurbel fluchtet (Übertragungswinkel nahe 0 oder 180∘), wird ∂f/∂ψ unendlich oder verschwindet. transmission_angles misst beide Winkel, und joint_limits.yaml verlangt mindestens 25∘ (transmission_min_deg).

Durchgerechnetes Beispiel: die Standpose ​

Die Standpose setzt jeden Fuß senkrecht unter seine Hüfte, 0.17m tiefer (stand_pose(height=0.17) in strido/gait.py). Für das Bein vorne links gilt r=(0, 0.0383, −0.170)m.

Hüfte. v=−0.03832+0.1702−0.03832=−0.170, also q1=atan2(−0.170,0.0383)−atan2(−0.170,0.0383)=0.

Knie. Mit u=0:

cos⁡q3=0.1702−0.13002−0.124122⋅0.1300⋅0.1241=−0.003390.03226=−0.105⇒q3=−96.0∘

Oberschenkel. l2sin⁡q3=−0.1234 und l1+l2cos⁡q3=0.1170, also

q2=atan2(0,0.170)−atan2(−0.1234,0.1170)=0+46.5∘=46.5∘

Das stimmt mit stand_pose() überein, das für jedes Bein (0∘,46.53∘,−96.03∘) liefert. Der absolute Winkel des Unterschenkels ist q2+q3=−49.5∘: Das Knie liegt hinter und über dem Fuß, und der Unterschenkel neigt sich nach vorne, um ihn zu erreichen.

Jacobi-Matrix. In dieser Pose gilt

Jplane=[−0.170−0.08060−0.0943]m/rad,det=0.0160m2

Eine Oberschenkelgeschwindigkeit von 1rad/s bewegt den Fuß mit 0.17m/s nach hinten und überhaupt nicht senkrecht. Um den Fuß anzuheben, braucht man vor allem das Knie.

Koppelgetriebe. leg.py liefert einen Kurbelwinkel von ψ=38.9∘ und Übertragungswinkel von 84∘ und 86∘, nahe am Ideal von 90∘. Die Empfindlichkeit ist ∂q3/∂ψ=−1.12: Das Knie dreht sich um 1.12∘ pro Grad Kurbel.

Selbsttest ​

  1. Warum lässt sich der Hüftwinkel vor und getrennt von Oberschenkel und Knie lösen?
  2. Was bedeutet |cos⁡q3|>1 physikalisch?
  3. Welches Gelenk bewegt den Fuß in der Standpose hauptsächlich nach vorne, und welches hauptsächlich senkrecht?
  4. Warum sind die Übertragungswinkel wichtig, selbst wenn detJplane weit von null entfernt ist?
Antworten
  1. Die Hüftachse ist die x-Achse, und q2, q3 ändern den Abstand des Fußes von ihr nie. Daher hängt ry2+rz2 nur von der ebenen Tiefe v und dem festen Versatz d ab.
  2. Das Ziel ist weiter entfernt als l1+l2 oder näher als |l1−l2|, also existiert kein Dreieck.
  3. Der Oberschenkel bewegt ihn nach vorne und hinten (J11=−0.170, J21=0). Nur die Kniespalte hat eine senkrechte Komponente.
  4. Sie beschreiben das Antriebs-Koppelgetriebe, nicht das Bein. Nahe 0∘ oder 180∘ verliert der Knieservo Hebelwirkung und die Abbildung Kurbel–Knie wird schlecht konditioniert, egal was die Bein-Jacobi-Matrix sagt.

Weiterführende Literatur ​

  • K. M. Lynch und F. C. Park, Modern Robotics, Cambridge University Press, 2017, Kap. 4–6 (Vorwärtskinematik, Geschwindigkeitskinematik, inverse Kinematik).
  • B. Siciliano et al., Robotics: Modelling, Planning and Control, Springer, 2009, Kap. 2–3.
  • R. L. Norton, Design of Machinery, McGraw-Hill, Kap. 4 (Lageanalyse von Viergelenken und Übertragungswinkel).
  • Kinematik und Gaits in diesem Wiki.

MIT-Lizenz. Mechanik abgeleitet von Yertle (Jerome Graves). CAD, Simulation und native Tests sind kein Hardware-Nachweis – siehe Verifikation.