Learnに戻る

Unitree G1 で カメラを校正する方法

ユニトリ G1 ヘッドカメラの ChArUco ベースの内部のカメラと外部のカメラの校正. YAML に保存し,検証し,ポリシースタックに統合します.

Unitree G1の人類型のあらゆる深刻な操作や移動パイプラインは,カメラのキャリブラリで始まります.このチュートリアルでは,ChArUcoボードとOpenCVを使用してG1ヘッドカメラのマレイの内在および外的なキャリブラリを介して行きます.

人体 総時間: 約 90 分 困難: 中間 更新 2026 年 4 月

達成する事

このチュートリアル終了までに,各G1ヘッドカメラのカメラ内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の内部の

誤った校正は"simで動作したポリシーが実際のロボットで失敗する"の最も一般的な根本原因の一つです ダウンストリームですべてを腐敗させる:手と目の調整,深度推定,オブジェクト検出,カメラからアクションのポリシー.

必須条件

  • Unitree G1 ヘッドカメラマレイが動いているとストリーミング (EDU /開発者変数はSDK上でカメラを暴露する) チェック 人間性比較 あなたがまだプラットフォームで決定している場合.
  • ChArUcoボード* A2 8x11板を40mmの正方形と30mmのArUcoマーカーでマット紙に印刷し,硬い,平坦で不変形表面 (泡板またはアクリル) に固定する.
  • ** Ubuntu 22.04, Python 3.10, OpenCV 4.8+,および Unitree G1 SDKをインストールしたワークステーション**
  • 周囲の照明さえも 直接の太陽や鏡像を板に 放出するので 避けましょう

ステップ

  1. プリントして シャーロックボードをマウントする

板を 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)
"
```

A2 マット紙に実際のサイズで (スケーリングなし) を印刷し,印刷された正方形が正確に40mmを測ったことを確認し,硬い平面なバックに固定します.

  1. G1を設置して ストリームカメラを

G1 を安全に座っているバッテリーで接続モードで起動する.Unitree SDK を介してヘッドカメラストリームを起動する.正確な Python 結合は [unitreerobotics] (GitHub) T15 であります.一般パターンは,カメラごとに同期化されたナプピーフレームを生成するサブスクリプションです.すべてのヘッドカメラからのフレームを同時に Python に読み取れるかを確認してください. カメラが落ちたら 撮影する前に 修理する

  1. 40~60枚のボードを撮る

G1ヘッド (またはボード) を幅広いポーズで移動する.左傾き,右傾き,近,遠,軸外.OpenCVの校正は,あなたがそれを供給する視点を多様性ほど良いだけです.ステレオエクストリンシックスでは,各ポーズで両方のカメラに同期フレームをキャプチャします.

```
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")
```

**提示:**ボードはフレームの少なくとも30%を満たし,角に最も検出されたマーカーは画像全域を覆う必要があります.ボードが中心にのみ撮影された場合,過剰な自信が固有のものを生み出します.

  1. カメラごとに内部の計算

カメラごとに ChArUco 内定計を実行する

```
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)
```

ターゲット RMS は 0.5 ピクセル未満. 1 px 以上は板の平らさ,ポーズ多様性不足,または焦点外のフレームを示します.

  1. ステレオ外観を計算する

双カメラ (例えば,双眼G1装置の左+右頭カメラ) では,すでに計算された内在と同期ボード観測を使用して T5を実行します.出力 T6は左から右のカメラフレームの硬い変換です.

```
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. 端から端まで計算する (オプション)

ダウンストリーム政策ではG1基リンクまたはワールドフレームでカメラをポーズする必要がある場合,既知のヘッドキネマティックを通じ:SDKからヘッドコア関節状態を読み,カメラからヘッドリンクの外側 (URDFからまたは一回目目目キャリブラーション) を構成し,ROS 2 T7を公開します.G1 URDFは名値が良い出発点である.

  1. YAMLに保存する

ROS対応のYAMLフォーマットで保存して標準の T8ロードが動作するように:

```
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. テスト現場での検証

校正セットにない新しい ChArUco フレームを捕まえ 角を検出し,保存した内部の利用で再設計し,画像に覆い込む.平均再投影エラーは 0.5 ピクセル未満に留まる. また,ロボットを数種類の頭姿で歩いて,既知の距離の物体でステレオの違いを観察します テープで測定された距離と一致する場合は 1m範囲で 1〜2cm以内で,あなたの外側は良いです.

次にどうする?

調整された画像を使用する (OpenVLA 細かな調節) (LeRobot 記録) (T17) は,エピソードとともにT9 を保存し, (Isaac Lab) (T18) は, sim-to-real 転送のために同じ内核を必要とする.

常識の故障モード

高再投影誤り:歪んだ板,ポーズ多様性不足,または焦点外のフレーム. より良い多様性で再撮影.

外部の誤り数センチ: 通常単位バグ 平方尺寸はメートル対ミリメートルです.

**不一致な走行:**各フレームをキャプチャする際に頭関節状態がロックされていることを確認する.キャプチャの間での動きは,キャプチャの間隔の校准.

** 校正後,ポリシーはまだ失敗する:** 画像の注文 (BGR vs RGB) を確認し,サイズ変更 (作物,その後,サイズ変更,その後,作物) は,ポリシーの訓練前処理に一致する.

深層ダイビング:なぜチャルコが チェッカーボードよりも

普通のチェッカーボードは教科書校正対象ですが よく知られている故障モードがあります 板の部分が遮られれば 検出全体が失敗します チェッカーボード (白の正方形にアーコ・フィューティシャルが埋め込まれたチェッカーボード) は,各角にユニークなアイデンティティを与えることでこれを解決します. カリブラターは部分観測を使用することができ,使用できないフレームでキャプチャ時間を無駄にせずにさまざまなポーズを通してボードを攻撃的に移動することができます.OpenCVの近代的な T10 API (4.8+) は2026年に最適なツールです. 古いチュートリアルで使用されていない機能を避ける.新しいAPIではサブピクセルコーナーの精細化がはるかに良い.

ヒト像ヘッドカメラの特異性にも ChArUco が役立つ. 撮影中にヘッドが傾くので,フレームは"ボードは全体像を撮る"と"ボードは片側へ移動する"の間で交代する. 完全なチェッカーボードはしばしば縁から落ちて検出できない. ChArUco は単に角を減らして動き続けます.

深い潜水: どれだけの力があるか?

誤った投影は,頭文字番号ですが,全ストーリーではありません. 使用事例によるターゲット:

  • RGB政策訓練: 0.5~1.0 pxは大丈夫です. 政策は,特に同じ校准で訓練・展開する場合,小さな内在エラーに対して,少し寛容です.
  • **ステレオ深さまたはSLAM:**0.3 px未満. 偏差複合体による外部の誤差.
  • **手目/操作:**内部の部分で0.5 px未満,端端効果の外部の部分では2 mm未満. URDFを通る鎖ではなく,手目校正の専用例 (例えば,Tsai-Lenz) を考慮してください.

深層潜水:再校定のトリガー

G1 は毎週再校正する必要はないが,いくつかの出来事がそれを正当化します. (1) 頭やカメラマウントに物理的な影響, (2) カメラの交換, (3) 新しい部署地点 (冷たいラボから暖かい生産床) に熱波が広がり, (4) 週間の使用中に再投影のエラーが広がっている場合. 週間 メンテナンスの 5フレームの範囲で 速やかに ChArUco メンテナンスチェックを自動化して 再投棄チェックは,校准漂移の90%を捕まえる.

深層潜水:政策訓練に統合

校正YAMLが保存された後,それを3つの場所に下流スタックに配線します: (1) 記録パイプラインは各エピソードに沿って校正を保存し,必要に応じて後で修正することができます. (2) 政策訓練前処理は選択的に歪みをなくしたり,本質的に作物をなくしたりします. (3) 推論時間前処理は訓練と同じ __パラメータを使用します. 訓練と推論の事前処理の不一致は"ノートブックで作業する ロボットで失敗する"の唯一の最も一般的な根本原因です

よく聞かれる質問

Teleopをやっている場合,校正をスキップできますか? はい,Teleopは校正を必要としません. しかし,記録されたデータに対して後にピクセル対アクションポリシーを訓練する能力を失う.

** 校正はどのくらい有効ですか?** 頭に物理的な影響がないと仮定する

G1 URDFの校正は箱から外れに十分正確ですか 通常 RGB ポリシーには数ミリメートル内で十分で,操作には限界です.接触に富んだ作業をする場合は再校定します.

魚眼カメラについてはどうですか? OpenCVでは T11または T12モジュールを使用します T13モデルはこのチュートリアルで想定されているので魚眼の歪みを処理しません.

関連チュートリアルとリソース