HALCON—핸드 아이 캘리브레이션¶
이 부분에서는 Windows 시스템에서 Mech-Mind가 제공하는 예제 프로그램을 사용하여 핸드-아이 캘리브레이션을 수행하는 방법을 소개합니다. Mech-Mind는 다음 두 가지 예제 프로그램을 제공합니다.
determine_calibration_poses.hdev:핸드-아이 캘리브레이션을 수행할 때의 캘리브레이션 포즈 를 획득하는 데 사용됩니다.
perform_hand_eye_calibration.hdev:핸드-아이 캘리브레이션을 수행하는 데 사용됩니다.
참고
6축 로봇에만 적용됩니다.
UHP 시리즈 카메라를 사용하여 핸드-아이 캘리브레이션을 수행할 때 캡처 모드 를 Camera1 로 설정해야 합니다.
사용 조건¶
HALCON을 사용하여 핸드-아이 캘리브레이션을 수행하기 전에 다음과 같은 준비 사항을 확인해야 합니다.
로봇의 정확도와 로봇을 정상적으로 사용할 수 있는지 확인하십시오.
카메라와 함께 제공된 캘리브레이션 보드를 준비하고 카메라와 캘리브레이션 보드 설치 내용을 참조하여 작업하십시오.
Mech-Eye SDK 를 다운받고 설치하십시오.
2D 맵과 뎁스 맵 이 요구 사항을 충족하는지를 확인하십시오.
카메라 내부 파라미터 가 요구 사항을 충족하는지를 확인하십시오.
HALCON 예제 프로그램 을 다운로드하십시오.
를 순서대로 클릭하여
예제 프로그램 수정¶
determine_calibration_poses.hdev 를 통해 캘리브레이션 포즈를 획득한 다음 perform_hand_eye_calibration.hdev 를 사용하여 핸드-아이 캘리브레이션을 수행해야 합니다.
다음과 같이 두 예제 프로그램의 일부 정보는 일치해야 합니다.
연결된 카메라
캘리브레이션 보드 모델
또한 포즈를 획득하기 전에 robot_pose.json 파일의 오일러 각 유형을 설정해야 합니다.
동일한 카메라¶
예제 프로그램을 실행하기 전에 두 예제 프로그램을 실행할 때 연결된 카메라가 일치하도록 하기 위해 예제 프로그램에 설정된 카메라를 수정해야 합니다. 구체적으로 다음과 같습니다.
HALCON에서 예제 프로그램을 열기: HALCON 소프트웨어를 부팅하고 예제 프로그램을 HALCON의 프로그램 에디터 화면으로 드래그합니다.
프로그램 에디터 에서 info_framegrabber 연산자가 위치하는 줄을 선택하여 툴바에 있는 버튼을 클릭하거나 키보드의 F6 버튼을 눌러 해당 연산자를 실행하십시오.
컨트롤 변수 영역의 DeviceInfos 를 더블 를릭하면 연결될 수 있는 모든 카메라를 확인할 수 있습니다.
카메라를 선택하고 더블 클릭하며 unique_name: 또는 user_name: 뒤에 있는 카메라 명칭 내용을 복사하십시오.
아래와 같은 명령줄을 찾아 MechEye 를 unique_name 또는 user_name 내용으로 대체하십시오.
DeviceInfo := 'MechEye'
캘리브레이션 보드 모델 설정¶
구체적인 방법은 다음과 같습니다.
HALCON에서 예제 프로그램을 열기: HALCON 소프트웨어를 부팅하고 예제 프로그램을 HALCON의 프로그램 에디터 화면으로 드래그합니다.
캘리브레이션 보드의 모델을 설정합니다. 기본적인 모델은 BDB-5인데 다른 캘리브레이션 보드를 사용하려면 아래 그림에 표시된 연산자를 찾아 BDB-5 를 필요한 캘리브레이션 보드 로 대체하십시오.
set_framegrabber_param (AcqHandle, 'BoardType', 'BDB-5')
오일러 각 유형과 단위 설정¶
determine_calibration_poses.hdev 를 통해 획득한 캘리브레이션 포즈를 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 클라이언트에 이미 연결되었는지를 확인해야 합니다.
티치 펜던트를 사용하여 로봇을 올바른 위치로 이동시킵니다.
P 를 입력하면 카메라가 이미지를 캡처합니다.
캘리브레이션 보드의 일부만 시야 내에 있거나 아예 시야 내에 있지 않은 경우 로봇을 이동하고 이미지를 다시 캡처하십시오.
캘리브레이션의 전체가 시야 내에 있는 경우 다음 작업을 수행하십시오.
T 를 입력하면 카메라가 특징 인식 결과가 포함되는 이미지를 캡처합니다.
카메라가 캘리브레이션 보드에 있는 원을 인식하지 못하는 경우 HALCON에서 이미지를 반환하지 않습니다. 이때 로봇을 이동하여 원시 이미지와 특징 인식 결과가 포함된 이미지를 다시 캡처합니다.
카메라가 캘리브레이션 보드에 있는 원을 인식할 수 있는 경우 아래 그림과 같이 HALCON에 특징 인식 결과가 포함된 이미지가 표시됩니다. 이때 다음 작업을 수행하십시오.
로봇의 티치 펜던트를 확인하고 로봇의 현재 포즈를 robot_pose.json 파일에 입력하십시오.
힌트
나중에 캘리브레이션을 할 때 티치 펜던트에 저장된 포즈를 사용하여 로봇을 이동할 수 있도록 하기 위해 해당 포즈를 티치 펜던트로 저장하십시오.
스텝 2~5를 반복하여 계속 포즈를 획득하십시오.
최소 15세트의 포즈를 확인하면 데이터 수집 과정이 끝납니다. Q 를 입력하여 프로그램을 종료하십시오.
robot_pose.json 파일의 캘리브레이션 포즈의 개수를 설정합니다. robot_pose.json 파일을 열어 아래와 같은 명령줄을 찾아 15 를 실제로 획득한 캘리브레이션 포즈의 개수로 대체합니다.
"pose_count":15
핸드-아이 캘리브레이션 수행¶
로봇의 캘리브레이션 포즈를 획득한 후 perform_hand_eye_calibration.hdev 예제 프로그램을 실행하여 핸드 -아이 캘리브레이션을 시작합니다.
카메라 설치 방식¶
핸드 -아이 캘리브레이션을 수행하기 전에 카메라의 설치 방식을 설정해야 합니다.
기본적으로 카메라는 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〉〉 |
rzyz |
Kawasaki(카와사키) |
Z-Y〉-X〉〉 |
rzyx |
ABB |
KUKA(쿠카) |
||
X-Y-Z |
sxyz |
FANUC(화낙) |
YASKAWA(야스카와) |
||
Rokae(로케) |
||
UR |
||
X-Y〉-Z〉〉 |
rxyz |
/ |
Z-X〉-Z〉〉 |
rzxz |
/ |
참고
오일러 각의 유형이 같은 경우 로봇의 오일러 각 표시 순서가 다를 수 있습니다. 위 표의 입력 순서에 따라 오일러 각을 입력하십시오.
사용하는 로봇의 오일러 각 유형이 위 표에 없는 경우 오일러 각 유형과 사원수 간의 전환을 직접 추가해야 합니다. perform_hand_eye_calibration.hdev 예제 프로그램의 euler_to_quad 함수에 기존 코드를 참조하여 전환을 추가합니다.
캘리브레이션 파라미터에 관한 설명¶
이 부분에서는 핸드-아이 캘리브레이션을 수행할 때 사용하는 파라미터에 대해 소개하겠습니다.
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 |
뎁스 맵의 특징을 인식하지 못했습니다. 3D 파라미터 를 조절하여 요구 사항을 충족하는 뎁스 맵을 획득하십시오. |
POSES_INSUFFICIENT |
포즈 수 부족(최소 15세트의 포즈를 입력해야 함) |