HALCON을 이용한 핸드-아이 캘리브레이션

소개

이 가이드에서는 HALCON 사용 Zivid 카메라와 핸드-아이 캘리브레이션을 통합하는 방법을 설명합니다. 일반적으로 핸드-아이 캘리브레이션에는 핸드-아이 GUI 사용하는 것이 권장되지만, 이 가이드에서는 HALCON과 HDevelop을 사용하는 대안적인 접근 방식을 제공합니다. 이러한 연산자는 HALCON의 C++ 및 C# 인터페이스에서도 사용할 수 있습니다. HDevelop 샘플 코드는 샘플 저장소에서 확인할 수 있습니다.

HDevelop 샘플을 실행하려면 샘플 데이터가 필요하지만, 사용자 고유의 데이터로 대체할 수 있습니다.

MVTec 문서/핸드-아이 캘리브레이션 문제 및 HALCON 원리

MVTec은 핸드-아이 캘리브레이션 및 머신 비전에 대한 더 자세한 내용과 구체적인 사항을 다루는 포괄적인 문서를 제공합니다. 핸드-아이 캘리브레이션 관련 문서는 Solution Guide III-C: 3D Vision 에 설명되어 있으며, 관련 섹션은 Chapter 8: Robot Vision 입니다.

핸드-아이 캘리브레이션을 성공적으로 수행하는 방법은 여러 가지가 있습니다. 어떤 방법도 완벽하지는 않지만, 어떤 방법을 선택할지는 특정 사용 사례와 요구 사항에 따라 달라집니다. 원칙적으로 기본 원리는 유사합니다. 목표는 카메라 좌표계와 로봇 베이스 또는 로봇 플랜지의 좌표계 사이의 동차 변환을 찾는 것입니다. Zivid 카메라에서 수집된 데이터는 3D이므로, 변환은 로봇 베이스 좌표계에서 카메라의 포즈를 이용하여 간단히 계산할 수 있습니다. 자세한 내용은 핸드-아이 캘리브레이션 이론 참조하십시오.

HALCON/HDevelop 사용 방법에 대한 자세한 내용은 다음 페이지 HALCON 샘플 실행 방법 를 참조하십시오.

필수 조건

카메라 설정

일반적으로 가능한 한 사전 설정값을 사용하는 것이 좋습니다. 이는 핸드-아이 캘리브레이션에도 적용됩니다. 최상의 성능을 보장하기 위해 핸드-아이 캘리브레이션에 사용한 설정값을 애플리케이션 자체에도 사용하는 것이 이상적입니다. 샘플 데이터에서는 제조사에서 설정한 사전 설정값을 사용했습니다. 설정에 어려움이 있는 경우, 핸드-아이 캘리브레이션을 위한 카메라 설정.

캘리브레이션 대상

두 좌표계 간의 핸드-아이 캘리브레이션을 수행하려면 두 좌표계 모두에서 공통된 포즈 또는 점 쌍이 필요합니다. 이러한 포즈/점 쌍을 생성하려면 캘리브레이션 객체가 필요합니다. 자세한 내용은 캘리브레이션 객체 를 참조하십시오. HALCON 캘리브레이션 플레이트를 사용하거나, 형상이 알려져 있고 대칭이 없는 3D 캘리브레이션 객체를 사용할 수 있습니다.

../../../../_images/halcon_3d_calibration_object.png ../../../../_images/halcon_calplate_marker_pattern.png

참고

Zivid 카메라로 수집된 데이터는 3D이므로 2D 카메라 내부 특성에 의존하는 핸드-아이 캘리브레이션 방법을 사용할 필요가 없습니다.

로봇 포즈

모든 로봇 제조업체는 물론이고, 심지어 같은 제조업체의 다른 로봇 모델조차도 로봇 자세를 표현하고 내보내는 방식이 서로 다릅니다. 직교 좌표계에서 위치는 X, Y, Z(오른손 좌표계)로 나타내지만, 방향은 다양한 방식으로 표현될 수 있습니다. 특히 오일러 각은 여러 가지 방식으로 매개변수화되므로 로봇이 어떤 규칙을 사용하는지 아는 것이 중요합니다. 쿼터니언과 동차 변환 행렬은 모호하지 않아 다루기 쉽지만, 항상 사용 가능한 것은 아닙니다.

HALCON은 포즈에서 방향을 표현하는 다양한 방법을 지원하며, 이러한 방법들 간의 변환도 가능합니다. 이는 create_pose 연산자에 대한 문서에 자세히 설명되어 있습니다. pose_to_hom_mat3d 연산자를 사용하면 로봇 포즈를 동차 변환 행렬로 변환할 수 있습니다. 포즈에 대한 수학적 설명은 포즈 변환 에서도 확인할 수 있습니다.

로봇 자세를 기록하는 방법은 여러 가지가 있습니다. 하지만 HALCON은 어떤 로봇 제조사와도 연동되는 인터페이스를 제공하지 않기 때문에 소켓 연결이나 다른 인터페이스를 사용하여 직접 프로그래밍해야 합니다. 본 예시에서는 로봇 자세를 수동으로 기록하고 HALCON에 입력했습니다.

핸드-아이 캘리브레이션 프로세스

캘리브레이션 과정을 시작하기 전에 다음 사항을 확인하십시오.

핸드-아이 캘리브레이션캘리브레이션 단계

핸드-아이 캘리브레이션 과정은 다음과 같은 단계를 포함합니다.

  1. 다양한 로봇 구성에서 보정 객체의 자세를 캡처합니다.

  2. 각 이미지에서 보정 객체의 특징을 감지합니다.

  3. 해당 로봇 엔드 이펙터 자세 등록

  4. 3D 장면과 로봇 자세 쌍 저장

아이인핸드(eye-in-hand) 캘리브레이션이든 아이투핸드(eye-to-hand) 캘리브레이션이든 과정은 유사합니다. 위에서 설명한 단계들을 모두 포함합니다. 차이점은 아이인핸드 캘리브레이션에서는 카메라가 로봇 엔드 이펙터에 장착되는 반면, 아이투핸드 캘리브레이션에서는 카메라가 환경에 고정되어 로봇을 관찰한다는 점입니다. 따라서 아이인핸드 캘리브레이션에서는 캘리브레이션 대상이 고정되어 있지만, 아이투핸드 캘리브레이션에서는 캘리브레이션 대상이 로봇과 함께 움직입니다. 두 경우 모두 로봇의 다양한 자세, 즉 카메라 시야각 내의 다양한 자세에서 캘리브레이션 대상의 이미지를 촬영해야 합니다.

따라서 데이터 수집과 관련하여 다음 사항들은 두 가지 시나리오 모두에 적용됩니다.

  • 로봇을 10~20가지의 서로 다른 자세로 움직입니다.

  • 다양한 시점을 확보하고 모든 관절을 활용

  • 각 자세에서 보정 대상을 캡처합니다.

  • 컨트롤러를 통해 로봇의 자세를 기록합니다.

핸드-아이 캘리브레이션을 위한 좋은 데이터셋을 얻는 방법에 대한 자세한 내용과 팁은 좋은 데이터셋 얻기 참조하세요.

예시에서, 포인트 클라우드는 ZividStudio에서 획득한 후 *.zdf 및 *.ply (법선 포함) 파일로 내보내지고, 해당 로봇 포즈는 텍스트 파일로 저장됩니다. *.zdf 파일은 추정된 내부 파라미터를 추출하는 데 필요하며, *.ply 파일은 각 이미지에서 캘리브레이션 객체의 포즈를 저장하는 데 사용됩니다.

참고

HALCON은 보정 객체의 자세 추정에 법선 벡터를 사용하므로, 내보낸 포인트 클라우드 파일에 법선 벡터가 포함되어 있는지 확인하는 것이 중요합니다.

검증 및 디버깅을 위해 캡처 이미지와 포즈 쌍으로 구성된 데이터셋을 저장하는 것이 좋습니다.

카메라 내부 구조

HALCON 캘리브레이션 플레이트를 사용할 때는 캘리브레이션 플레이트 캡처 시 생성된 ZDF 파일에서 얻은 내부 신호 데이터를 HALCON에 로드하는 것이 좋습니다. 자세한 내용은 기술 자료의 카메라 내부 신호 섹션을 참조하십시오. ZDF 파일과 해당 Python 스크립트를 사용하여 내부 신호 데이터를 HALCON 형식으로 저장한 후에는 다음과 같이 로드할 수 있습니다.

read_cam_par(ZividDataDir + '/ZividHandEyeHalconData/estimated_intrinsics.dat', InputCameraParameters)

특징 추출

HALCON 캘리브레이션 플레이트를 사용할 때, find_calib_object 연산자를 사용하여 캡처된 각 이미지에서 캘리브레이션 객체의 자세를 추출할 수 있습니다.

create_calib_data ('hand_eye_moving_cam', 1, 1, CalibDataID)
set_calib_data_calib_object (CalibDataID, 0, CalibrationPlateFile)
find_calib_object (GrayImage, CalibDataID, 0, 0, I, ['sigma'], [2])

3D 캘리브레이션 객체를 사용하는 경우, 캡처된 각 장면에서 객체의 포즈를 찾아야 합니다. 캡처된 각 이미지에서 캘리브레이션 객체의 특징을 추출하여 여러 시점 간의 점 대응 관계를 설정합니다. 캘리브레이션 객체의 포즈 추출에는 create_surface_modelfind_surface_model 연산자를 사용할 수 있습니다.

create_surface_model (ObjectModel3DCalibrationObject, 0.03, [], [], SurfaceModelID)
find_surface_model (SurfaceModelID, ObjectModel3DScene, 0.05, 0.2, 0, 'false', [], [], PoseObject, Score, SurfaceMatchingResultID)

이동 계산

HALCON에서는 보정 대상과 로봇의 포즈 쌍을 수집합니다. 이렇게 수집된 포즈 쌍을 사용

create_calib_data ('hand_eye_moving_cam', 0, 0, CalibDataID)

for j := 1 to NumberOfCaptures by 1
    set_calib_data_observ_pose (CalibDataID, 0, 0, j, PoseObjects[j])
    set_calib_data (CalibDataID, 'tool', j, 'tool_in_base_pose', RobotPoses[j])
endfor

로봇 자세와 보정 객체 자세 쌍이 수집되면 HALCON hand_eye_calibration 사용하여 변환을 계산할 수 있습니다.

calibrate_hand_eye (CalibDataID, Errors)

확인

보정 후 다음 방법으로 결과를 확인하십시오.

  • 각 보정 자세에 대한 잔차 확인

  • 로봇을 이용한 터치 테스트 수행

  • 포인트 클라우드 정렬을 시각적으로 검사

HALCON/HDevelop에서 연산자와 3D 시각화 방법을 사용하여 이 작업을 수행할 수 있습니다. 또한, 얻은 동차 변환 행렬을 핸드-아이 GUI 에서 얻은 행렬과 비교할 수 있습니다. 보정 품질 평가에 대한 자세한 내용은 핸드-아이 보정 검증 참조하십시오.

다음 단계

캘리브레이션 결과를 검증하는 방법을 알기 위해 핸드-아이 캘리브레이션 결과 활용 방법 를 읽어보십시오.