Unitree G1에서 카메라를 기동하는 방법
Unitree G1 헤드 카메라에 대한 ChArUco 기반의 내성 및 외성 카메라 캘리브레이션. YAML에 저장하고, 검증하고, 귀하의 정책 스택과 통합하십시오.
유니트리 G1 인형의 모든 심각한 조작이나 이동 파이프라인은 좋은 카메라 캘리브레이션으로 시작됩니다. 이 튜토리얼은 ChArUco 보드와 OpenCV를 사용하여 G1 헤드 카메라 배열의 내성 및 외부 캘리브레이션을 통해 결과를 YAML에 저장하고 재발시 오류 정신 검사를 통해 검증합니다.
인형 전체 시간: 약 90 분 난이도: 중간 업데이트 2026년 4월
당신 이 성취 할 것
이 튜토리얼의 끝까지 G1 헤드 카메라 각 개용에 대한 카메라 내 내재 (카메라 매트릭스 및 왜곡 계수) 를, 헤드 리그 카메라 사이의 외재, 선택적으로 헤드 카메라 프레임에서 G1 기본 링크까지의 외재를 갖게 될 것입니다. 모든 것은 YAML에 저장되어 있으며, 하류 ROS 2 / LeRobot / OpenVLA 스택이 직접 소비 할 수 있는 형식으로 저장됩니다.
잘못된 캘리브레이션은 "시민에서 작동했지만 실제 로봇에서 실패하는 정책"의 가장 일반적인 근본 원인 중 하나입니다.
전제 조건
- Unitree G1 헤드 카메라 매리 가동 및 스트리밍 (EDU / 개발자 변종은 SDK에 대한 카메라를 노출합니다). 인체적 비교 를 확인하십시오.
- ChArUco 보드. A2 8x11 보드를 40mm 광장과 30mm ArUco 마크를 매트 종이 위에 인쇄하고 딱딱하고 평평하고 회전하지 않는 표면에 (스푸머 보드 또는 아크릴) 부착한다.
- Ubuntu 22.04, Python 3.10, OpenCV 4.8+ 및 Unitree G1 SDK가 설치된 작업장
- 심지어 주변 조명도 피 합니다. 직접적인 태양이나 스펙러 반사 를 피 합니다.
단계
ChArUco 보드를 인쇄하고 설치합니다
게시판 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 매트 종이에 실제 크기로 인쇄 (중계되지 않는다) 하여 인쇄된 광장 크기가 정확히 40.0mm를 확인하고 딱딱하고 평면한 뒷면에 장착한다.
- G1를 설치하고 카메라를 스트리밍
배터리가 안전하게 앉아있는 상태에서 G1를 연결하여 시작하십시오. Unitree SDK를 통해 헤드 카메라 스트림을 시작하십시오. 정확한 파이썬 결합은 [unitreerobotics] (
- 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%를 채우며 가장 가장 가장 앵글에 발견되는 마크는 전체 이미지 영역을 가로지르며, 보드만 중앙에 있는 촬영은 지나치게 자신감 있는 내재를 만들어 낸다.
- 카메라에 대한 내적 정보를 계산해 보세요
카메라에 따라 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)
```
0.5 피클스 이하의 RMS를 목표로 한다. 1 px 이상은 보드 평평함, 포즈 다양성이 부족하거나 중점 프레임이 떨어지는 것을 나타냅니다.
스티레오 외관을 계산해
카메라 쌍 (예를 들어 쌍안경 G1 기장에서 왼쪽 + 오른쪽 헤드 카메라) 에서 이미 계산된 내재 및 동기화된 보드 관측을 사용하여
```
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)
```
헤드-터베이스 외부를 계산 (선택)
만약 하류 정책에 G1 기본 링크 또는 세계 프레임에 카메라 포즈를 필요로 한다면, 알려진 헤드 키네마틱스를 통해 연쇄하십시오. SDK에서 헤드 합성 상태를 읽어, 카메라-헤드-링크 외부 (URDF에서 또는 일회용 손-눈 캘리브레이션) 로 구성하고 ROS 2
YAML에 저장해
ROS 호환형 YAML 형식으로 저장하여 표준
```
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)
```
- 테스트 현장에서 검증
새로운 ChArUco 프레임을 캡처하고, 캘리브레이션 세트에서 제외한 것을 확인하고, 저장된 내재 내용을 사용하여 재프로젝트를 재현하고, 이미지에 덮어 놓습니다. 평균 재프로젝트 오류는 0.5 피클스 이하로 유지되어야 합니다. 또한 로봇을 몇 가지 다른 머리 자세를 통해 걸어 나가고 알려진 거리의 물체에서 스테레오 불균형을 관찰합니다. 테이프 측정 거리와 1m 범위에서 1~2cm 이내에 일치한다면, 당신의 외관은 좋습니다.
다음으로 어떻게 해야 할까요?
일반적인 실패 모드
** 고 재발표 오류:** 왜곡된 보드, 부적절한 포즈 다양성, 또는 중점화 외의 프레임. 더 나은 다양성으로 재발표.
외부 오류 몇 센티미터: 보통 단위 버그
** 불합리한 실행:** 각 프레임을 캡처하는 동안 헤드 관절 상태가 잠겨 있는지 확인하고; 캡처 중 운동 중단 캘리브레이션.
정책은 여전히 기량화 후 실패합니다: 이미지 순서를 확인 (BGR vs RGB) 및 크기를 변경하는 순서를 (확인 후 크기를 변경하고 크기를 변경하고) 정책의 훈련 사전 처리와 일치합니다.
심층 다이빙: 왜 차루코가 단순한 체커보드보다
일반 체커보드는 교과서 캘리브레이션 목표이지만 잘 알려진 오류 모드가 있습니다. 보드의 어느 부분도 차단되면 전체 검출이 실패합니다. ChArUco (백 광장에 삽입된 ArUco 신뢰자들로 구성된 체커보드) 는 각 코너에 고유한 정체성을 부여함으로써 문제를 해결합니다. 오래된 튜토리얼의 구석기 기능을 피하십시오. 새로운 API에서 서브픽셀 코너 정비가 훨씬 좋습니다.
특히 인형 머신 카메라에 있어서, ChArUco는 또한 미묘한 것을 도와줍니다. 캡처 중에 머리가 기울기 때문에 프레임들은 "보드 전체 이미지를 촬영합니다"와 "보드 한쪽으로 이동합니다".
깊이 잠수: 얼마나 좋은 건 충분히 좋은가요?
반사 오류는 제목 번호이지만 전체 이야기가 아닙니다. 사용 사례별로 목표:
- RGB 정책 훈련: 0.5~1.0 px는 괜찮습니다. 정책은 작은 본질적 오류에 다소 용납적입니다. 특히 동일한 캘리브레이션을 사용하여 훈련하고 배치하는 경우.
- ** 스테레오 깊이 또는 SLAM:** 0.3 px 이하. 삼각화로 외부 오류 화합물
- 손-눈/ 조작: 내재형에서 0.5 px 미만이고 카메라에서 끝으로 팩터 외부에서 2 mm 미만이다. URDF를 통해 연쇄하는 대신 전용 손-눈 캘리브레이션 루틴 (예를 들어, Tsai-Lenz) 을 고려하십시오.
깊이 잠수: 재계급 트리거
G1는 주간 재계급이 필요하지 않지만, 어떤 사건은 이를 정당화 합니다. (1) 머리와 카메라 마운트에 대한 물리적 충격, (2) 카메라를 교환하는 것, (3) 새로운 배치 장소에서 열 유동 (냉면 실험실에서 따뜻한 생산 바닥) 및 (4) 사용 주 동안 재발전 오류가 증가하는 것을 보면. 주간 유지보수 기간의 일부로 빠른 ChArUco 정신 건강 검사를 자동화하세요. 5 프레임으로 재발제 검사는 90%의 캘리브레이션 파동을 잡습니다.
깊이 심어지는 것: 정책 교육과 통합
가산 YAML가 저장되면, 다음 세 곳에서 하류 스택에 연결하십시오: (1) 녹음 파이프라인은 각 에피소드 옆에 가산을 저장하므로 필요할 경우 나중에 다시 수정할 수 있습니다, (2) 정책 훈련 사전 처리 선택적으로 변형되지 않습니다 또는 본질에 따라 작물을 생산하고 (3) 추론 시간 사전 처리 훈련과 같은 __ 파라미터를 사용합니다. 훈련과 추론 사전 처리 사이의 부합은 "노트북에서 작동하고 로봇에서 실패"의 가장 일반적인 원인은 있습니다.
자주 묻는 질문
** 제가 단지 텔레오프를 하는 경우 캘리브레이션을 건너뛰면 될까요?** 네, 텔레오프는 캘리브레이션을 필요로 하지 않습니다. 하지만 나중에 기록된 데이터에 대해 픽셀-투-아션 정책을 훈련시킬 수 있는 능력을 잃습니다.
** 기밀은 얼마나 오래 유효합니까?** 머리에 신체적 영향을 미치지 않는 한 몇 달.
G1 URDF 가격은 상자 밖 에 충분히 정확 합니까? 보통 몇 밀리미터
** 물고기 눈 카메라에 대해 어떻게 생각하세요?** OpenCV에서







