KlassenKlassenKlassenKlassen | | | | Operatoren

calibrate_hand_eyeT_calibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye (Operator)

Name

calibrate_hand_eyeT_calibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye — Durchführen einer Hand-Auge-Kalibrierung.

Signatur

calibrate_hand_eye( : : CalibDataID : Errors)

Herror T_calibrate_hand_eye(const Htuple CalibDataID, Htuple* Errors)

Herror calibrate_hand_eye(const HTuple& CalibDataID, HTuple* Errors)

HTuple HCalibData::CalibrateHandEye() const

void CalibrateHandEye(const HTuple& CalibDataID, HTuple* Errors)

HTuple HCalibData::CalibrateHandEye() const

void HOperatorSetX.CalibrateHandEye(
[in] VARIANT CalibDataID, [out] VARIANT* Errors)

VARIANT HCalibDataX.CalibrateHandEye()

static void HOperatorSet.CalibrateHandEye(HTuple calibDataID, out HTuple errors)

HTuple HCalibData.CalibrateHandEye()

Beschreibung

Der Operator calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye bestimmt die 3D-Lage eines Roboters („Hand“) relativ zu einer Kamera oder 3D-Sensor(„Auge“) basierend auf einem Kalibrierdatenmodell CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID. Mit den ermittelten 3D-Posen können die Posen des Objektes im Kamerakoordinatensystem in das Roboterbasiskoordinatensystem transformiert werden. Der Roboter kann dann z.B. ein inspiziertes Teil greifen. Es gibt zwei mögliche Konfigurationen von Roboter-Kamera-Systemen (Hand-Auge-Systemen): Die Kamera kann auf dem Roboter montiert sein oder stationär sein und den Roboter beobachten. Beachten Sie, dass der Begriff „Roboter“ für ein beliebiges System steht, das Objekte bewegt. Daher können mit calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye viele verschiedene Systeme kalibriert werden, von Schwenk-Neige-Köpfen zu Vielachs-Manipulatoren.

Eine Hand-Auge-Kalibrierung kann über eine geschlossene Verkettung von insgesamt vier euklidischen Transformationen beschrieben werden. In dieser Kette sind zwei nicht aufeinander folgende Transformation bekannt. Diese stammen entweder aus der Robotersteuerung oder werden aus Kameradaten, z.B. beobachtete Posen eine Kalibrierkörpers, bestimmt. Die beiden anderen Transformationen sind unbekannt aber konstant und werden durch die Hand-Auge-Kalibrierung bestimmt.

Eine Hand-Auge-Kalibrierung läuft ähnlich ab wie die Kalibrierung der externen Kameraparameter (siehe camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration): Verschiedene Posen eines Kalibrierkörpers im Kamerakoordinatensystem sowie die korrespondierenden Posen des Werkzeugs im Roboterbasiskoordinatensystem werden bestimmt und im Kalibrierdatenmodell CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID gesetzt.

Im Gegensatz zur Kamerakalibrierung wird der Kalibrierkörper nicht manuell bewegt. Dies ist die Aufgabe des Roboters. Zwei Hand-Auge Kalibrierungsszenarien werden unterschieden. Der Roboter bewegt entweder die Kamera (bei auf dem Roboter montierter Kamera) oder den Kalibrierkörper (bei stationärer Kamera). Die Bewegungen des Roboters werden als bekannt vorausgesetzt. Sie werden als Eingabe für die Kalibrierung benutzt und mittels set_calib_dataset_calib_dataSetCalibDataset_calib_dataSetCalibDataSetCalibData im Kalibrierdatenmodell CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID gesetzt.

Durch die Hand-Auge-Kalibrierung werden zwei Posen bestimmt: Im Szenario „bewegte Kamera“ wird die 3D-Pose des Endeffektors im Kamerakoordinatensystem ('tool_in_cam_pose') und die 3D-Pose des Kalibrierkörpers in Roboterbasiskoordinaten ('obj_in_base_pose') bestimmt. Im Szenario „stationäre Kamera“ wird die 3D-Pose der Roboterbasis im Kamerakoordinatensystem ('base_in_cam_pose'), sowie die 3D-Pose des Kalibrierkörpers im Tool-Koordinatensystem ('obj_in_tool_pose') bestimmt. Ihr Posentyp ist identisch mit dem Typ der Eingabeposen.

Im Folgenden werden die zwei Hand-Auge-Konfigurationen detaillierter beschrieben, gefolgt von genereller Information über die benötigten Daten und die Vorbereitung des Kalibrierdatenmodells.

Bewegte Kamera (auf dem Roboter montiert)

In dieser Konfiguration ist der Kalibrierkörper stationär, und die Kamera wird vom Roboter an verschiedene Positionen bewegt. Die grundlegende Idee hinter der Hand-Auge-Kalibrierung ist, dass die aus einem Kalibrierbild extrahierte Information, d.h. die 3D-Lage des Kalibrierkörpers relativ zur Kamera (d.h. die externen Kameraparameter), als Kette von 3D-Lagen bzw. homogenen Transformationsmatrizen aufgefasst werden kann, vom Kalibrierkörper über die Roboter-Basis zu dessen Tool (Endeffektor) und schließlich zur Kamera:

  Bewegte Kamera:   camera_H_cal  =  camera_H_tool  *  (base_H_tool)^(-1) * base_H_cal
                           |                |               |                   |
                 'obj_in_cam_pose' 'tool_in_cam_pose' 'tool_in_base_pose' 'obj_in_base_pose'

Aus den gegebenen Posen des Kalibrierkörpers ('obj_in_cam_pose') und den Posen des Endeffektors in Roboterbasiskoordinaten ('tool_in_base_pose')) bestimmt der Operator calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye die zwei unbekannten Transformationen an den Enden der Kette, d.h. die 3D-Lage des Roboter-Tools in Kamerakoordinaten (camera_H_tool, 'tool_in_cam_pose') und die 3D-Lage des Kalibrierkörpers in Roboter-Basiskoordinaten (base_H_cal, 'obj_in_base_pose'). Diese Posen sind konstant.

Im Gegensatz dazu ist die Transformation in der Mitte der Kette, tool_H_base, bekannt, aber unterschiedlich für jede Beobachtung des Kalibrierkörpers, da sie die 3D-Lage des Endeffektors (Tool) bezüglich des Roboterbasiskoordinatensystems beschreibt. In der gegebenen Gleichung werden die inversen Transformationsmatrizen benutzt (3D-Lage der Roboter-Basis in Roboter-Toolkoordinaten). Die Invertierung wird intern vorgenommen.

Stationäre Kamera

In dieser Konfiguration greift der Roboter den Kalibrierkörper und bewegt ihn vor der Kamera. Auch in dieser Konfiguration entspricht die aus einem Kalibrierbild extrahierte Information, d.h. die 3D-Lage des Kalibrierkörpers in Kamerakoordinaten (d.h. die externen Kameraparameter) einer Kette von 3D-Lagen bzw. homogenen Transformationsmatrizen, diesmal vom Kalibrierkörper über das Roboter-Tool zu dessen Basis und schließlich zur Kamera:

  Stationäre Kamera:  camera_H_cal  =  camera_H_base  *  base_H_tool  *  tool_H_cal
                             |                |               |               |
                   'obj_in_cam_pose' 'base_in_cam_pose' 'tool_in_base_pose' 'obj_in_tool_pose'

Analog zur Konfiguration mit bewegter Kamera bestimmt der Operator calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye die zwei Transformationen an den Enden der Kette, hier nun die 3D-Lage der Roboter-Basis in Kamerakoordinaten (camera_H_base, 'base_in_cam_pose') und die 3D-Lage des Kalibrierkörpers in Roboter-Toolkoordinaten (tool_H_cal, 'obj_in_tool_pose').

Die Transformation in der Mitte der Kette, base_H_tool, beschreibt die 3D-Lage des den Kalibrierkörper bewegenden Roboters, d.h. die 3D-Lage des Roboter-Tools in Roboter-Basiskoordinaten. Die Transformation camera_H_cal beschreibt die Pose des Kalibrierkörpers relativ zum Kamerakoordinatensystem.

Vorbereitung der Eingabekalibrierdaten

Bevor der Operator calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye aufgerufen wird, müssen die benötigten Daten im Kalibrierdatenmodell gesammelt werden. Dabei müssen diese Schritte befolgt werden:

  1. Erstellen des Kalibrierdatenmodells mit dem Operator create_calib_datacreate_calib_dataCreateCalibDatacreate_calib_dataCreateCalibDataCreateCalibData, wobei die Anzahl der Kameras und die Anzahl der Kalibrierkörper im Modell festgelegt werden. Abhängig vom Szenario muss für CalibSetup der Wert 'hand_eye_moving_camera'"hand_eye_moving_camera""hand_eye_moving_camera""hand_eye_moving_camera""hand_eye_moving_camera""hand_eye_moving_camera" oder 'hand_eye_stationary_camera'"hand_eye_stationary_camera""hand_eye_stationary_camera""hand_eye_stationary_camera""hand_eye_stationary_camera""hand_eye_stationary_camera" gesetzt werden. Für die Hand-Auge-Kalibrierung wird momentan nur eine Kamera und ein Kalibrierkörper unterstützt.

  2. Festlegen der Optimierungsmethode mit dem Operator set_calib_dataset_calib_dataSetCalibDataset_calib_dataSetCalibDataSetCalibData. Für den Parameter DataName='optimization_method'"optimization_method""optimization_method""optimization_method""optimization_method""optimization_method" sind zwei Optionen für DataValue möglich, DataValue='nonlinear'"nonlinear""nonlinear""nonlinear""nonlinear""nonlinear" und DataValue='linear'"linear""linear""linear""linear""linear" (siehe Abschnitt 'Die eigentliche Kalibrierung durchführen').

  3. Setzen der Posen des Kalibrierkörpers

    1. Jede beobachtete 3D-Pose des Kalibrierkörpers kann direkt mittels des Operators set_calib_data_observ_poseset_calib_data_observ_poseSetCalibDataObservPoseset_calib_data_observ_poseSetCalibDataObservPoseSetCalibDataObservPose gesetzt werden. Somit ist es in der Hand-Auge-Kalibrierung möglich generische 3D-Sensoren zu benutzen, die ein Kalibrierobjekt beobachten.

    2. Andererseits kann die Pose des Kalibrierkörpers mittels Kamerabildern bestimmt werden. Dafür muss der Kalibierkörper im Kalibrierdatenmodell CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID mit dem Operator set_calib_data_calib_objectset_calib_data_calib_objectSetCalibDataCalibObjectset_calib_data_calib_objectSetCalibDataCalibObjectSetCalibDataCalibObject gesetzt werden. Initiale Kameraparameter werden mit dem Operator set_calib_data_cam_paramset_calib_data_cam_paramSetCalibDataCamParamset_calib_data_cam_paramSetCalibDataCamParamSetCalibDataCamParam gesetzt. Der Operator find_calib_objectfind_calib_objectFindCalibObjectfind_calib_objectFindCalibObjectFindCalibObject bestimmt die Pose des Kalibrierkörpers relativ zur Kamera und speichert sie im Kalibrierdatenmodell CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID. Der Operator calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye kalibriert die Kamera bevor die Hand-Auge-Kalibrierung durchgeführt wird. Falls die gegebenen Kameraparameter schon kalibriert sind, kann die Kamerakalibrierung wie folgt ausgeschaltet werden.

           set_calib_data(CalibDataID,'camera','general','excluded_settings','params').
        

  4. Spezifizieren der Posen des Tools im Roboterbasiskoordinatensystem. Für jede Pose des Kalibrierkörpers im Kamerakoordinatensystem muss die korrespondierende Pose des Tools im Roboterbasiskoordinatensystem wie folgt gesetzt werden.

         set_calib_data(CalibDataID,'tool', PoseNumber, 'tool_in_base_pose', ToolInBasePose)
      

Die eigentliche Kalibrierung durchführen

Der Operator calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye kann die Kalibrierung auf zwei verschiedene Arten durchführen. In beiden Fällen werden alle gegebenen Posen des Kalibrierobjekts in Kamerakoordinaten sowie die zugehörigen Posen des Tools in Roboterbasiskoordinaten für die Kalibrierung benutzt. Mittels des Operators set_calib_dataset_calib_dataSetCalibDataset_calib_dataSetCalibDataSetCalibData wird spezifiziert welche Methode benutzt wird.

Soll die Kalibrierung mittles eines linearen Algorithmus durchgeführt werden, so muss die Parameterkombination DataName='optimization_method'"optimization_method""optimization_method""optimization_method""optimization_method""optimization_method" und DataValue='linear'"linear""linear""linear""linear""linear" gewählt werden. Dieser Algorithmus ist schnell jedoch in vielen praktischen Fällen nicht genau genug.

Wird die Parameterkombination DataName='optimization_method'"optimization_method""optimization_method""optimization_method""optimization_method""optimization_method" und DataValue='nonlinear'"nonlinear""nonlinear""nonlinear""nonlinear""nonlinear" gewählt, so wird ein nicht linearer Algorithmus benutzt, welcher das genaueste Ergebnis liefert und daher auch empfohlen ist.

Ergebnisse der Kalibrierung überprüfen

Nach einer erfolgreichen Kalibrierung wird der Lagefehler über die komplette Transformationskette in ErrorsErrorsErrorsErrorsErrorserrors zurückgegeben. Genaugenommen wird ein Tuple mit vier Elementen zurückgegeben, welches zuerst den mittleren, quadratischen Fehler der Translation, dann den mittleren, quadratischen Fehler der Rotation, an dritter Stelle den maximalen Fehler der Translation und schließlich an vierter Stelle den maximalen Fehler der Rotation angibt. Diese Fehler geben einen allgemeinen Hinweis darauf, ob die Optimierung erfolgreich war.

Die Fehler werden in den Einheiten zurückgegeben, in denen die Eingabeposen gegeben waren. Das bedeutet, dass die Translationsfehler typischerweise in Metern zurückgegeben werden. Die Rotationsfehler werden immer in Grad zurückgegeben.

Kalibrierergebnisse abfragen

Die Posen, die durch den Operator calibrate_hand_eyecalibrate_hand_eyeCalibrateHandEyecalibrate_hand_eyeCalibrateHandEyeCalibrateHandEye berechnet werden, können mit get_calib_dataget_calib_dataGetCalibDataget_calib_dataGetCalibDataGetCalibData abgefragt werden. Für das Szenario „bewegte Kamera“ können die 3D-Pose des Tools in Kamerakoordinaten ('tool_in_cam_pose') und die 3D-Pose des Kalibrierkörpers im Roboterbasiskoordinatensystem ('obj_in_base_pose') abgefragt werden. Für das Szenario „stationäre Kamera“ können die 3D-Pose der Roboterbasis im Kamerakoordinatensystem ('base_in_cam_pose') und die 3D-Pose des Kalibrierkörpers im Koordinatensystem des Tools ('obj_in_tool_pose') abgefragt werden.

Abfragen der Eingabedaten

Die beobachteten 3D-Posen des Kalibrierobjektes im Kamerakoordinatensystem können mit get_calib_data_observ_poseget_calib_data_observ_poseGetCalibDataObservPoseget_calib_data_observ_poseGetCalibDataObservPoseGetCalibDataObservPose abgefragt werden. Die zugehörigen 3D-Posen des Tools im Roboterbasiskoordinatensystem können mit get_calib_dataget_calib_dataGetCalibDataget_calib_dataGetCalibDataGetCalibData abgefragt werden.

Ein Set geeigneter Posen des Kalibrierkörpers aufnehmen

Ist eine Standard-Kalibrierplatte vorhanden, sollte folgendermaßen vorgegangen werden:

Lagen des Roboter-Tools aufnehmen

Wir empfehlen, die 3D-Lagen in einem separaten Programm zu erzeugen und mittels write_posewrite_poseWritePosewrite_poseWritePoseWritePose in Dateien abzuspeichern. Im Kalibrierungsprogramm können sie dann eingelesen werden und im Kalibrierdatenmodell gesetzt werden.

Die 3D-Lage eines Roboters kann über seine kartesische Schnittstelle typischerweise in einer Notation abgefragt werden, die den Darstellungstypen mit den Codes 0 oder 2 entsprechen (OrderOfRotationOrderOfRotationOrderOfRotationOrderOfRotationOrderOfRotationorderOfRotation = 'gba'"gba""gba""gba""gba""gba" oder 'abg'"abg""abg""abg""abg""abg", siehe create_posecreate_poseCreatePosecreate_poseCreatePoseCreatePose). In diesem Fall können die abgefragten Werte direkt als Eingabe für create_posecreate_poseCreatePosecreate_poseCreatePoseCreatePose verwendet werden.

Falls die kartesische Schnittstelle des Roboters die Orientierung anders beschreibt, z.B. in der Darstellung ZYZ (Rz(phi1) * Ry(phi2) * Rz(phi3)), kann die entsprechende homogene Transformationsmatrix schrittweise mit den Operatoren hom_mat3d_rotatehom_mat3d_rotateHomMat3dRotatehom_mat3d_rotateHomMat3dRotateHomMat3dRotate und hom_mat3d_translatehom_mat3d_translateHomMat3dTranslatehom_mat3d_translateHomMat3dTranslateHomMat3dTranslate aufgebaut und dann mit hom_mat3d_to_posehom_mat3d_to_poseHomMat3dToPosehom_mat3d_to_poseHomMat3dToPoseHomMat3dToPose in eine 3D-Lage gewandelt werden. Der folgende Beispiel-Code erzeugt eine 3D-Lage aus der oben beschriebenen ZYZ-Darstellung:

  hom_mat3d_identity (HomMat3DIdent)
  hom_mat3d_rotate (HomMat3DIdent, phi3, 'z', 0, 0, 0, HomMat3DRotZ)
  hom_mat3d_rotate (HomMat3DRotZ, phi2, 'y', 0, 0, 0, HomMat3DRotZY)
  hom_mat3d_rotate (HomMat3DRotZY, phi1, 'z', 0, 0, 0, HomMat3DRotZYZ)
  hom_mat3d_translate (HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)
  hom_mat3d_to_pose (base_H_tool, RobPose)

Bitte beachten Sie, dass die Hand-Auge-Kalibrierung nur dann erfolgreich sein kann, wenn die Posen des Tools im Roboterbasiskoordinatensystem mit hoher Genauigkeit angegeben werden!

Achtung

Ein Kalibrierdatenmodell CalibDataID kann nur von einem Thread aus verwendet werden. Verschiedene Kalibrierdatenmodelle können dagegen in unterschiedlichen Threads genutzt werden.

Parallelisierung

Parameter

CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID (input_control)  calib_data HCalibData, HTupleHTupleHCalibData, HTupleHCalibDataX, VARIANTHtuple (integer) (IntPtr) (Hlong) (Hlong) (Hlong) (Hlong)

Handle des Kalibrierdatenmodells.

ErrorsErrorsErrorsErrorsErrorserrors (output_control)  number-array HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)

Durchschnittlicher verbleibender Fehler nach der Optimierung.

Vorgänger

create_calib_datacreate_calib_dataCreateCalibDatacreate_calib_dataCreateCalibDataCreateCalibData, set_calib_data_cam_paramset_calib_data_cam_paramSetCalibDataCamParamset_calib_data_cam_paramSetCalibDataCamParamSetCalibDataCamParam, set_calib_data_calib_objectset_calib_data_calib_objectSetCalibDataCalibObjectset_calib_data_calib_objectSetCalibDataCalibObjectSetCalibDataCalibObject, set_calib_data_observ_poseset_calib_data_observ_poseSetCalibDataObservPoseset_calib_data_observ_poseSetCalibDataObservPoseSetCalibDataObservPose, find_calib_objectfind_calib_objectFindCalibObjectfind_calib_objectFindCalibObjectFindCalibObject, set_calib_dataset_calib_dataSetCalibDataset_calib_dataSetCalibDataSetCalibData

Nachfolger

get_calib_dataget_calib_dataGetCalibDataget_calib_dataGetCalibDataGetCalibData

Modul

Calibration


KlassenKlassenKlassenKlassen | | | | Operatoren