# 핸드아이 캘리브레이션

핸드아이 캘리브레이션은 카메라를 이용해서 로봇팔을 구동하기 위한 Pick & Place 등의 작업에서 필수적으로 요구되는 Handeye Matrix를 산출하기 위해 요구되는 작업입니다.

핸드아이 캘리브레이션을 수행하기 위해서는 반드시 카메라 캘리브레이션이 선행되어야 합니다.

## 핸드아이 캘리브레이션 화면 진입

핸드아이 캘리브레이션은 카메라 커넥터의 파라미터 메뉴를 선택해서 시작할 수 있습니다. (마우스 더블클릭)

![handeye calibration](../images/camera-calibration-entering.png 'entering handeye parameter menu')

카메라 파라미터 메뉴에서 아래와 메뉴 선택을 통해서 핸드아이 캘리브레이션 메뉴에 진입합니다.

![camera parameter](../images/handeye-calibration-menu.png 'handeye parameter menu')

핸드 아이 캘리브레이션은 카메라 캘리브레이션과 캘리브레이션 보드의 Pose를 변경하는 것은 유사하지만 캘리브레이션 보드가 로봇에 장착되어 로봇의 위치를 수동으로 변경해야 합니다. 그래서 핸드아이 캘리브레이션 모드로 진입하기 이전에 반드시 로봇의 위치를 수동으로 변경할 수 있도록 로봇 티칭 모드를 On으로 변경해야 합니다. 그러므로 핸드아이 캘리브레이션 화면에서 `Start Teaching` 버튼을 클릭해서 로봇 티칭 모드를 활성화 합니다. 로봇마다 차이가 있지만 뉴로메카 로봇의 경우 로봇 티칭모드로 변경될 경우 청색등으로 변경됩니다. 로봇 티칭 모드가 활성화되면 `Calibrate` 버튼을 클릭해서 핸드아이 캘리브레이션 모드로 진입합니다

![handeye calibration dialog](../images/handeye-calibration-dialog.png 'handeye parameter dialog')

## 핸드아이 캘리브레이션 방법

핸드아이 캘리브레이션 모드 진입하면 다음과 같이 카메라 영상이 표시됩니다.

![handeye calibration main](../images/handeye-calibration-main.png 'handeye parameter main')

핸드아이 캘리브레이션 모드 진입 후 핸드아이 캘리브레이션 보드를 촬영할 경우 정상적일 경우 위의 화면과 동일하게 표시됩니다. 화면에 표시되는 축이 흔들리거나 전혀 다른 위치에 표시될 경우 카메라 캘리브레이션에 문제가 있는 것으로 카메라 캘리브레이션을 재수행 해야 합니다.

카메라 캘리브레이션에서 사용하는 Aruco 보드는 아래 링크를 통해서 다운로드 받습니다.

[Handeye Calibration Board Download](https://github.com/aidoop/object-tracker-python/raw/master/data/aruco_marker_board.pdf)

핸드아이 캘리브레이션 모드에서는 Aruco 보드가 부착된 로봇 팔을 다양하게 움직이면서 보드의 위치와 로봇의 팔을 저장하고 저장된 데이터를 이용해서 핸드아이 캘리브레이션의 목적인 Handeye Matrix를 산출합니다. Handeye Matrix는 로봇과 카메라 사이의 좌표계 변환 행렬을 의미합니다.

---

핸드아이 캘리브레이션을 수행하기 위한 단축키는 다음을 참조합니다.

- `A` : 자동 핸드아이 캘리브레이션을 시작합니다.
- `G` : 자동 핸드아이 캘리브레이션이 종료된 이후에 최종 매트릭스를 산출합니다.
- `Z` : 핸드아이 캘리브레이션을 재수행할 수 있도록 저장된 위치 데이터를 모두 삭제합니다.
- `Q` : 핸드아이 캘리브레이션을 종료합니다.

---

1. 핸드아이 캘리브레이션 보드(Aruco Board)가 포함된 화면의 중앙에 위치시킵니다. 캘리브레이션 보드가 중앙에 오도록 배치하고 'A'키를 누르면 자동 캘리브레이션이 시작됩니다.

2. 캘리브레이션 보드의 초기 위치 선정 시 캘리브레이션의 이동을 고려해서 위치를 조정합니다. 가능한 캘리브레이션 보드가 화면에 크게 보여지도록 합니다.

3. 정상적으로 자동 캘리브레이션이 완료되면, 최종적으로 `G`키를 통해서 핸드아이 캘리브레이션 데이터(Handeye Matrix)를 산출합니다.

`G`키 입력 후 'Success'가 표시될 경우 정상적으로 수행이 된 것이며 `Q`키를 통해서 종료하면 다음과 같이 산출된 데이터가 표시되는 것을 확인할 수 있습니다.

![handeye calibration result](../images/handeye-calibration-result.png 'handeye parameter result')

핸드아이 캘리브레이션의 경우 카메라 캘리브레이션과 다르게 결과를 검증할 수 있는 기준 데이터가 존재하지 않기 때문에 캘리브레이션 결과가 'Fail'로 표시되지 않습니다. 그러므로 핸드아이 캘리브레이션의 경우에는 과정 중에서 섬세하게 캡처 작업이 이루어져야 합니다. 경우에 따라서 캘리브레이션 작업을 수회 반복해서 정확한 결과를 확인할 필요가 있습니다. 핸드아이 캘리브레이션의 결과물은 최종적으로 카메라에서 측정된 물체의 위치를 로봇이 동일 위치로 이동하는 지를 확인해서 검증할 수 있습니다.

## 핸드아이 캘리브레이션 데이터 저장

핸드아이 캘리브레이션 모드에서 정상적으로 핸드아이 캘리브레이션 작업이 완료되었을 경우 해당 데이터를 반드시 저장해야 합니다. 저장하지 않은 상태에서 진행될 경우 현재 핸드아이 캘리브레이션 데이터가 사라지기 때문에 반드시 저장을 수행합니다.

![connector parameters save](../images/connector-save.png 'connector parameters save')

## 핸드아이 캘리브레이션 데이터 적용

카메라 캘리브레이션 데이터를 저장까지 되었으면 데이터는 보관되지만 변경된 데이터를 적용하기 위해서는 다음과 같이 카메라 커넥터를 재연결해야 합니다.
재연결은 아래 그림의 커넥터의 링크 부분을 재연결(끊었다가 다시 연결)해 주면 됩니다.

![connector parameters apply](../images/connector-link.png 'connector parameters apply')

## 핸드아이 캘리브레이션 주의 사항

1. 핸드아이 캘리브레이션을 수행할 경우 약 30회 ~ 40회의 데이터를 캡처합니다.
2. 핸드아이 캘리브레이션의 경우 카메라 캘리브레이션과 달리 보드의 일부가 가려져도 축이 유지될 경우라면 정상 동작 합니다.
3. 핸드아이 캘리브레이션은 바로 이전의 위치와 현재 위치의 차이를 이용하기 때문에 다양한 위치의 이동을 권장합니다.
4. 카메라 화면을 기준으로 중심에서 많이 벗어나지 않도록 합니다. 카메라의 외곽은 왜곡 등으로 인해서 마커의 위치 측정 시 오차가 발생하기 쉽기 때문입니다.
5. 많은 변화를 주기 보다는 다양한 위치에서 측정될 수 있도록 합니다.
