Hand Eye Calibrator 3D

1 개요

Robot End Effector와 Camera 간의 변환 행렬을 추정하는 알고리즘입니다.

Reference Array
Fig. Camera_from_Hand, Robot End Effector(Hand)와 Camera간 변환 관계

위 결과는 Eye_In_Hand 상황의 Camera_from_Hand에 해당합니다.

2 알고리즘 상세 설명

Calibration Object Hand Eye Calibration Result
Chess Board Hand Eye Result2
Fig. 촬영된 Chess Board 이미지 및 Hand Eye Calibration 결과(Eye-in-hand)

3 파라미터 설정 및 사용 방법

Calibration을 위한 Camera 내부 파라미터 설정 방법은 Camera Pose 3D와 동일합니다.

카메라 외부 행렬 설정 방법

엔드 이펙터 설정 방법

4.알고리즘 수행 결과 취득 방법

5 좌표계 변환 방법

6 예제 코드

CHandEyeCalibrator3D HandEyeCalibrator3D;
CFLImage fliSourceImage;

fliSourceImage.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/HandEyeCalibrator3D/ChessBoard.flif");
HandEyeCalibrator3D.SetSourceImage(fliSourceImage);
HandEyeCalibrator3D.LoadEndEffectorPose(L"C:/Users/Public/Documents/FLImaging/ExampleImages/HandEyeCalibrator3D/EndEffectorPose.csv"); // End Effector 포즈 불러오기
HandEyeCalibrator3D.SetCalibrationObjectType(ThreeDim::ECalibrationObjectType::ECalibrationObjectType_ChessBoard); // 캘리브레이션 객체 타입을 체스 보드로 설정
HandEyeCalibrator3D.SetRotationType(ThreeDim::CHandEyeCalibrator3D::ERotationType_RotationVector); // End Effector 회전 타입 설정
HandEyeCalibrator3D.SetOptimizationMethod(ThreeDim::CHandEyeCalibrator3D::EOptimizationMethod::EOptimizationMethod_Nonlinear); // 최적화 방법 설정
HandEyeCalibrator3D.SetEndEffectorAngleUnit(ImageProcessing::EAngleUnit::EAngleUnit_Radian); // End Effector 회전 각도 단위 설정

// 오일러 각 회전 순서
// SetRotationType(CHandEyeCalibrator3D::ERotationType_EulerAngle)시 설정
HandEyeCalibrator3D.SetEulerSequence(Foundation::EEulerSequence::EEulerSequence_Extrinsic_XYZ); 

HandEyeCalibrator3D.SetScaleFactor(1.000000); // End Effector Scale Factor 설정
HandEyeCalibrator3D.SetResultScaleFactor(1.000000); // 결과 Scale Factor 설정

HandEyeCalibrator3D.SetOptimalSolutionAccuracy(0.000001); // 최적화 정확도 설정

CFLArray<double> flaDistortionCoef;

flaDistortionCoef.PushBack(-0.053853);
flaDistortionCoef.PushBack(0.059036);
flaDistortionCoef.PushBack(0.000375);
flaDistortionCoef.PushBack(0.000786);
flaDistortionCoef.PushBack(-0.018948);
HandEyeCalibrator3D.SetCalibrationDistortionCoefficient(flaDistortionCoef); 왜곡 계수 설정

CFLPoint<double> flpFocalLength;
CFLPoint<double> flpPrincipalPoint;

flpFocalLength.x = 428.668823; 
flpFocalLength.y = 428.268188;
flpPrincipalPoint.x = 422.934998; 
flpPrincipalPoint.y = 240.188660;	
HandEyeCalibrator3D.SetCalibrationCameraMatrix(flpFocalLength, flpPrincipalPoint); // 카메라 내부 행렬 설정
HandEyeCalibrator3D.SetCalibrationBoardCellPitch(15.000000, 15.000000); // 체스 보드 셀 간격 설정
HandEyeCalibrator3D.Calibrate();

CHandEyeCalibrator3D HandEyeCalibrator3D = new CHandEyeCalibrator3D();
CFLImage fliSourceImage = new CFLImage();
fliSourceImage.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/HandEyeCalibrator3D/ChessBoard.flif");
HandEyeCalibrator3D.SetSourceImage(ref fliSourceImage);
HandEyeCalibrator3D.LoadEndEffectorPose("C:/Users/Public/Documents/FLImaging/ExampleImages/HandEyeCalibrator3D/EndEffectorPose.csv"); // End Effector 포즈 불러오기
HandEyeCalibrator3D.SetCalibrationObjectType(ECalibrationObjectType.ChessBoard); // 캘리브레이션 객체 타입을 체스 보드로 설정
HandEyeCalibrator3D.SetRotationType(ERotationType.RotationVector); // End Effector 회전 타입 설정
HandEyeCalibrator3D.SetOptimizationMethod(EOptimizationMethod.Nonlinear); // 최적화 방법 설정
HandEyeCalibrator3D.SetEndEffectorAngleUnit(EAngleUnit.Radian); // End Effector 회전 각도 단위 설정
HandEyeCalibrator3D.SetOptimalSolutionAccuracy(0.000010); // 최적화 정확도 설정

// 오일러 각 회전 순서
// SetRotationType(CHandEyeCalibrator3D::ERotationType_EulerAngle)시 설정
HandEyeCalibrator3D.SetEulerSequence(EEulerSequence.Extrinsic_XYZ);

HandEyeCalibrator3D.SetScaleFactor(1.000000); // End Effector Scale Factor 설정
HandEyeCalibrator3D.SetResultScaleFactor(1.000000); // 결과 Scale Factor 설정

List<double> listDistortionCoef = new List<double>();
CFLPoint<double> flpFocalLength = new CFLPoint<double>();
CFLPoint<double> flpPrincipalPoint = new CFLPoint<double>();

listDistortionCoef.Add(-0.053853);
listDistortionCoef.Add(0.059036);
listDistortionCoef.Add(0.000375);
listDistortionCoef.Add(0.000786);
listDistortionCoef.Add(-0.018948);
flpFocalLength.x = 428.668823; 
flpFocalLength.y = 428.268188;
flpPrincipalPoint.x = 422.934998; 
flpPrincipalPoint.y = 240.188660;

HandEyeCalibrator3D.SetCalibrationDistortionCoefficient(listDistortionCoef); // 왜곡 계수 설정
HandEyeCalibrator3D.SetCalibrationCameraMatrix(flpFocalLength, flpPrincipalPoint); // 카메라 내부 행렬 설정
HandEyeCalibrator3D.SetCalibrationBoardCellPitch(15.000000, 15.000000);
HandEyeCalibrator3D.Calibrate();
HandEyeCalibrator3D = CHandEyeCalibrator3D()
fliSourceImage = CFLImage()
fliSourceImage.Load("C:/Users/Public/Documents/FLImaging/ExampleImages/HandEyeCalibrator3D/ChessBoard.flif")
HandEyeCalibrator3D.SetSourceImage(fliSourceImage)
HandEyeCalibrator3D.LoadEndEffectorPose("C:/Users/Public/Documents/FLImaging/ExampleImages/HandEyeCalibrator3D/EndEffectorPose.csv") # End Effector 포즈 불러오기
HandEyeCalibrator3D.SetCalibrationObjectType(ECalibrationObjectType.ChessBoard) # 캘리브레이션 객체 타입을 체스 보드로 설정
HandEyeCalibrator3D.SetRotationType(ERotationType.RotationVector) # End Effector 회전 타입 설정
HandEyeCalibrator3D.SetOptimizationMethod(EOptimizationMethod.Nonlinear) # 최적화 방법 설정
HandEyeCalibrator3D.SetEndEffectorAngleUnit(EAngleUnit.Radian) # End Effector 회전 각도 단위 설정
HandEyeCalibrator3D.SetOptimalSolutionAccuracy(0.000010) # 최적화 정확도 설정

# 오일러 각 회전 순서
# SetRotationType(CHandEyeCalibrator3D.ERotationType.EulerAngle)시 설정
HandEyeCalibrator3D.SetEulerSequence(EEulerSequence.Extrinsic_XYZ)

HandEyeCalibrator3D.SetScaleFactor(1.000000) # End Effector Scale Factor 설정
HandEyeCalibrator3D.SetResultScaleFactor(1.000000) # 결과 Scale Factor 설정

listDistortionCoef = List[Double]()
flpFocalLength = CFLPoint[Double]()
flpPrincipalPoint = CFLPoint[Double]()

listDistortionCoef.Add(-0.053853)
listDistortionCoef.Add(0.059036)
listDistortionCoef.Add(0.000375)
listDistortionCoef.Add(0.000786)
listDistortionCoef.Add(-0.018948)
flpFocalLength.x = 428.668823
flpFocalLength.y = 428.268188
flpPrincipalPoint.x = 422.934998
flpPrincipalPoint.y = 240.188660

HandEyeCalibrator3D.SetCalibrationDistortionCoefficient(listDistortionCoef) # 왜곡 계수 설정
HandEyeCalibrator3D.SetCalibrationCameraMatrix(flpFocalLength, flpPrincipalPoint) # 카메라 내부 행렬 설정
HandEyeCalibrator3D.SetCalibrationBoardCellPitch(15.000000, 15.000000)
HandEyeCalibrator3D.Calibrate()