HALCON—핸드 아이 캘리브레이션

이 부분에서는 Windows 시스템에서 Mech-Mind가 제공하는 예제 프로그램을 사용하여 핸드-아이 캘리브레이션을 수행하는 방법을 소개합니다. Mech-Mind는 다음 두 가지 예제 프로그램을 제공합니다.

  • determine_calibration_poses.hdev:핸드-아이 캘리브레이션을 수행할 때의 캘리브레이션 포즈 를 획득하는 데 사용됩니다.

  • perform_hand_eye_calibration.hdev:핸드-아이 캘리브레이션을 수행하는 데 사용됩니다.

참고

  • 6축 로봇에만 적용됩니다.

  • UHP 시리즈 카메라를 사용하여 핸드-아이 캘리브레이션을 수행할 때 캡처 모드Camera1 로 설정해야 합니다.

사용 조건

HALCON을 사용하여 핸드-아이 캘리브레이션을 수행하기 전에 다음과 같은 준비 사항을 확인해야 합니다.

  1. 로봇의 정확도와 로봇을 정상적으로 사용할 수 있는지 확인하십시오.

  2. 카메라와 함께 제공된 캘리브레이션 보드를 준비하고 카메라와 캘리브레이션 보드 설치 내용을 참조하여 작업하십시오.

  3. Mech-Eye SDK 를 다운받고 설치하십시오.

  4. 2D 맵과 뎁스 맵 이 요구 사항을 충족하는지를 확인하십시오.

  5. 카메라 내부 파라미터 가 요구 사항을 충족하는지를 확인하십시오.

  6. Code ‣ Download ZIP 를 순서대로 클릭하여 HALCON 예제 프로그램 을 다운로드하십시오.

예제 프로그램 수정

determine_calibration_poses.hdev 를 통해 캘리브레이션 포즈를 획득한 다음 perform_hand_eye_calibration.hdev 를 사용하여 핸드-아이 캘리브레이션을 수행해야 합니다.

다음과 같이 두 예제 프로그램의 일부 정보는 일치해야 합니다.

  • 연결된 카메라

  • 캘리브레이션 보드 모델

또한 포즈를 획득하기 전에 robot_pose.json 파일의 오일러 각 유형을 설정해야 합니다.

동일한 카메라

예제 프로그램을 실행하기 전에 두 예제 프로그램을 실행할 때 연결된 카메라가 일치하도록 하기 위해 예제 프로그램에 설정된 카메라를 수정해야 합니다. 구체적으로 다음과 같습니다.

  1. HALCON에서 예제 프로그램을 열기: HALCON 소프트웨어를 부팅하고 예제 프로그램을 HALCON의 프로그램 에디터 화면으로 드래그합니다.

  2. 프로그램 에디터 에서 info_framegrabber 연산자가 위치하는 줄을 선택하여 툴바에 있는 step_over 버튼을 클릭하거나 키보드의 F6 버튼을 눌러 해당 연산자를 실행하십시오.

  3. 컨트롤 변수 영역의 DeviceInfos 를 더블 를릭하면 연결될 수 있는 모든 카메라를 확인할 수 있습니다.

    ../../_images/camera_information_1.png
  4. 카메라를 선택하고 더블 클릭하며 unique_name: 또는 user_name: 뒤에 있는 카메라 명칭 내용을 복사하십시오.

    ../../_images/camera_information_3.png
  5. 아래와 같은 명령줄을 찾아 MechEyeunique_name 또는 user_name 내용으로 대체하십시오.

    DeviceInfo := 'MechEye'
    
  6. 툴바에 있는 run 버튼을 클릭하거나 키보드에 있는 F5 버튼을 눌러 예제 프로그램을 실행합니다.

캘리브레이션 보드 모델 설정

구체적인 방법은 다음과 같습니다.

  1. HALCON에서 예제 프로그램을 열기: HALCON 소프트웨어를 부팅하고 예제 프로그램을 HALCON의 프로그램 에디터 화면으로 드래그합니다.

  2. 캘리브레이션 보드의 모델을 설정합니다. 기본적인 모델은 BDB-5인데 다른 캘리브레이션 보드를 사용하려면 아래 그림에 표시된 연산자를 찾아 BDB-5 를 필요한 캘리브레이션 보드 로 대체하십시오.

    set_framegrabber_param (AcqHandle, 'BoardType', 'BDB-5')
    

오일러 각 유형과 단위 설정

determine_calibration_poses.hdev 를 통해 획득한 캘리브레이션 포즈를 robot_pose.json 파일로 입력해야 하며 robot_pose.json 파일에 저장된 오일러 각 유형은 기본적으로 sxyz 입니다. 기본적으로 오일러 각의 단위는 도(°)입니다. 오일러 각 유형을 설정하려면 다음과 같이 작업하십시오.

  1. robot_pose.json 파일을 열어주십시오.

  2. 오일러 각 유형을 설정합니다. 아래와 같은 명령줄을 찾아 sxyz 를 사용되는 로봇의 오일러 각 유영으로 대체합니다. 예제 프로그램에 지원하는 오일러 각 유형은 로봇 오일러 각 유형 내용을 참조하십시오.

    "EulerType":"sxyz"
    
  3. 오일러 각의 단위를 설정합니다. 오일러 각을 라디안 단위로 입력하려면 다음 명령줄에서 **true**를 **false**로 바꿉니다.

    "FromDegree":true
    
  4. robot_pose.json 파일을 저장하십시오.

캘리브레이션 포즈 획득

플로우 차트

../../_images/extri_teach_flow.png

스텝

핸드-아이 캘리브레이션을 진행하기 전에 최소 15세트의 캘리브레이션 포즈를 얻어야 합니다. 캘리브레이션 포즈를 획득하는 방법은 다음과 같습니다.

  1. 툴바에 있는 run 버튼을 클릭하거나 키보드의 F5 버튼을 눌러 예제 프로그램을 실행하십시오. read_char (WindowHandle, Char, ReCode) 연산자까지 실행될 때 예제 프로그램은 자동으로 중지되고 이때 명령어를 수동으로 입력하여 계속 실행해야 합니다.

    힌트

    카메라가 연결되지 못하는 경우 해당 카메라는 Mech-Eye Viewer 또는 기타 GenICam 클라이언트에 이미 연결되었는지를 확인해야 합니다.

  2. 티치 펜던트를 사용하여 로봇을 올바른 위치로 이동시킵니다.

  3. P 를 입력하면 카메라가 이미지를 캡처합니다.

    • 캘리브레이션 보드의 일부만 시야 내에 있거나 아예 시야 내에 있지 않은 경우 로봇을 이동하고 이미지를 다시 캡처하십시오.

    • 캘리브레이션의 전체가 시야 내에 있는 경우 다음 작업을 수행하십시오.

  4. T 를 입력하면 카메라가 특징 인식 결과가 포함되는 이미지를 캡처합니다.

    • 카메라가 캘리브레이션 보드에 있는 원을 인식하지 못하는 경우 HALCON에서 이미지를 반환하지 않습니다. 이때 로봇을 이동하여 원시 이미지와 특징 인식 결과가 포함된 이미지를 다시 캡처합니다.

    • 카메라가 캘리브레이션 보드에 있는 원을 인식할 수 있는 경우 아래 그림과 같이 HALCON에 특징 인식 결과가 포함된 이미지가 표시됩니다. 이때 다음 작업을 수행하십시오.

      ../../_images/calib_sample.png
  5. 로봇의 티치 펜던트를 확인하고 로봇의 현재 포즈를 robot_pose.json 파일에 입력하십시오.

    힌트

    • 나중에 캘리브레이션을 할 때 티치 펜던트에 저장된 포즈를 사용하여 로봇을 이동할 수 있도록 하기 위해 해당 포즈를 티치 펜던트로 저장하십시오.

  6. 스텝 2~5를 반복하여 계속 포즈를 획득하십시오.

  7. 최소 15세트의 포즈를 확인하면 데이터 수집 과정이 끝납니다. Q 를 입력하여 프로그램을 종료하십시오.

  8. robot_pose.json 파일의 캘리브레이션 포즈의 개수를 설정합니다. robot_pose.json 파일을 열어 아래와 같은 명령줄을 찾아 15 를 실제로 획득한 캘리브레이션 포즈의 개수로 대체합니다.

    "pose_count":15
    

핸드-아이 캘리브레이션 수행

로봇의 캘리브레이션 포즈를 획득한 후 perform_hand_eye_calibration.hdev 예제 프로그램을 실행하여 핸드 -아이 캘리브레이션을 시작합니다.

카메라 설치 방식

핸드 -아이 캘리브레이션을 수행하기 전에 카메라의 설치 방식을 설정해야 합니다.

기본적으로 카메라는 Eye in Hand 식으로 설치됩니다. 만약에 Eye to Hand 식으로 설치하려면 아래 그림에 표시된 연산자를 찾아 EyeInHandEyeToHand 로 대체하십시오.

set_framegrabber_param (AcqHandle, 'CalibrationType', 'EyeInHand')

좌표계 전환하기

예제 프로그램에는 카메라가 출력한 포인트 클라우드 좌표계를 전환하는 연산자를 포함합니다. 이 연산자를 통해 로봇 좌표계의 포인트 클라우드를 직접 출력할 수 있습니다.

기본 설정은 좌표계를 전환하지 않습니다. 로봇 좌표계로 전환해야 할 경우, captureTranformedPointCloud 함수에서 아래 그림에 표시된 연산자를 찾아 falsetrue 로 대체하십시오.

set_framegrabber_param (AcqHandle, 'Scan3dCoordinateTransformEnable',false)

스텝

다음과 같이 핸드-아이 캘리브레이션을 수행하십시오.

  1. 툴바에 있는 run 버튼을 클릭하거나 키보드에 있는 F5 버튼을 눌러 예제 프로그램을 실행하십시오. stop까지 실행되면 중지됩니다.

  2. 로봇을 robot_pose.json 파일에 저장된 캘리브레이션 포즈로 이동시킵니다.

    힌트

    robot_pose.json 의 포즈 순서에 따라 로봇을 이동시켜야 합니다. 그렇지 않으면 나중에 외부 파라미터를 계산할 때 실패할 수도 있습니다.

  3. 툴바에 있는 run 버튼을 클릭하거나 키보드에 있는 F5 버튼을 눌러 예제 프로그램을 실행하고 이미지를 캡처합니다.

  4. 이미지 캡처 과정이 끝난 후 컨트롤 변수 중의 CollectResult 값을 확인하십시오.

    • SUCCESS 가 표시되면 다음 작업을 수행하십시오.

    • 오류 알림이 나타나면 오류 코드 내용을 참조하여 문제를 해결한 다음에 캘리브레이션 포즈를 다시 획득하십시오.

  5. “Move the robot to the next calibration pose”라는 메시지가 나오면 스텝 2~3을 반복하십시오.

    힌트

    로봇은 robot_pose.json 에 저장된 모든 위치에 도달한 후 예제 프로그램을 실행하면 외부 파라미터가 자동으로 계산됩니다.

  6. 컨트롤 변수 중의 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세트의 포즈를 입력해야 함)