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 Kalibrierung):
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 mittels 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.
Genau genommen 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. SCARA-Roboter weisen nur eine Rotationsachse auf. Die Rotation zwischen den Bildern sollte ebenfalls groß sein.
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:
Während der Ausführung dieses Operators muss der Zugriff auf den Wert dieses Parameters synchronisiert werden, wenn er über mehrere Threads hinweg verwendet wird.
CalibDataID
(input_control, Zustand wird modifiziert) calib_data →
(handle)
Handle des Kalibrierdatenmodells.
Errors
(output_control) number-array →
(real)
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
K. Daniilidis: „Hand-Eye Calibration Using Dual Quaternions“;
International Journal of Robotics Research, Vol. 18, No. 3,
pp. 286-298; 1999.
M. Ulrich, C. Steger: „Hand-Eye Calibration of SCARA Robots Using Dual
Quaternions“; Pattern Recognition and Image Analysis, Vol. 26, No. 1,
pp. 231-239; January 2016.
Calibration