Point Cloud Based Hand Eye Calibrator 3D

1 개요

Robot End Effector와 Camera 간의 변환 행렬을 추정하는 알고리즘입니다. 결과 사용 방법 및 파라미터 설명은 Hand Eye Calibrator 3D와 동일합니다.

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

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

2 알고리즘 상세 설명

Hand Eye Calibrator 3D와 다르게 추정 시 필요한 T_Cam2Object를 3D Match를 통해 추정합니다.

Calibration Object(2D) Calibration Object(3D) 3D Template 3D Match Result
Chess Board Calibration Object Template Match Result
Fig. Chess Board 이미지 및 3D 매치 결과

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

3D Match 설정 및 Source Object 설정 방법

엔드 이펙터 설정 방법

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

5 좌표계 변환 방법

6 예제 코드

CPointCloudBasedHandEyeCalibrator3D PointCloudBasedHandEyeCalibrator3D;

// 3D 매치 모델 설정
// Surface Match 3D 혹은 Vertex Match 3D의 모델 파일 경로 설정
// 확장자 : *.flsm, *.flvm
PointCloudBasedHandEyeCalibrator3D.Set3DMatchModel(L"");

//////////////////////////////////////////////
// CSV 파일로 포즈를 불러올 경우
PointCloudBasedHandEyeCalibrator3D.LoadEndEffectorPose("[CSV File Path].csv");
//////////////////////////////////////////////
// 직접 추가할 경우
CFLArray<TPoint3<double>> flaEndEffectorCoordinateTranslations;
flaEndEffectorCoordinateTranslations.PushBack(TPoint3<double>(0, 0, 0));
//		. . .
PointCloudBasedHandEyeCalibrator3D.SetCalibrationEndEffectorCoordinateTranslation(flaEndEffectorCoordinateTranslations);
CFLArray<TPoint3<double>> flaEndEffectorCoordinateAngles;
flaEndEffectorCoordinateAngles.PushBack(TPoint3<double>(0, 0, 0));
//		. . .
PointCloudBasedHandEyeCalibrator3D.SetCalibrationEndEffectorCoordinateAngle(flaEndEffectorCoordinateAngles);
//////////////////////////////////////////////

PointCloudBasedHandEyeCalibrator3D.SetRotationType(ThreeDim::ERotationType::ERotationType_EulerAngle); // End Effector 회전 타입 설정
PointCloudBasedHandEyeCalibrator3D.SetOptimizationMethod(ThreeDim::EOptimizationMethod::EOptimizationMethod_Nonlinear); // 최적화 방법 설정
PointCloudBasedHandEyeCalibrator3D.SetEndEffectorAngleUnit(ImageProcessing::EAngleUnit::EAngleUnit_Degree); // End Effector 회전 각도 단위 설정
PointCloudBasedHandEyeCalibrator3D.SetCalibrationMode(ThreeDim::CHandEyeCalibrator3D::ECalibrationMode_EyeInHand); // 캘리브레이션 모드 설정

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

PointCloudBasedHandEyeCalibrator3D.SetOptimalSolutionAccuracy(0.0000001); // 최적화 정확도 설정
PointCloudBasedHandEyeCalibrator3D.SetScaleFactor(1.000000); // End Effector Scale Factor 설정
PointCloudBasedHandEyeCalibrator3D.SetResultScaleFactor(1.000000); // 결과 Scale Factor 설정
PointCloudBasedHandEyeCalibrator3D.Calibrate();


CPointCloudBasedHandEyeCalibrator3D PointCloudBasedHandEyeCalibrator3D = new CPointCloudBasedHandEyeCalibrator3D();

// 3D 매치 모델 설정
// Surface Match 3D 혹은 Vertex Match 3D의 모델 파일 경로 설정
// 확장자 : *.flsm, *.flvm
PointCloudBasedHandEyeCalibrator3D.Set3DMatchModel("");

//////////////////////////////////////////////
// CSV 파일로 포즈를 불러올 경우
PointCloudBasedHandEyeCalibrator3D.LoadEndEffectorPose("CSV File Path");
//////////////////////////////////////////////
// 직접 추가할 경우
List<TPoint3<double>> listEndEffectorCoordinateTranslations = new List<TPoint3<double>>();
listEndEffectorCoordinateTranslations.Add(new TPoint3<double>(0, 0, 0));
//		. . .
PointCloudBasedHandEyeCalibrator3D.SetCalibrationEndEffectorCoordinateTranslation(listEndEffectorCoordinateTranslations);
List<TPoint3<double>> listEndEffectorCoordinateAngles = new List<TPoint3<double>>();
listEndEffectorCoordinateAngles.Add(new TPoint3<double>(0, 0, 0));
//		. . .
PointCloudBasedHandEyeCalibrator3D.SetCalibrationEndEffectorCoordinateAngle(listEndEffectorCoordinateAngles);
//////////////////////////////////////////////
 
PointCloudBasedHandEyeCalibrator3D.SetRotationType(ERotationType.EulerAngle); // End Effector 회전 타입 설정
PointCloudBasedHandEyeCalibrator3D.SetOptimizationMethod(EOptimizationMethod.Nonlinear); // 최적화 방법 설정
PointCloudBasedHandEyeCalibrator3D.SetEndEffectorAngleUnit(EAngleUnit.Degree); // End Effector 회전 각도 단위 설정
PointCloudBasedHandEyeCalibrator3D.SetCalibrationMode(CHandEyeCalibrator3D.ECalibrationMode.EyeInHand); // 캘리브레이션 모드 설정

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

PointCloudBasedHandEyeCalibrator3D.SetOptimalSolutionAccuracy(0.0000001); // 최적화 정확도 설정
PointCloudBasedHandEyeCalibrator3D.SetScaleFactor(1.000000); // End Effector Scale Factor 설정
PointCloudBasedHandEyeCalibrator3D.SetResultScaleFactor(1.000000); // 결과 Scale Factor 설정
PointCloudBasedHandEyeCalibrator3D.Calibrate();


PointCloudBasedHandEyeCalibrator3D = CPointCloudBasedHandEyeCalibrator3D()

# 3D 매치 모델 설정
# Surface Match 3D 혹은 Vertex Match 3D의 모델 파일 경로 설정
# 확장자 : *.flsm, *.flvm
PointCloudBasedHandEyeCalibrator3D.Set3DMatchModel("")

##############################################
# CSV 파일로 포즈를 불러올 경우
PointCloudBasedHandEyeCalibrator3D.LoadEndEffectorPose("CSV File Path")
##############################################
# 직접 추가할 경우
listEndEffectorCoordinateTranslations = List[TPoint3[Double]]()
listEndEffectorCoordinateTranslations.Add(TPoint3[Double](0, 0, 0))
#		. . .
PointCloudBasedHandEyeCalibrator3D.SetCalibrationEndEffectorCoordinateTranslation(listEndEffectorCoordinateTranslations)
listEndEffectorCoordinateAngles = List[TPoint3[Double]]()
listEndEffectorCoordinateAngles.Add(TPoint3[Double](0, 0, 0))
#		. . .
PointCloudBasedHandEyeCalibrator3D.SetCalibrationEndEffectorCoordinateAngle(listEndEffectorCoordinateAngles)
##############################################
 
PointCloudBasedHandEyeCalibrator3D.SetRotationType(ERotationType.EulerAngle) # End Effector 회전 타입 설정
PointCloudBasedHandEyeCalibrator3D.SetOptimizationMethod(EOptimizationMethod.Nonlinear) # 최적화 방법 설정
PointCloudBasedHandEyeCalibrator3D.SetEndEffectorAngleUnit(EAngleUnit.Degree) # End Effector 회전 각도 단위 설정
PointCloudBasedHandEyeCalibrator3D.SetCalibrationMode(CHandEyeCalibrator3D.ECalibrationMode.EyeInHand) # 캘리브레이션 모드 설정

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

PointCloudBasedHandEyeCalibrator3D.SetOptimalSolutionAccuracy(0.0000001) # 최적화 정확도 설정
PointCloudBasedHandEyeCalibrator3D.SetScaleFactor(1.000000) # End Effector Scale Factor 설정
PointCloudBasedHandEyeCalibrator3D.SetResultScaleFactor(1.000000) # 결과 Scale Factor 설정
PointCloudBasedHandEyeCalibrator3D.Calibrate()