핸드-아이 캘리브레이션
이 부분은 Windows 시스템에서 hand_eye_calibration 예제 프로그램을 사용하여 핸드-아이 캘리브레이션을 수행하는 방법에 관한 설명입니다.
HALCON 예제 프로그램 사용 가이드 내용을 참조하여 예제 프로그램을 획득하여 사용 조건을 확인하십시오. |
hand_eye_calibration 폴더에 다음 두 예제 프로그램이 포함됩니다.
-
determine_calibration_poses: 핸드-아이 캘리브레이션을 수행할 때의 캘리브레이션 포즈를 획득하는 데 사용됩니다.
-
perform_hand_eye_calibration: 핸드-아이 캘리브레이션을 수행하는 데 사용됩니다.
|
사전 준비
HALCON 예제 프로그램을 사용하여 핸드-아이 캘리브레이션을 수행하기 전에 다음 작업을 해야 합니다.
-
로봇의 정확도와 로봇을 정상적으로 사용할 수 있는지 확인하십시오.
-
카메라와 함께 제공된 캘리브레이션 보드를 준비하여 캘리브레이션 보드를 설치하십시오.
-
2D 이미지와 뎁스 맵의 퀄리티가 요구 사항을 충족할 수 있는지를 확인하십시오.
-
카메라 내부 파라미터가 요구 사항을 충족할 수 있는지를 확인하십시오.
예제 프로그램 수정
determine_calibration_poses를 통해 캘리브레이션 포즈를 획득한 다음 perform_hand_eye_calibration를 사용하여 핸드-아이 캘리브레이션을 수행해야 합니다.
다음과 같이 두 예제 프로그램의 일부 정보는 일치해야 합니다.
-
연결된 카메라
-
캘리브레이션 보드 모델
또한 포즈를 획득하기 전에 robot_pose.json 파일의 오일러 각 유형을 설정해야 합니다.
동일한 카메라
예제 프로그램을 실행하기 전에 두 예제 프로그램을 실행할 때 연결된 카메라가 일치하도록 하기 위해 예제 프로그램에 설정된 카메라를 수정해야 합니다. 구체적으로 다음과 같습니다.
-
HALCON에서 예제 프로그램을 열기: HALCON 소프트웨어를 부팅하고 예제 프로그램을 HALCON의 프로그램 에디터 화면으로 드래그합니다.
-
변수 검사: MechEyeCameras 창이 팝업될 때까지 툴 바의 버튼을 반복적으로 클릭하여 프로그램을 단계별로 실행합니다.
-
이 창에 모든 연결할 수 있는 카메라가 표시됩니다. 연결할 카메라를 선택하고 더블 클릭하며 unique_name: 또는 user_name: 뒤에 있는 카메라 명칭 내용을 복사합니다.
user_name는 사용자가 설정한 카메라 이름입니다. Mech-Eye Viewer에서 설정할 수 있습니다. -
아래와 같은 명령줄을 찾아 MechEye를 복사한 unique_name 또는 user_name 내용으로 대체합니다.
DeviceInfo := 'MechEye'
캘리브레이션 보드 모델 설정
구체적인 방법은 다음과 같습니다.
-
HALCON에서 예제 프로그램을 열기: HALCON 소프트웨어를 부팅하고 예제 프로그램을 HALCON의 프로그램 에디터 화면으로 드래그합니다.
-
캘리브레이션 보드의 모델 설정: 기본적인 모델은 BDB-5인데 다른 캘리브레이션 보드를 사용하려면 아래 그림에 표시된 연산자를 찾아 BDB-5를 필요한 캘리브레이션 보드로 대체하십시오.
set_framegrabber_param (AcqHandle, 'BoardType', 'BDB-5')
오일러 각 유형과 단위 설정
determine_calibration_poses를 통해 획득한 캘리브레이션 포즈를 robot_pose.json 파일로 입력해야 하며 robot_pose.json 파일에 저장된 오일러 각 유형은 기본적으로 sxyz입니다. 기본적으로 오일러 각의 단위는 도(°)입니다. 오일러 각 유형을 설정하려면 다음과 같이 작업하십시오.
-
robot_pose.json 파일을 엽니다.
-
오일러 각 유형 설정: 아래와 같은 명령줄을 찾아 sxyz를 사용되는 로봇의 오일러 각 유형으로 대체합니다. 예제 프로그램에 지원하는 오일러 각 유형은 로봇 오일러 각 유형 내용을 참조하십시오.
"EulerType":"sxyz"
-
오일러 각 단위 설정: 오일러 각을 라디안 단위로 입력하려면 다음 명령줄에서 true를 false로 바꿉니다.
"FromDegree":true
-
robot_pose.json 파일을 저장합니다.
캘리브레이션 포즈 획득
스텝
핸드-아이 캘리브레이션을 진행하기 전에 최소 15세트의 캘리브레이션 포즈를 얻어야 합니다. 캘리브레이션 포즈를 획득하는 방법은 다음과 같습니다.
-
툴 바에 있는 버튼을 클릭하거나 키보드의 F5 버튼을 눌러 예제 프로그램을 실행하십시오. read_char (WindowHandle, Char, ReCode) 연산자까지 실행될 때 예제 프로그램은 자동으로 중지되고 이때 명령어를 수동으로 입력하여 계속 실행해야 합니다.
카메라가 연결되지 못하는 경우 해당 카메라는 Mech-Eye Viewer 또는 기타 GenICam 클라이언트에 이미 연결되었는지를 확인해야 합니다. -
티치 펜던트를 사용하여 로봇을 올바른 위치로 이동시킵니다.
캘리브레이션 포즈는 특정 조건을 충족해야 하며 관련 설명은 HALCON 참조 매뉴얼에서 얻을 수 있습니다. HALCON的 을 열어 Calibration 부분의 내용을 참조하십시오. -
P를 입력하면 카메라가 이미지를 캡처합니다.
-
캘리브레이션 보드의 일부만 시야 내에 있거나 아예 시야 내에 있지 않은 경우 로봇을 이동하고 이미지를 다시 캡처하십시오.
-
캘리브레이션 보드의 전체가 시야 내에 있는 경우 다음 작업을 수행하십시오.
-
-
T를 입력하면 카메라가 특징 인식 결과가 포함된 이미지를 캡처합니다.
-
카메라가 캘리브레이션 보드에 있는 원을 인식하지 못하는 경우 HALCON에서 이미지를 반환하지 않습니다. 이때 로봇을 이동하여 원시 이미지와 특징 인식 결과가 포함된 이미지를 다시 캡처합니다.
-
카메라가 캘리브레이션 보드에 있는 원을 인식할 수 있는 경우 아래 그림과 같이 HALCON에 특징 인식 결과가 포함된 이미지가 표시됩니다. 이때 다음 작업을 수행하십시오.
-
-
로봇의 티치 펜던트를 확인하고 로봇의 현재 포즈를 robot_pose.json 파일에 입력하십시오. 포즈의 이동량은 mm 단위여야 하며 회전량(오일러 각)의 단위는 robot_pose.json 파일의 설정과 일치해야 합니다.
해당 포즈를 티치 펜던트로 저장하십시오. 이렇게 하면 나중에 핸드-아이 캘리브레이션을 수행할 때 티치 펜던트에 저장된 포즈를 사용하여 로봇을 이동할 수 있습니다. -
스텝 2~5를 반복하여 계속 포즈를 획득하십시오.
-
최소 15세트의 포즈를 확인하면 데이터 수집 과정이 끝납니다. Q를 입력하여 프로그램을 종료하십시오.
-
robot_pose.json 파일의 캘리브레이션 포즈의 개수를 설정합니다. robot_pose.json 파일을 열어 아래와 같은 명령줄을 찾아 15를 실제로 획득한 캘리브레이션 포즈의 개수로 대체합니다.
"pose_count":15
핸드-아이 캘리브레이션 수행
로봇의 캘리브레이션 포즈를 획득한 후 perform_hand_eye_calibration 예제 프로그램을 실행하여 핸드-아이 캘리브레이션을 시작합니다.
카메라 설치 방식 확인
핸드-아이 캘리브레이션을 수행하기 전에 카메라의 설치 방식을 설정해야 합니다.
기본적으로 카메라는 Eye in Hand 식으로 설치됩니다. 만약에 Eye to Hand 식으로 설치하려면 아래 그림에 표시된 연산자를 찾아 EyeInHand를 EyeToHand로 대체하십시오.
set_framegrabber_param (AcqHandle, 'CalibrationType', 'EyeInHand')
좌표계 변경
예제 프로그램에는 카메라가 출력한 포인트 클라우드 좌표계를 변경하는 연산자를 포함합니다. 이 연산자를 통해 로봇 좌표계의 포인트 클라우드를 직접 출력할 수 있습니다.
기본 설정은 좌표계를 변경하지 않습니다. 로봇 좌표계로 변경해야 할 경우, captureTranformedPointCloud 함수에서 아래 그림에 표시된 연산자를 찾아 false를 true로 대체하십시오.
set_framegrabber_param (AcqHandle,'Scan3dCoordinateTransformEnable',false)
스텝
다음과 같이 핸드-아이 캘리브레이션을 수행하십시오.
-
툴 바에 있는 버튼을 클릭하거나 키보드의 F5 버튼을 눌러 예제 프로그램을 실행하십시오. stop까지 실행되면 중지됩니다.
-
로봇을 robot_pose.json 파일에 저장된 캘리브레이션 포즈로 이동시킵니다.
robot_pose.json의 포즈 순서에 따라 로봇을 이동시켜야 합니다. 그렇지 않으면 나중에 외부 파라미터를 계산할 때 실패할 수도 있습니다. -
툴 바에 있는 버튼을 클릭하거나 키보드에 있는 F5 버튼을 눌러 예제 프로그램을 실행하고 이미지를 캡처합니다.
-
이미지 캡처 과정이 끝난 후 컨트롤 변수 중의 CollectResult 값을 확인하십시오.
-
SUCCESS가 표시되면 다음 작업을 수행하십시오.
-
오류 알림이 나타나면 오류 코드 내용을 참조하여 문제를 해결한 다음에 캘리브레이션 포즈를 다시 획득하십시오.
-
-
Move the robot to the next calibration pose 라는 메시지가 나오면 스텝 2~3을 반복하십시오.
로봇은 robot_pose.json에 저장된 모든 위치에 도달한 후 예제 프로그램을 실행하면 외부 파라미터가 자동으로 계산됩니다. -
컨트롤 변수 중의 CalibResult 값을 확인합니다.
-
SUCCESS가 표시되면 핸드-아이 캘리브레이션이 성공한 것입니다. 예제 프로그램이 위치하는 폴더에서 외부 파라미터 파일 Extrinsics.txt 및 좌표계가 전환된 후의 포인트 클라우드를 확인하십시오.
-
오류 알림이 나타나면 오류 코드 내용을 참조하여 문제를 해결한 다음에 캘리브레이션 포즈를 다시 획득하십시오.
-
로봇의 오일러 각 유형
캘리브레이션 예제 프로그램에는 다음과 같은 오일러 각 유형과 사원수 사이의 전환을 지원합니다.
일반적인 표시 방식 | 오일러 각 유형 | 로봇 브랜드 |
---|---|---|
Z-Y'-Z"/OAT |
rzyz |
KAWASAKI(카와사키) |
Z-Y'-X"/yaw, pitch, roll |
rzyx |
ABB |
KUKA(쿠카) |
||
X-Y-Z/WPR |
sxyz |
FANUC(화낙) |
YASKAWA(야스카와) |
||
Rokae(로케) |
||
UR(유니버설 로봇) |
||
X-Y'-Z" |
rxyz |
/ |
Z-X'-Z" |
rzxz |
/ |
|
캘리브레이션 파라미터에 관한 설명
이 부분에서는 핸드-아이 캘리브레이션을 수행할 때 사용하는 파라미터에 대해 소개하겠습니다.
BoardType
이 파라미터는 캘리브레이션 보드의 모델을 설정하는 데 사용됩니다.
값 리스트와 관련 설명
값 | 설명 |
---|---|
BDB-5 |
캘리브레이션 보드와 카메라 사이의 거리의 추천값: < 0.6m |
BDB-6 |
캘리브레이션 보드와 카메라 사이의 거리의 추천값: 0.6~1.5m |
BDB-7 |
캘리브레이션 보드와 카메라 사이의 거리의 추천값: > 1.5m |
OCB-005 |
카메라가 Eye to Hand 방식으로 설치되고 정밀도에 대한 요구 사항이 높은 프로젝트에만 사용됨 |
OCB-010 |
|
OCB-015 |
|
OCB-020 |
|
CGB-020 |
캘리브레이션 보드와 카메라 사이의 거리의 추천값: < 0.6m |
CGB-035 |
캘리브레이션 보드와 카메라 사이의 거리의 추천값: 0.6~1.5m |
CGB-050 |
캘리브레이션 보드와 카메라 사이의 거리의 추천값: > 1.5m |
ExtrinErrCode
이 읽기 전용 파라미터는 핸드-아이 캘리브레이션 과정 중에 상태 코드와 오류 코드를 확인하는 데 사용됩니다.
상태 코드 | 설명 |
---|---|
SUCCESS |
실행 성공 |
POSE_INVALID |
포즈 포맷의 오류(사원수를 입력해야 함) |
IMAGE2D_EMPTY |
무효한 2D 이미지 |
FIND_CORNERS_FAIL |
2D 이미지의 특징을 인식하지 못했습니다. 2D 이미지 관련 파라미터를 조정하여 요구 사항을 충족하는 2D 이미지를 획득하십시오. |
DEPTH_EMPTY |
무효한 뎁스 맵 |
CORNERS_3D_INVALID |
뎁스 맵의 특징을 인식하지 못했습니다. 뎁스 맵 관련 파라미터를 조정하여 요구 사항을 충족하는 뎁스 맵을 획득하십시오. |
POSES_INSUFFICIENT |
포즈 수 부족(최소 15세트의 포즈를 입력해야 함) |