Zurück zu Learn

Wie man Kameras auf Unitree G1 kalibriert

ChArUco-basierte In- und Extrinsic-Kamera-Kalibrierung für die Unitree G1-Fahrzeugkameras. Speichern Sie auf YAML, validieren Sie und integrieren Sie sich in Ihren Policy-Stack.

Jede ernsthafte Manipulation oder Lokomotionsleitung auf dem Unitree G1 humanoid beginnt mit einer guten Kamera Kalibrierung. Dieses Tutorial führt durch die intrinsische und extrinsische Kalibrierung des G1 Kopfkamera-Arrays mit einem ChArUco-Board und OpenCV, speichert Ergebnisse auf YAML und validiert mit einer Verwerfung-Fehler-Gewissensprüfung.

Humanoid Gesamtzeit: etwa 90 Minuten Schwierigkeiten: Zwischenzeit Aktualisiert April 2026

Was Sie erreichen werden

Am Ende dieses Tutorials haben Sie die intrinsischen Daten pro Kamera (Kamera-Matrix und Verzerrungskoeffizienten) für jede der G1-Kameras, die extrinsischen Daten zwischen den Kameras im Kopfgerät und optional die extrinsischen Daten vom Kopfkamera-Rahmen bis zum G1-Basislink.

Schlechte Kalibrierung ist eine der häufigsten Ursachen für "die Politik funktioniert in Sim, aber versagt beim echten Roboter" es beschädigt alles nach unten: Hand-Augen-Koordination, Tiefenbewertung, Objektdetektion und Kamera-zu-Aktions-Politik.

Voraussetzungen

  • Unitree G1 mit dem Head-Kamera-Array angetrieben und streamt (die EDU / Entwickler-Varianten stellen die Kameras über dem SDK aus).
  • ChArUco-Tisch. Drucken Sie ein A2 8x11-Tisch mit 40 mm Quadrat und 30 mm ArUco-Marker auf Mattepapier und montieren Sie es auf eine starre, flache, nicht verformende Oberfläche (Schaumplatte oder Acryl).
  • Workstation mit Ubuntu 22.04, Python 3.10, OpenCV 4.8+ und dem Installations-SDK Unitree G1.
  • Vermeiden Sie direkte Sonne oder Spiegelreflektionen auf dem Board.

Die Schritte

  1. Drucken und montieren Sie das Charuco-Board

Generen Sie das Board PDF:

```
python -c "
import cv2
aruco = cv2.aruco
d = aruco.getPredefinedDictionary(aruco.DICT_5X5_100)
board = aruco.CharucoBoard((8, 11), 0.040, 0.030, d)
img = board.generateImage((1500, 2100), marginSize=40)
cv2.imwrite('charuco_a2.png', img)
"
```

Drucken Sie auf A2-Mattepapier in der tatsächlichen Größe (ohne Skalierung), überprüfen Sie, ob die gedruckten Quadrate genau 40,0 mm messen und auf einer starren, flachen Rückseite montieren.

  1. Setzen Sie das G1 und streamen Sie die Kameras

Starten Sie den Head-Kamera-Stream über das Unitree SDK. Die genaue Python-Bindung befindet sich auf dem [unitreerobotics] (GitHub) T15. Das allgemeine Muster ist ein Abonnent, der synchronisierte Numpy-Frame pro Kamera erzeugt. Überprüfen Sie, dass Sie Frames von allen Head-Kameras in Python gleichzeitig lesen können. Wenn eine Kamera fällt, reparieren Sie sie, bevor Sie anfangen zu filmen.

  1. Erfassen Sie 40-60 Plattenrahmen

Bewegen Sie den G1-Kopf (oder das Board) durch eine Vielzahl von Posen: links geneigt, rechts geneigt, nahe, weit, außerhalb der Achse. Die Kalibrierung von OpenCV ist nur so gut wie die Vielfalt der Sichtpunkte, die Sie ihm geben. Für Stereo-Extrinsics erfassen Sie für jede Pose synchronisierte Rahmen über beide Kameras.

```
import cv2

for i in range(60):
    frame_left, frame_right = camera.grab_sync()
    cv2.imwrite(f'calib/left_{i:03d}.png', frame_left)
    cv2.imwrite(f'calib/right_{i:03d}.png', frame_right)
    input("move board, press enter")
```

Richtlinie: Das Board sollte mindestens 30% des Rahmens füllen und die am meisten erkannten Eckenmarker sollten sich über die gesamte Bildregion erstrecken.

  1. Berechnen Sie die Eigenheiten pro Kamera

Führen Sie die eigenständige Kalibrierung von ChArUco pro Kamera aus:

```
import cv2, glob, numpy as np

aruco = cv2.aruco
d = aruco.getPredefinedDictionary(aruco.DICT_5X5_100)
board = aruco.CharucoBoard((8, 11), 0.040, 0.030, d)
detector = aruco.CharucoDetector(board)

all_corners, all_ids, img_size = [], [], None
for fn in sorted(glob.glob('calib/left_*.png')):
    img = cv2.imread(fn, cv2.IMREAD_GRAYSCALE)
    img_size = img.shape[::-1]
    corners, ids, _, _ = detector.detectBoard(img)
    if ids is not None and len(ids) > 6:
        all_corners.append(corners)
        all_ids.append(ids)

ret, K, dist, rvecs, tvecs = aruco.calibrateCameraCharuco(
    all_corners, all_ids, board, img_size, None, None)
print('RMS reprojection error:', ret)
```

Ziel RMS unter 0,5 Pixel. Über 1 px zeigt schlechte Plattenflachheit, unzureichende Posidiversität oder ausgestopfte Rahmen an.

  1. Berechnen Sie Stereo-Extrinsics

Für Paare von Kameras (z.B. Links + Rechte Kopfkameras auf einem binokulären G1-Platz) laufen T5 mit den bereits berechneten Inhaltsweisen und synchronisierten Aufzeichnungen an Bord.

```
ret, K1, D1, K2, D2, R, T, E, F = cv2.stereoCalibrate(
    object_points, left_img_points, right_img_points,
    K_left, D_left, K_right, D_right, img_size,
    flags=cv2.CALIB_FIX_INTRINSIC)
```
  1. Berechnen Sie die Extrinsix von Kopf zu Basis (optional)

Wenn Ihre nachgelagerte Politik Kamera-Posen in der G1-Basisverbindung oder Weltrahmen benötigt, verfolgen Sie die bekannte Kopf-Kinematik: Lesen Sie den Kopf-Gebindungszustand aus dem SDK, komponieren Sie mit der Kamera-zu-Kopf-Verbindung-Extrinsic (aus der URDF oder einer einmaligen Hand-Augenkalibrierung) und veröffentlichen Sie eine ROS 2 T7. Die G1 URDF-Schiffe mit nominellen Werten, die ein guter Ausgangspunkt sind.

  1. Sparen Sie für YAML

Speichern Sie in einem ROS-kompatiblen YAML-Format, damit die Standard-Ladern T8 funktionieren:

```
import yaml

out = {
    'image_width': 1280,
    'image_height': 720,
    'camera_name': 'g1_head_left',
    'camera_matrix': {'rows': 3, 'cols': 3, 'data': K.flatten().tolist()},
    'distortion_model': 'plumb_bob',
    'distortion_coefficients': {'rows': 1, 'cols': 5, 'data': dist.flatten().tolist()},
}
with open('g1_head_left.yaml', 'w') as f:
    yaml.safe_dump(out, f)
```
  1. Validieren Sie auf einer Testszene

Erfassen Sie einen neuen ChArUco-Bild, der nicht im Kalibrierungssatz war. Erkennen Sie Ecken, neu projizieren Sie mit Hilfe Ihrer gespeicherten Inhalte und überlappen Sie das Bild. Der durchschnittliche Fehler bei der Wiederverwerfung sollte unter 0,5 Pixel liegen. Auch durch ein paar verschiedene Kopfposen gehen und die Stereo-Unterschiede auf einem Objekt mit bekannter Entfernung beobachten wenn es mit der auf Band gemessenen Entfernung in einer Reichweite von 1 bis 2 cm übereinstimmt, sind Ihre Extrinsics gut.

Was soll ich jetzt tun?

Führen Sie Ihre kalibrierten Inhalte in jeden nachgelagerten Policy-Stack ein: OpenVLA-Feinabstimmung verwendet korrigierte Bilder, LeRobot-Aufnahme speichert den T9 neben Episoden und Isaac Lab benötigt die gleichen Inhalte für den Sim-to-Real-Transfer. Wenn Sie SLAM oder dichte Tiefe ausführen, ist eine gute Kalibrierung Tischinsätze.

Häufige Ausfallmodi

Hocher Verwerfungsergebnis: verzerrte Platte, unzureichende Posidiversität oder ausgespannte Rahmen.

Extrinsic falsch mit ein paar cm: Normalerweise ein Einheit Bug Quadratgröße in Metern vs. Millimeter.

Inkonsistente Laufen: Überprüfen Sie, ob der Kopfverbindungszustand beim Aufnehmen jedes Rämen verriegelt ist; Bewegung während der Aufnahmebrüche Kalibrierung.

Politik fehlt nach Kalibrierung: Überprüfen Sie die Bildbestellung (BGR vs RGB) und die Größenordnung (Crop then resize vs resize then crop) entsprechen der Ausbildungsprozess der Politik.

Tiefschwimmen: Warum Charuco über ein einfaches Schachbrett

Ein einfaches Schachbrett ist das Ziel der Ausrichtung von Lehrbüchern, hat aber einen bekannten Ausfallmodus: Wenn ein Teil des Schachbretts verstopft ist, versagt die gesamte Erkennung. ChArUco (ein Schachbrett mit ArUco-Fiduizialen, die in die weißen Quadrate eingebettet sind) löst dies, indem er jedem Eck eine einzigartige Identität gibt. Der Kalibrator kann teilweise Beobachtungen verwenden, so dass Sie das Brett aggressiv durch verschiedene Posen bewegen können, ohne Zeit für die Erfassung an unbrauchbaren Rahmen zu verschwenden. OpenCVs moderner T10 API (4.8+) ist das richtige Tool für 2026. Vermeiden Sie die veralteten Funktionen in älteren Tutorials; die Subpixel-Ecke-Verfeinerung ist in der neuen API viel besser.

ChArUco hilft auch bei einer Subtilität: Während der Aufnahme neigt sich der Kopf, so dass sich Ihre Rahmen zwischen "Board nimmt das ganze Bild" und "Board ist auf eine Seite ab". Ein vollständiges Schachbrett fällt oft vom Rand und erkennt es nicht; ChArUco gibt nur weniger Ecken zurück und geht weiter.

Tiefschwimmen: Wie gut ist gut genug?

Der Fehler bei der Wiederverwerfung ist die Überschriftnummer, aber nicht die gesamte Geschichte.

  • RGB-Politik-Schulung: 0,5 bis 1,0 px ist in Ordnung.
  • Stereodieb oder SLAM: unter 0,3 px. Extrinsiche Fehlerverbindungen durch Dreieckung.
  • ** Hand-Auge/Manipulation:** unter 0,5 px auf der Innenseite und unter 2 mm auf der Außenseite des Kamera-zu-Ende-Effektors.

Tiefen Tauch: Neukalibrierungsschaltungen

Ein G1 benötigt keine wöchentliche Neukalibrierung, aber einige Ereignisse rechtfertigen dies: (1) jeglicher physischer Einfluss auf den Kopf oder die Kamera, (2) Wechsel einer Kamera, (3) Wärme-Drift auf einem neuen Einsatzort (kaltes Labor bis warmer Produktionsboden) und (4) wenn Sie über Wochen hinweg Fehler bei der Neukalibrierung sehen. Automatische eine schnelle ChArUco-Gewissensprüfung im Rahmen Ihrer wöchentlichen Wartung 5 Bilder und eine Nachwerfungskontroll erfasst 90% der Kalibrierungsschwankungen.

Tiefersteckung: Integration mit der Politikbildung

Sobald die Kalibrierung YAML gespeichert ist, wickeln Sie sie an drei Stellen in Ihren nachgelagerten Stapel ein: (1) Die Aufnahmegleitung speichert die Kalibrierung neben jeder Episode, damit Sie sie später bei Bedarf wieder korrigieren können, (2) die Politik-Ausbildung vorbereitet optionell undistörungen oder Ernten nach dem eigentlichen und (3) die Ableitung-Zeit-Vorbereitung verwendet die gleichen __-Parameter wie das Training. Die Fehl Übereinstimmung zwischen Ausbildung und Vorbereitung von Schlussfolgerungen ist die häufigste Ursache für Fehler bei "Arbeit im Notebook, Fehler beim Roboter".

Häufig gestellte Fragen

** Kann ich die Kalibrierung überspringen, wenn ich nur Teleop mache? ** Ja, Teleop erfordert keine Kalibrierung. Aber Sie verlieren die Fähigkeit, später eine Pixel-to-Action-Politik auf den aufgezeichneten Daten zu trainieren.

Wie lange ist eine Kalibrierung gültig? Monate, ohne physische Auswirkungen auf den Kopf.

Ist die Kalibrierung des G1 URDF aus der Box ausreichend genau? Normalerweise innerhalb weniger Millimeter ausreichend für RGB-Politiken, Grenzlinie für Manipulation.

Was ist mit Fisheye-Kameras? Verwenden Sie die T11 oder T12 Module in OpenCV Das T13 Modell, das in diesem Tutorial angenommen wird, behandelt keine Fisheye-Verzerrung.

Verwandte Tutorials und Ressourcen