비전이 버섯 하나를 찾아 "카메라 기준으로 (12, −40, 380) mm에 있다"고 알려 줍니다. 로봇이 그곳으로 가려면 이 값을 로봇 베이스 기준 좌표로 바꿔야 합니다. 이 변환을 구하는 작업이 Hand-Eye 캘리브레이션입니다. 이 값이 1 mm 틀리면 모든 파지가 1 mm씩 어긋납니다.
네 개의 좌표계와 변환
변환은 위치(3개)와 회전(3개)을 함께 담은 4×4 행렬로 표현합니다. 세 변환 중 둘은 이미 압니다.
- 베이스 → 손끝: 로봇 컨트롤러가 관절 각도로 계산해 실시간으로 알려 줍니다.
- 카메라 → 물체: 비전이 측정합니다.
- 손끝 → 카메라 (X): 카메라를 어떻게 달았는지에 달린 값이라 아무도 모릅니다. 이것을 구하는 것이 캘리브레이션입니다.
eye-in-hand와 eye-to-hand
- eye-in-hand — 카메라가 로봇 손끝에 달려 함께 움직입니다. 여러 위치에서 가까이 찍을 수 있어 넓은 영역과 세밀한 검사에 유리합니다. 구하는 값은 손끝 → 카메라.
- eye-to-hand — 카메라가 작업대 위에 고정되어 있습니다. 로봇이 움직이는 동안에도 계속 찍을 수 있습니다. 구하는 값은 베이스 → 카메라.
RoboVision은 두 구성을 모두 지원합니다.
AX = XB — 왜 여러 자세가 필요한가
캘리브레이션 판(체스보드 등)을 고정해 두고, 로봇을 여러 자세로 움직이며 판을 찍습니다. 두 자세 사이에서 로봇 손끝이 움직인 양을 A, 그 사이 카메라가 본 판의 움직임을 B라고 하면, 둘은 같은 강체 운동을 다른 좌표로 본 것이므로 AX = XB가 성립합니다. 미지수 X는 6자유도라 자세 쌍 하나로는 풀리지 않고, 회전축이 서로 다른 자세가 여러 개 필요합니다.
이 식을 푸는 방법은 여러 가지입니다. RoboVision은 OpenCV의 다섯 가지 풀이법(Tsai, Park, Horaud, Andreff, Daniilidis)을 모두 제공해, 같은 데이터로 결과를 비교할 수 있습니다. 회전과 이동을 따로 푸는 방법(Tsai, Park)과 한 번에 푸는 방법(Daniilidis의 듀얼 쿼터니언 등)은 노이즈에 대한 성질이 조금씩 다릅니다.
판 없이 보정하기
현장에서는 판을 놓기 어려운 경우가 있습니다. fineAi는 다른 방법도 씁니다.
- 그리퍼 기반 보정 — 판 대신 그리퍼 자체를 카메라로 찍어 보정합니다. RoboVision에서 RMS 0.50 mm를 얻었습니다.
- TCP 점 맞춤 — eye-to-hand에서 로봇 손끝을 여러 위치로 옮기며 3D 카메라로 그 위치를 찍고, 두 점 집합을 가장 잘 겹치는 회전·이동을 Kabsch 알고리즘으로 구합니다. 끝에 구를 달고 구 중심을 맞추면 더 정밀합니다. Digital Twin Pick&Place가 이 방식을 씁니다.
정확도를 높이는 요령
- 회전을 크게, 다양하게 — 자세들 사이의 회전축이 서로 많이 달라야 합니다. 평행 이동만 하면 X의 회전 성분이 잘 정해지지 않습니다.
- 자세를 충분히 — 최소 개수보다 넉넉히(10~20개) 찍어 노이즈를 평균냅니다.
- 시야 전체를 쓰기 — 판이 화면 가운데에만 찍히면 렌즈 왜곡이 큰 가장자리의 오차가 숨습니다.
- 카메라 내부 보정 먼저 — 렌즈 왜곡과 초점 거리(내부 파라미터)가 틀리면 Hand-Eye도 틀립니다.
- 잔차로 검증 — 결과 X로 각 자세의 판 위치를 다시 계산해 잔차(RMS)를 봅니다. 특정 자세만 크게 튀면 그 자세를 빼고 다시 풉니다.
- 기구가 바뀌면 다시 — 카메라 브래킷을 건드렸거나 충돌이 있었다면 다시 보정합니다. 운영 중에는 예측 위치와 실측 위치의 차이를 모아 작은 보정값을 갱신하는 자가 보정도 씁니다.