Unitree G1: Low-Level-Steuerung

Die Low-Level-Steuerung spricht die Gelenkmotoren des G1 direkt an – mit voller Kontrolle, aber hohem Risiko. Sie richtet sich an erfahrene Entwickler. Dieser Walkthrough erklärt das Regelprinzip und den Aufbau einer Steuerschleife.

Achtung: Fehlerhafte Werte können zu unkontrollierten, gefährlichen Bewegungen führen und den Roboter stürzen lassen. Testen Sie ausschließlich mit gesichertem/aufgehängtem Roboter.

Hinweis: Beispielcode illustrativ; exakte Feld-/Topic-Namen und CRC-Berechnung siehe README.

Konzept

Der G1 besitzt je nach Ausbaustufe rund 23–29 Gelenkmotoren (Beine, Taille, Arme, ggf. Kopf). Pro Motor geben Sie Sollwerte vor, die der Controller per PD-Regelung umsetzt:

  • q – Zielposition (rad)
  • dq – Zielgeschwindigkeit (rad/s)
  • kp – Steifigkeit, kd – Dämpfung
  • tau – Vorsteuer-Drehmoment (Nm)

Näherung: tau_out = kp * (q - q_ist) + kd * (dq - dq_ist) + tau.

Datenfluss

  • Befehle: Publisher auf rt/lowcmd (Nachricht LowCmd)
  • Zustand: Subscriber auf rt/lowstate (Nachricht LowState mit Ist-Werten, IMU)

Ablauf der Steuerschleife

  1. DDS-Kanal mit der Netzwerkschnittstelle initialisieren.
  2. Publisher (rt/lowcmd) und Subscriber (rt/lowstate) anlegen.
  3. Aktuellen Zustand aus LowState lesen.
  4. Pro Motor Modus und Sollwerte (q, dq, kp, kd, tau) setzen.
  5. CRC berechnen und mit fester, hoher Frequenz senden (z. B. alle 2 ms).

Beispiel: Gelenke auf Position halten (C++, Auszug)

// cmd: LowCmd, state: zuletzt empfangener LowState
for (int i = 0; i < NUM_MOTORS; ++i) {
    cmd.motor_cmd()[i].mode() = 0x01;          // Steuermodus
    cmd.motor_cmd()[i].q()    = target_q[i];   // Zielposition (aus LowState uebernehmen)
    cmd.motor_cmd()[i].dq()   = 0.0;
    cmd.motor_cmd()[i].kp()   = 40.0;          // moderat beginnen
    cmd.motor_cmd()[i].kd()   = 1.0;
    cmd.motor_cmd()[i].tau()  = 0.0;
}
cmd.crc() = calc_crc(&cmd);   // CRC setzen (Helfer aus dem SDK)
publisher->Write(cmd);        // an rt/lowcmd senden

Sinnvolle Startroutine: zunächst die Ist-Positionen aus LowState als target_q übernehmen und mit moderaten kp/kd halten – so bleibt der Roboter stabil, bevor Sie Trajektorien fahren.

Praxis-Tipps

  • kp/kd vorsichtig wählen – ein Humanoid reagiert sensibler als ein Quadruped.
  • Immer den realen Zustand aus LowState einlesen, nie blind befehlen.
  • CRC nicht vergessen; konstante Schleifenfrequenz einhalten.

Weiterführend

Exakte Nachrichtenfelder, Motor-Indizes und CRC-Helfer: offizielle Unitree-G1-Doku und das unitree_sdk2-Repository.