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"
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
- 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.
- 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)
- 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.
- 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.
- Berechnen Sie Stereo-Extrinsics
Für Paare von Kameras (z.B. Links + Rechte Kopfkameras auf einem binokulären G1-Platz) laufen
```
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)
```
- 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
Sparen Sie für YAML
Speichern Sie in einem ROS-kompatiblen YAML-Format, damit die Standard-Ladern
```
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)
```
- 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
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
Häufige Ausfallmodi
Hocher Verwerfungsergebnis: verzerrte Platte, unzureichende Posidiversität oder ausgespannte Rahmen.
Extrinsic falsch mit ein paar cm: Normalerweise ein Einheit Bug
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
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
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
Was ist mit Fisheye-Kameras? Verwenden Sie die







