| 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 Transformationen bekannt. Diese stammen entweder aus der Robotersteuerung oder werden aus Kameradaten, z.B. beobachtete Posen eines 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 Kalibrierszenarien 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 (, 'tool_in_cam_pose') und die 3D-Lage des Kalibrierkörpers in Roboter-Basiskoordinaten (, 'obj_in_base_pose'). Diese Posen sind konstant.
Im Gegensatz dazu ist die Transformation in der Mitte der Kette, , 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.
Es ist zu beachten, dass die Z-Translation von 'obj_in_base_pose' im Rahmen der Kalibrierung von SCARA-Robotern nicht eindeutig bestimmt werden kann. Um diese Mehrdeutigkeit aufzulösen, wird die Z-Translation von 'obj_in_base_pose' intern auf 0.0 gesetzt und 'tool_in_cam_pose' entsprechend berechnet. Es ist notwendig, die tatsächliche Translation in Z nach der Kalibrierung zu bestimmen indem der Roboter an eine Pose bekannter Höhe im Kamerakoordinatensystem gefahren wird. Hierfür empfiehlt sich das folgende Vorgehen: Der Kalibrierkörper wird an einer beliebigen Stelle platziert. Der Roboter wird dann so bewegt, dass die Kamera den Kalibrierkörper sieht. Nun wird ein Bild des Kalibrierkörpers aufgenommen und die aktuelle Roboterpose abgefragt (ToolInBasePose1). Anhand des Bildes kann die Pose des Kalibrierkörpers im Kamerakoordinatensystem ermittelt werden (ObjInCamPose1). Anschließend wird der Greifpunkt des Roboters von Hand zum Ursprung des Kalibrierkörpers bewegt und erneut die Roboterpose abgefragt (ToolInBasePose2). Diese drei Posen können zusammen mit dem Ergebnis der Kalibrierung (ToolInCamPose) folgendermaßen verwendet werden, um die Mehrdeutigkeit in Z aufzulösen:
pose_invert (ToolInCamPose, CamInToolPose)
pose_compose (CamInToolPose, ObjInCamPose1, ObjInToolPose1)
pose_invert (ToolInBasePose1, BaseInToolPose1)
pose_compose (BaseInToolPose1, ToolInBasePose2, Tool2InTool1Pose)
ZCorrection := ObjInToolPose1[2]-Tool2InTool1Pose[2]
set_origin_pose (ToolInCamPose, 0, 0, ZCorrection, ToolInCamPoseFinal)
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 (, 'base_in_cam_pose') und die 3D-Lage des Kalibrierkörpers in Roboter-Toolkoordinaten (, 'obj_in_tool_pose').
Die Transformation in der Mitte der Kette, , beschreibt die 3D-Lage des den Kalibrierkörper bewegenden Roboters, d.h. die 3D-Lage des Roboter-Tools in Roboter-Basiskoordinaten. Die Transformation beschreibt die Pose des Kalibrierkörpers relativ zum Kamerakoordinatensystem.
Es ist zu beachten, dass die Z-Translation von 'obj_in_tool_pose' im Rahmen der Kalibrierung von SCARA-Robotern nicht eindeutig bestimmt werden kann. Um diese Mehrdeutigkeit aufzulösen, wird die Z-Translation von 'obj_in_tool_pose' intern auf 0.0 gesetzt und 'base_in_cam_pose' entsprechend berechnet. Es ist notwendig, die tatsächliche Translation in Z nach der Kalibrierung zu bestimmen indem der Roboter an eine Pose bekannter Höhe im Kamerakoordinatensystem gefahren wird. Hierfür empfiehlt sich das folgende Vorgehen: Ein (nicht am Roboter befestigter) Kalibrierkörper wird an einer beliebigen Stelle so platziert, dass er von der Kamera gesehen wird. Anhand eines aufgenommenen Bildes muss dann die Pose des Kalibrierkörpers im Kamerakoordinatensystem ermittelt werden (ObjInCamPose). Anschließend wird der Greifpunkt des Roboters von Hand zum Ursprung des Kalibrierkörpers bewegt und die Roboterpose abgefragt (ToolInBasePose). Die beiden Posen können zusammen mit dem Ergebnis der Kalibrierung (BaseInCamPose) folgendermaßen verwendet werden, um die Mehrdeutigkeit in Z aufzulösen:
pose_invert (BaseInCamPose, CamInBasePose)
pose_compose (CamInBasePose, ObjInCamPose, ObjInBasePose)
ZCorrection := ObjInBasePose[2]-ToolInBasePose[2]
set_origin_pose (BaseInCamPose, 0, 0, ZCorrection, BaseInCamPoseFinal)
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', 'hand_eye_stationary_camera', 'hand_eye_scara_moving_camera' oder 'hand_eye_scara_stationary_camera' gesetzt werden. Diese vier Szenarien unterscheiden zum einen, ob die Kamera oder der Kalibrierkörper vom Roboter bewegt wird und zum anderen, ob ein anthropomorpher oder ein SCARA-Roboter kalibriert wird. Der Arm eines anthropomorphen Roboters hat 3 Drehgelenke, die typischerweise 6 Freiheitsgrade abdecken (3 Translationen und 3 Rotationen). SCARA-Roboter besitzen dagegen nur zwei parallele Drehgelenke und ein paralleles Schubgelenk, die nur 4 Freiheitsgrade (3 Translationen und 1 Rotation) abdecken. Grob gesagt ist ein anthropomorpher Roboter im Gegensatz zum SCARA-Roboter in der Lage, seinen Endeffektor zu verkippen.
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 Kalibrierkö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. Wenn eine Standard-Kalibrierplatte verwendet wird, bestimmt der Operator find_calib_object die Pose des Kalibrierkörpers relativ zur Kamera und speichert sie im Kalibrierdatenmodell CalibDataID. Für antropomorphe (d.h. nicht-SCARA) Roboter kalibriert der Operator calibrate_hand_eye in diesem Fall die Kamera bevor die eigentliche 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').
Im Gegensatz dazu geht calibrate_hand_eye bei SCARA-Robotern
immer davon aus, dass die gegebenen Kameraparameter bereits
kalibriert sind. Daher wird in diesem Fall vor der
Hand-Auge-Kalibrierung keine automatische interne Kalibrierung
der Kamera durchgeführt. Der Grund hierfür ist, dass die
Kamerakalibrierung nur mit unterschiedlicher Verkippung der
Kalibrierplatte zuverlässig ist. Bei der Hand-Auge-Kalibrierung
ist die Kalibrierplatte oft annähernd parallel zur Bildebene,
was bei einem SCARA-Roboter dazu führt, dass alle Kameraposen
annähernd parallel sind. Daher muss die Kamera zuvor mit einem
separaten Satz an Kalibrierbildern kalibriert worden sein.
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.
Wurden die 3D-Posen des Kalibrierobjektes mit find_calib_object bestimmt, dann werden diese bei antropomorphen (d.h. nicht-SCARA) Robotern dazu verwendet, die Kamera vor der eigentlichen Hand-Auge-Kalibrierung zu kalibrieren, und werden somit ebenfalls kalibriert. Die kalibrierten Posen können mit get_calib_data und dem Parameter ItemType='calib_obj_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.
Für antropomorphe (d.h. nicht-SCARA) Roboter ist ein ausreichendes Ausmaß an Rotation zwischen den Bildern 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. Zu beachten ist, dass für SCARA-Roboter alle Posen parallel sind und daher diese Bedingung natürlich nicht erfüllt sein muss.
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 Kalibrierprogramm 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 (), 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:
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!
Dieser Operator modifiziert den Zustand des folgenden Eingabeparameters:
Der Wert dieses Parameters darf nicht über mehrere Threads verwendet 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, remove_calib_data, remove_calib_data_observ
Calibration
| Operatoren |