| Operatoren |
calibrate_hand_eye — Durchführen einer Hand-Auge-Kalibrierung.
calibrate_hand_eye( : : CalibDataID : Errors)
Der Operator calibrate_hand_eye bestimmt die 3D-Lage eines Roboters („Hand“) relativ zu einer Kamera oder 3D-Sensor(„Auge“) basierend auf einem Kalibrierdatenmodell CalibDataID. 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_eye 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_calibration): Verschiedene Posen eines Kalibrierkörpers im Kamerakoordinatensystem sowie die korrespondierenden Posen des Werkzeugs im Roboterbasiskoordinatensystem werden bestimmt und im Kalibrierdatenmodell CalibDataID 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_data im Kalibrierdatenmodell CalibDataID 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.
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_eye 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.
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_eye 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.
Bevor der Operator calibrate_hand_eye aufgerufen wird, müssen die benötigten Daten im Kalibrierdatenmodell gesammelt werden. Dabei müssen diese Schritte befolgt werden:
Erstellen des Kalibrierdatenmodells mit dem Operator create_calib_data, 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' oder 'hand_eye_stationary_camera' gesetzt werden. Für die Hand-Auge-Kalibrierung wird momentan nur eine Kamera und ein Kalibrierkörper unterstützt.
Festlegen der Optimierungsmethode mit dem Operator set_calib_data. Für den Parameter DataName='optimization_method' sind zwei Optionen für DataValue möglich, DataValue='nonlinear' und DataValue='linear' (siehe Abschnitt 'Die eigentliche Kalibrierung durchführen').
Setzen der Posen des Kalibrierkörpers
Jede beobachtete 3D-Pose des Kalibrierkörpers kann direkt mittels des Operators set_calib_data_observ_pose gesetzt werden. Somit ist es in der Hand-Auge-Kalibrierung möglich generische 3D-Sensoren zu benutzen, die ein Kalibrierobjekt beobachten.
Andererseits kann die Pose des Kalibrierkörpers mittels Kamerabildern bestimmt werden. Dafür muss der Kalibierkörper im Kalibrierdatenmodell CalibDataID mit dem Operator set_calib_data_calib_object gesetzt werden. Initiale Kameraparameter werden mit dem Operator set_calib_data_cam_param gesetzt. Der Operator find_calib_object bestimmt die Pose des Kalibrierkörpers relativ zur Kamera und speichert sie im Kalibrierdatenmodell CalibDataID. Der Operator calibrate_hand_eye 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').
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)
Der Operator calibrate_hand_eye 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_data wird spezifiziert welche Methode benutzt wird.
Soll die Kalibrierung mittles eines linearen Algorithmus durchgeführt werden, so muss die Parameterkombination DataName='optimization_method' und DataValue='linear' gewählt werden. Dieser Algorithmus ist schnell jedoch in vielen praktischen Fällen nicht genau genug.
Wird die Parameterkombination DataName='optimization_method' und DataValue='nonlinear' gewählt, so wird ein nicht linearer Algorithmus benutzt, welcher das genaueste Ergebnis liefert und daher auch empfohlen ist.
Nach einer erfolgreichen Kalibrierung wird der Lagefehler über die komplette Transformationskette in Errors 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.
Die Posen, die durch den Operator calibrate_hand_eye berechnet werden, können mit get_calib_data 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.
Die beobachteten 3D-Posen des Kalibrierobjektes im Kamerakoordinatensystem können mit get_calib_data_observ_pose abgefragt werden. Die zugehörigen 3D-Posen des Tools im Roboterbasiskoordinatensystem können mit get_calib_data abgefragt werden.
Ist eine Standard-Kalibrierplatte vorhanden, sollte folgendermaßen vorgegangen werden:
Die Position des Kalibrierkörpers (bewegte Kamera: relativ zur Roboter-Basis; stationäre Kamera: relativ zum Roboter-Tool) und die Position der Kamera (bewegte Kamera: relativ zum Roboter-Tool; stationäre Kamera: relativ zur Roboter-Basis) bleiben während der Aufnahmen unverändert.
Die theoretisch minimale Anzahl von Posen des Kalibrierobjektes ist drei. Aber, es wird empfohlen mindestens 10 Posen aufzunehmen, bei denen die Position der Kamera bzw. die Position der Roboterhand möglichst stark variiert. Ein ausreichendes Ausmaß an Rotation zwischen den Bilder ist notwendig und sollte mindestens 30 Grad besser aber 60 Grad betragen. Die Rotationen zwischen den Posen des Kalibrierobjektes müssen mindestens zwei verschiedene Rotationsachsen aufweisen. Sehr verschiedene Orientierungen führen zu präziseren Ergebnissen in der Hand-Auge-Kalibrierung.
Wird eine Kamera benutzt, so müssen die internen Kameraparameter während und nach der Kalibrierung konstant sein. Beachten Sie, dass Veränderungen der Bildgröße, der Brennweite, der Blende oder des Fokus eine Veränderung der internen Kameraparameter bedeuten.
Die Kamera darf zwischen den Aufnahmen nicht verändert werden, d.h. weder Brennweite und Blende, noch Fokussierung darf verändert werden, denn für alle Aufnahmen gelten die gleichen internen Kameraparameter. Achten Sie darauf, dass bei einer Änderung des Abstands der Kamera vom Kalibrierkörper durch die Roboterbewegung die Fokussierung (Schärfe im Bild) noch ausreicht. Sorgen Sie daher bei den Aufnahmen für eine gute Ausleuchtung der Kalibrierplatte, denn die Tiefenschärfe nimmt mit kleiner Blende zu.
Wir empfehlen, die 3D-Lagen in einem separaten Programm zu erzeugen und mittels write_pose 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 (OrderOfRotation = 'gba' oder 'abg', siehe create_pose). In diesem Fall können die abgefragten Werte direkt als Eingabe für create_pose 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_rotate und hom_mat3d_translate aufgebaut und dann mit hom_mat3d_to_pose 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!
Ein Kalibrierdatenmodell CalibDataID kann nur von einem Thread aus verwendet werden. Verschiedene Kalibrierdatenmodelle können dagegen in unterschiedlichen Threads genutzt werden.
Handle des Kalibrierdatenmodells.
Durchschnittlicher verbleibender Fehler nach der Optimierung.
create_calib_data, set_calib_data_cam_param, set_calib_data_calib_object, set_calib_data_observ_pose, find_calib_object, set_calib_data
Calibration
| Operatoren |