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(NachrichtLowCmd) - Zustand: Subscriber auf
rt/lowstate(NachrichtLowStatemit Ist-Werten, IMU)
Ablauf der Steuerschleife
- DDS-Kanal mit der Netzwerkschnittstelle initialisieren.
- Publisher (
rt/lowcmd) und Subscriber (rt/lowstate) anlegen. - Aktuellen Zustand aus
LowStatelesen. - Pro Motor Modus und Sollwerte (q, dq, kp, kd, tau) setzen.
- 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
LowStateeinlesen, 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.
