create_pose
— Erzeugen einer 3D-Lage (Pose).
create_pose( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewOfTransform : Pose)
create_pose
erzeugt eine 3D-Lage Pose
. Eine 3D-Lage
beschreibt eine starre 3D-Transformation, d.h. eine Transformation bestehend
aus einer beliebigen Translation und Rotation, mit 6 Parametern:
TransX
, TransY
und TransZ
beschreiben die
Translation entlang der x-, y- und z-Achse, während RotX
,
RotY
und RotZ
die Rotation beschreiben.
3D-Lagen werden typischerweise für zwei Zwecke verwendet: Erstens zur Beschreibung der Position und Orientierung eines Koordinatensystems relativ zu einem anderen (z.B. die 3D-Lage eines Objektkoordinatensystems relativ zum Kamerakoordinatensystem - kurz, die 3D-Lage des Objekts relativ zur Kamera) und zweitens zur Beschreibung der Transformation von Koordinaten zwischen Koordinatensystemen (z.B. die Transformation von Objektkoordinaten in Kamerakoordinaten).
Eine 3D-Rotation um eine beliebige Achse kann mit drei Parametern in
verschiedener Weise dargestellt werden. HALCON stellt drei davon über den
Parameter OrderOfRotation
zur Auswahl: Falls der Wert 'gba'
übergeben wird, wird die Rotation durch die folgende Kette von Rotationen
beschrieben (siehe hom_mat3d_rotate
für den Inhalt der
Rotationsmatrizen ):
wird in der Fachliteratur auch Yaw-Pitch-Roll Konvention genannt. Bitte beachten Sie, dass diese Kette auf zwei Arten „gelesen“ werden kann: Wenn man von rechts startet, werden die Rotationen immer relativ zum globalen (unveränderten oder „alten“) Koordinatensystem ausgeführt. D.h., kann wie folgt gelesen werden: Erst wird um die z-Achse rotiert, dann um die „alte“ y-Achse und schließlich um die „alte“ x-Achse. Falls die Kette dagegen von links nach rechts gelesen wird, werden die Rotationen jeweils relativ zum lokalen („neuen“) Koordinatensystem ausgeführt. Dann liest sich wie folgt: Erst wird um die x-Achse rotiert, dann um die „neue“ y-Achse und schließlich um die „neu(st)e“ z-Achse.
Von rechts nach links gelesen, entspricht der folgenden Sequenz von Operatoraufrufen:
hom_mat3d_identity (HomMat3DIdent) hom_mat3d_rotate (HomMat3DIdent, RotZ, 'z', 0, 0, 0, HomMat3DRotZ) hom_mat3d_rotate (HomMat3DRotZ, RotY, 'y', 0, 0, 0, HomMat3DRotYZ) hom_mat3d_rotate (HomMat3DRotYZ, RotX, 'x', 0, 0, 0, HomMat3DXYZ)
Dagegen entspricht die folgende Sequenz der Leserichtung von links nach rechts:
hom_mat3d_identity (HomMat3DIdent) hom_mat3d_rotate_local (HomMat3DIdent, RotX, 'x', HomMat3DRotX) hom_mat3d_rotate_local (HomMat3DRotX, RotY, 'y', HomMat3DRotXY) hom_mat3d_rotate_local (HomMat3DRotXY, RotZ, 'z', HomMat3DXYZ)
wird in der Fachliteratur auch Roll-Pitch-Yaw Konvention genannt.
Falls in OrderOfRotation
der Wert 'abg' übergeben wird,
wird die Rotation durch die folgende Transformationskette dargestellt:
Falls der Wert 'rodriguez' in OrderOfRotation
übergeben
wird, werden die Rotationsparameter RotX
, RotY
und
RotZ
als die x-, y- und z-Komponente des so genannten
Rodriguez-Rotationsvektors interpretiert. Die Richtung dieses Vektors
definiert die (beliebige) Rotationsachse, seine Länge den Rotationswinkel
(mathematisch positive Orientierung). HALCON verwendet eine Variation des
Rodriguez-Vektors, in der die Länge des Vektors gleich dem Tangens des halben
Winkels ist:
Bitte beachten Sie, dass diese Posen-Darstellung nicht immer eindeutig ist, d.h. mehrere Posen-Darstellungen beschreiben dieselbe homogene Transformationsmatrix. Beispielsweise für mit haben die folgenden zwei Posen die gleiche Darstellung als homogene Transformationsmatrix:
create_pose(0, 0, 0, 30 , 90, 54, 'Rp+T', 'gba', 'point', Pose1) create_pose(0, 0, 0, 17, 90, 67, 'Rp+T', 'gba', 'point', Pose2)
Alternativ können Rotationen auch durch homogene Transformationsmatrizen oder
Quaternionen (axis_angle_to_quat
) dargestellt werden.
Mit dem Operator pose_to_hom_mat3d
erhält man die der 3D-Lage
entsprechende homogene Transformationsmatrix. Gemäß der Standard-Definition
ist dies die folgende Transformationsmatrix, welche in zwei separate Matrizen
aufgespaltet werden kann, eine für die Translation
(H(T)) und eine für die Rotation
(H(R)):
Die folgende Gleichung zeigt, wie ein Punkt mit Hilfe einer 3D-Lage (bzw.
der entsprechenden homogenen Transformationsmatrix
) von Koordinatensystem 1
(cs1) in Koordinatensystem 2 (cs2) transformiert werden
kann (Ein- und Ausgabepunkte als homogene Vektoren dargestellt, vgl.
affine_trans_point_3d
).
Beachten Sie, dass zur Transformation von cs1 in cs2
die homogene Transformationsmatrix verwendet wird, die die 3D-Lage von
cs1 relativ zu cs2 beschreibt:
Die Gleichung entspricht der folgenden Sequenz von Operatoraufrufen:
pose_to_hom_mat3d(PoseOf1In2, HomMat3DFrom1In2) affine_trans_point_3d(HomMat3DFrom1In2, P1X, P1Y, P1Z, P2X, P2Y, P2Z)
Bisher wurde die Standard-Definition von 3D-Lagen beschrieben. Um diese zu
erzeugen, übergibt man in den Parametern OrderOfTransform
und
ViewOfTransform
die (Standard-)Werte 'Rp+T'
bzw. 'point' . Für andere Werte werden nicht dem Standard
entsprechende Typen von 3D-Lagen erzeugt, die kurz im Folgenden beschrieben
werden. Bitte beachten Sie, dass diese Darstellungstypen nur zur
Abwärtskompatibiltät unterstützt werden; wir empfehlen nachdrücklich, die
Standard-Typen zu verwenden.
Wenn 'R(p-T)' in OrderOfTransform
übergeben wird,
entspricht die erzeugte 3D-Lage der folgenden Transformationskette, d.h. die
Reihenfolge von Translation und Rotation ist vertauscht und die Translation
ist negiert:
Wenn in 'coordinate_system' in ViewOfTransform
übergeben
wird, bleibt die Reihenfolge der Transformationen gleich, aber die
Rotationswinkel werden negiert. Bitte beachten Sie, dass dies nicht der
Transformation eines Koordinatensystems entspricht, auch wenn der
Parameterwert dies suggeriert!
Die erzeugte 3D-Lage wird in Pose
zurückgeliefert, in Form eines
Tupels mit sieben Elementen. Die ersten drei Elemente enthalten die
Translationsparameter TransX
, TransY
und TransZ
,
gefolgt von den Rotationsparametern RotX
, RotY
und
RotZ
. Das letzte Element kodiert den Darstellungstyp der 3D-Lage,
der mit den Parametern OrderOfTransform
, OrderOfRotation
und ViewOfTransform
gewählt wurde. Die folgende Tabelle listet die
möglichen Kombinationen. Wie schon erwähnt empfehlen wir, nur die Typen mit
OrderOfTransform
= 'Rp+T' und ViewOfTransform
=
'point' zu verwenden (Codes 0, 2, and 4).
OrderOfTransform |
OrderOfRotation |
ViewOfTransform |
Code |
---|---|---|---|
'Rp+T' | 'gba' | 'point' | 0 |
'Rp+T' | 'abg' | 'point' | 2 |
'Rp+T' | 'rodriguez' | 'point' | 4 |
'Rp+T' | 'gba' | 'coordinate_system' | 1 |
'Rp+T' | 'abg' | 'coordinate_system' | 3 |
'Rp+T' | 'rodriguez' | 'coordinate_system' | 5 |
'R(p-T)' | 'gba' | 'point' | 8 |
'R(p-T)' | 'abg' | 'point' | 10 |
'R(p-T)' | 'rodriguez' | 'point' | 12 |
'R(p-T)' | 'gba' | 'coordinate_system' | 9 |
'R(p-T)' | 'abg' | 'coordinate_system' | 11 |
'R(p-T)' | 'rodriguez' | 'coordinate_system' | 13 |
3D-Lagen können mit convert_pose_type
in andere Darstellungstypen
konvertiert werden; mit get_pose_type
kann der Darstellungstyp einer
3D-Lage abgefragt werden.
TransX
(input_control) real →
(real)
Translation in Richtung der x-Achse (in [m]).
Defaultwert: 0.1
Wertevorschläge: -1.0, -0.75, -0.5, -0.25, -0.2, -0.1, -0.5, -0.25, -0.125, -0.01, 0.0, 0.01, 0.125, 0.25, 0.5, 0.1, 0.2, 0.25, 0.5, 0.75, 1.0
TransY
(input_control) real →
(real)
Translation in Richtung der y-Achse (in [m]).
Defaultwert: 0.1
Wertevorschläge: -1.0, -0.75, -0.5, -0.25, -0.2, -0.1, -0.5, -0.25, -0.125, -0.01, 0.0, 0.01, 0.125, 0.25, 0.5, 0.1, 0.2, 0.25, 0.5, 0.75, 1.0
TransZ
(input_control) real →
(real)
Translation in Richtung der z-Achse (in [m]).
Defaultwert: 0.1
Wertevorschläge: -1.0, -0.75, -0.5, -0.25, -0.2, -0.1, -0.5, -0.25, -0.125, -0.01, 0.0, 0.01, 0.125, 0.25, 0.5, 0.1, 0.2, 0.25, 0.5, 0.75, 1.0
RotX
(input_control) real →
(real)
Rotation um x-Achse bzw. x-Komponente des Rodriguez-Vektors (in [°] bzw. ohne Einheit).
Defaultwert: 90.0
Wertevorschläge: 0.0, 90.0, 180.0, 270.0
Typischer Wertebereich: 0
≤
RotX
≤
360
RotY
(input_control) real →
(real)
Rotation um y-Achse bzw. y-Komponente des Rodriguez-Vektors (in [°] bzw. ohne Einheit).
Defaultwert: 90.0
Wertevorschläge: 0.0, 90.0, 180.0, 270.0
Typischer Wertebereich: 0
≤
RotY
≤
360
RotZ
(input_control) real →
(real)
Rotation um z-Achse bzw. z-Komponente des Rodriguez-Vektors (in [°] bzw. ohne Einheit).
Defaultwert: 90.0
Wertevorschläge: 0.0, 90.0, 180.0, 270.0
Typischer Wertebereich: 0
≤
RotZ
≤
360
OrderOfTransform
(input_control) string →
(string)
Reihenfolge von Rotation und Translation.
Defaultwert: 'Rp+T'
Wertevorschläge: 'Rp+T' , 'R(p-T)'
OrderOfRotation
(input_control) string →
(string)
Bedeutung der Rotationswerte.
Defaultwert: 'gba'
Wertevorschläge: 'gba' , 'abg' , 'rodriguez'
ViewOfTransform
(input_control) string →
(string)
Sichtweise der Transformation.
Defaultwert: 'point'
Wertevorschläge: 'point' , 'coordinate_system'
Pose
(output_control) pose →
(real / integer)
3D-Lage (Pose).
Parameteranzahl: 7
* Create a pose. create_pose (0.1, 0.2, 0.3, 40, 50, 60, 'Rp+T', 'gba', 'point', Pose)
Sind die Parameterwerte korrekt, dann liefert create_pose
den Wert 2 (H_MSG_TRUE).
pose_to_hom_mat3d
,
write_pose
,
camera_calibration
,
hand_eye_calibration
hom_mat3d_rotate
,
hom_mat3d_translate
,
convert_pose_type
,
get_pose_type
,
hom_mat3d_to_pose
,
pose_to_hom_mat3d
,
write_pose
,
read_pose
Foundation