halcon文档翻译
- liu11
- 2020-12-28
create_pose(操作器)
参数
create_pose( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewOfTransform : Pose)
描述
create_pose
用于生成一个3D姿态Pose
.生成的姿态可以描述一个刚性的3D变换(比如包含一系列平移和旋转的变换),其中需要6个参数:TransX, TransY,
和TransZ
描述了沿着x-, y-, 和 z-轴的平移,RotX, RotY,
和RotZ
描述了旋转。
3D位姿通常被用在两个地方:1.描述一个坐标系相对于另一个坐标系的位置和导向(比如零件坐标系相对于相机坐标系,简单地说就是零件相对于相机的姿态);2.描述两个坐标系之间的坐标如何进行转换(比如把零件坐标系下的点转换到相机坐标系下)
导向的表示(旋转)
绕任意轴的旋转可以通过三个参数以多种方式表示。HALCION支持通过设置参数OrderOfRotation
来选择三种不同的旋转方式。设置为 gba
模式时,模型进行的旋转将会按照下面的旋转链绕三个轴进行(查看hom_mat3d_rotate
获取更多关于旋转矩阵Rx,Ry,RzR_x,R_y,R_zRx,Ry,Rz内容的信息):
Rgba=Rx(Rotx)⋅Ry(RotY)⋅Rz(Rotz) \mathbf{R}_{g b a}=\mathbf{R}_{x}(\operatorname{Rot} \mathrm{x}) \cdot \mathbf{R}_{y}(\operatorname{Rot} \mathrm{Y}) \cdot \mathbf{R}_{z}(\operatorname{Rot} \mathrm{z}) Rgba=Rx(Rotx)⋅Ry(RotY)⋅Rz(Rotz)
RgbaR_{gba}Rgba在文献中通常被称为 偏转-俯仰-翻滚(Yaw-Pitch-Roll)。注意,你可以用两种方式来读这个旋转链:如果你从右边开始读的话,旋转是相对于全局坐标系(固定的,或者说“旧的”)进行的。这时候RgbaR_{gba}Rgba就可以被解读为下面的操作:
- 绕
Z
轴旋转。 - 绕“旧的”
Y
轴旋转。 - 绕“旧的”
X
轴旋转。
反过来,如果你从左往右读的话,旋转就是参考局部坐标系进行的(也就是“新的”)。这时候RgbaR_{gba}Rgba对应下面的操作:
- 绕
X
轴旋转。 - 绕“新的”
Y
轴旋转。 - 绕“(最)新的”
X
轴旋转。
从右往左读RgbaR_{gba}Rgba对应下面的一系列算子操作:
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)
从左往右读RgbaR_{gba}Rgba对应下面的一系列算子操作:
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)
把参数OrderOfRotation
设置为 abg
模式时,变换对应如下的旋转链:
Rabg=Rz(Rotz)⋅Ry(RotY)⋅Rx(RotX)
\mathbf{R}_{a b g}=\mathbf{R}_{z}(\operatorname{Rot} z) \cdot \mathbf{R}_{y}(\operatorname{Rot} Y) \cdot \mathbf{R}_{x}(\operatorname{Rot} \mathrm{X})
Rabg=Rz(Rotz)⋅Ry(RotY)⋅Rx(RotX)
RabgR_{abg}Rabg在文献中被称为 翻滚-俯仰-偏转(Roll-Pitch-Yaw)。
把参数OrderOfRotation
设置为 rodriguez
模式时,旋转的参数 RotX, RotY,
和RotZ
会被解析为一种被称为Rodriguez旋转向量的X,Y,Z
方向上的分量。向量的方向定义了旋转的轴(任意),向量的长度定义了朝着正方向旋转的角度。我们这里用了 Rodriguez
旋转向量的一个变种,向量的长度表示的是旋转角度一半的正切值(tangent)。
Rrodriguez=rotate around(RotXRotYRotZ)by2⋅arctan(RotX2+RotY2+RotZ2)
\mathbf{R}_{\text {rodriguez}}=\text {rotate around}\left(\begin{array}{c}
\operatorname{Rot} \mathrm{X} \\
\operatorname{Rot} \mathrm{Y} \\
\operatorname{Rot} Z
\end{array}\right) \quad b y \quad 2 \cdot \arctan \left(\sqrt{\operatorname{Rot} \mathrm{X}^{2}+\operatorname{Rot} \mathrm{Y}^{2}+\operatorname{Rot} Z^{2}}\right)
Rrodriguez=rotate around⎝⎛RotXRotYRotZ⎠⎞by2⋅arctan(RotX2+RotY2+RotZ2)
另外,请注意,这些3D姿态并不是唯一的,也就是说齐次变换矩阵可以有多个姿态表征。比如,对于RgbaR_{gba}Rgba,当b=±90b=\pm90b=±90时,下面的姿态对应同样的齐次变换矩阵:
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)
如果应用中这个问题导致了错误,可以直接用齐次变换矩阵或者四元数(axis_angle_to_quat
)来表征旋转。
对应齐次变换矩阵(Corresponding homogeneous transformation matrix)
可以通过算子 pose_to_hom_mat3d
来获得一个姿态对应的齐次变换矩阵。在标准的定义中,得到的这个矩阵就是下面可以分为两个独立矩阵的其次变换矩阵,一个表征平移(H( T )),一个表征旋转(H( R ))),
Hpose=[RT0001]=[ Trans XR( Rot X, Rot Y, Rot Z) Trans Y Trans Z0001]
\mathbf{H}_{\text {pose}}=\left[
\begin{array}{cc}
\mathbf{R} & \mathbf{T} \\
0\quad0\quad0 & 1
\end{array}\right]=
\left[\begin{array}{cccc}
& & \text { Trans } \mathrm{X} \\
\mathbf{R}(\text { Rot } \mathrm{X}, \text { Rot } \mathrm{Y}, \text { Rot } \mathrm{Z}) & & \text { Trans } \mathrm{Y} \\
& & \text { Trans } \mathrm{Z} \\
0\qquad0\qquad0&&1
\end{array}\right]
Hpose=[R000T1]=⎣⎢⎢⎡R( Rot X, Rot Y, Rot Z)000 Trans X Trans Y Trans Z1⎦⎥⎥⎤
=[100 Trans X010 Trans Y001 Trans Z0001]⋅[0R( Rot X, Rot Y, Rot Z)000001]=H(T)⋅H(R)
=\left[\begin{array}{cccc}
1 & 0 & 0 & \text { Trans } \mathrm{X} \\
0 & 1 & 0 & \text { Trans } \mathrm{Y} \\
0 & 0 & 1 & \text { Trans } \mathrm{Z} \\
0 & 0 & 0 & 1
\end{array}\right]
\cdot
\left[\begin{array}{cccc}
& & 0\\
\mathbf{R}(\text { Rot } \mathrm{X}, \text { Rot } \mathrm{Y}, \text { Rot } \mathrm{Z}) & & 0 \\
& & 0 \\
0\qquad0\qquad0&&1
\end{array}\right] = \mathbf{H(T)\cdot H(R)}
=⎣⎢⎢⎡100001000010 Trans X Trans Y Trans Z1⎦⎥⎥⎤⋅⎣⎢⎢⎡R( Rot X, Rot Y, Rot Z)0000001⎦⎥⎥⎤=H(T)⋅H(R)
坐标的转换
下面的公式描述了如何通过一个姿态pose
将一个点从一个坐标系1(cs1
)转换到坐标系2(cs2
),更具体地说,是通过对应的齐次变换矩阵cs2Hcs1^{cs2}\mathbf{H}_{cs1}cs2Hcs1(输入点和输出点都是以齐次向量的形式,也可参考 affine_trans_point_3d
)。需要注意的是,从坐标系cs1
的点向坐标系cs2
转换的话,你需要的是坐标系cs1
在坐标系cs2
下的姿态。
(pcs21)=cs2Hcs1⋅(pcs11)=(R(Rotx,RotY,Rotz)⋅pcs1+( Trans X Trans Y Trans Z))
\left(\begin{array}{c}
\mathbf{p}^{c s 2} \\
1
\end{array}\right)={ }^{c s 2} \mathbf{H}_{c s 1} \cdot\left(\begin{array}{c}
\mathbf{p}^{c s 1} \\
1
\end{array}\right)=\left(\mathbf{R}(\operatorname{Rot} \mathrm{x}, \operatorname{Rot} \mathrm{Y}, \operatorname{Rot} z) \cdot \mathbf{p}^{c s 1}+\left(\begin{array}{c}
\text { Trans } \mathrm{X} \\
\text { Trans } \mathrm{Y} \\
\text { Trans } \mathrm{Z}
\end{array}\right)\right)
(pcs21)=cs2Hcs1⋅(pcs11)=⎝⎛R(Rotx,RotY,Rotz)⋅pcs1+⎝⎛ Trans X Trans Y Trans Z⎠⎞⎠⎞
该操作对应下面的算子调用:
pose_to_hom_mat3d(PoseOf1In2, HomMat3DFrom1In2)
affine_trans_point_3d(HomMat3DFrom1In2, P1X, P1Y, P1Z, P2X, P2Y, P2Z)
非标准的姿态定义
目前为止,我们表述过的都是标准的姿态定义。想要生成这类姿态,你需要为OrderOfTransform
参数设定Rp+T
(默认)值,为ViewOfTransform
参数设定point
,通过为这俩参数设定不同的值,我们可以生成下面简短描述中那样的非标姿态。请注意,这些表征类型仅仅是为了支持向后兼容而设置的,我们墙裂建议大家使用标准姿态。
如果你为OrderOfTransform
参数设定了 R(p-T)
,姿态就会对应于下面的变换链,可以看到,平移和旋转的顺序被颠倒了,同时平移的值变成了原先的相反数。
HR(p−T)=[0R(RotX,RotY,RotZ)000001]⋅[100− Trans X010− Trans Y001− Trans Z0001]=H(R)⋅H(−T)
\mathbf{H}_{R(p-T)}=\left[
\begin{array}{cc}
& 0 \\
\mathbf{R}(\operatorname{Rot} X, \operatorname{Rot} Y, \operatorname{Rot} Z) & 0 \\
& 0 \\
0\qquad0\qquad0 & 1
\end{array}\right] \cdot
\left[\begin{array}{cccc}
1 & 0 & 0 & -\text { Trans } X \\
0 & 1 & 0 & -\text { Trans } Y \\
0 & 0 & 1 & -\text { Trans } Z \\
0 & 0 & 0 & 1
\end{array}\right]=\mathbf{H}(\mathbf{R}) \cdot \mathbf{H}(-\mathbf{T})
HR(p−T)=⎣⎢⎢⎡R(RotX,RotY,RotZ)0000001⎦⎥⎥⎤⋅⎣⎢⎢⎡100001000010− Trans X− Trans Y− Trans Z1⎦⎥⎥⎤=H(R)⋅H(−T)
如果你为 ViewOfTransform
参数设定了coordinate_system
值,变换的顺序不变,但旋转的角度会变为原先的相反数。请注意,不同于它的名字,这东西并不等价于变换坐标系!
Hcoordinate_system=[100 Trans X010 Trans Y001 Trans Z0001]⋅[0R(−RotX,−RotY,−RotZ)000001]
\mathbf{H}_{\text {coordinate\_system}}=\left[\begin{array}{cccc}
1 & 0 & 0 & \text { Trans } \mathrm{X} \\
0 & 1 & 0 & \text { Trans } \mathrm{Y} \\
0 & 0 & 1 & \text { Trans } Z \\
0 & 0 & 0 & 1
\end{array}\right] \cdot\left[
\begin{array}{cc}
& 0 \\
\mathbf{R}(-\operatorname{Rot} X, -\operatorname{Rot} Y, -\operatorname{Rot} Z) & 0 \\
& 0 \\
0\qquad0\qquad0 & 1
\end{array}\right]
Hcoordinate_system=⎣⎢⎢⎡100001000010 Trans X Trans Y Trans Z1⎦⎥⎥⎤⋅⎣⎢⎢⎡R(−RotX,−RotY,−RotZ)0000001⎦⎥⎥⎤
返回数据结构
生成的3D姿态,会以长度为7的数组Pose
的形式返回。前面的三个参数TransX, TransY,
以及TransZ
代表平移,接下来的三个参数RotX, RotY,
和RotZ
代表旋转。最后的元素是一个姿态表征类型的识别码,代表你为OrderOfTransform, OrderOfRotation,
和ViewOfTransform
参数所设定的值。下面的表格给出了可能的组合。之前也已经说过了,我们建议只使用 OrderOfTransform = 'Rp+T' ,ViewOfTransform = 'point'
(也就是识别码为 0, 2,和4的情况)。
Orderoftransform OrderofRotation ViewOfTran form 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
\begin{array}{cccc}
\hline \text { Orderoftransform } & \text { OrderofRotation } & \text { ViewOfTran } \text { form } & \text { Code } \\
\hline{ }^{\prime} R p+T^{\prime} & \text { 'gba' } & \text { 'point' } & 0 \\
{ }^{\prime} R p+T^{\prime} & \text { 'abg' } & \text { 'point' } & 2\\
{ }^{\prime} R p+T^{\prime} & \text { 'rodriguez' } & \text { 'point' } & 4\\
{ }^{\prime} R p+T^{\prime} & \text { 'gba' } & \text { 'coordinate\_system' } & 1\\
{ }^{\prime} R p+T^{\prime} & \text { 'abg' } & \text { 'coordinate\_system' } & 3\\
{ }^{\prime} R p+T^{\prime} & \text { 'rodriguez' } & \text { 'coordinate\_system' } & 5\\
{ }^{\prime} R \text{(p-T)}^{\prime} & \text { 'gba' } & \text { 'point' } & 8\\
{ }^{\prime} R \text{(p-T)}^{\prime} & \text { 'abg' } & \text { 'point' } & 10\\
{ }^{\prime} R \text{(p-T)}^{\prime} & \text { 'rodriguez' } & \text { 'point' } & 12\\
{ }^{\prime} R \text{(p-T)}^{\prime} & \text { 'gba' } & \text { 'coordinate\_system' } & 9\\
{ }^{\prime} R \text{(p-T)}^{\prime} & \text { 'abg' } & \text { 'coordinate\_system' } & 11\\
{ }^{\prime} R \text{(p-T)}^{\prime} & \text { 'rodriguez' } & \text { 'coordinate\_system' } & 13\\
\hline
\end{array}
Orderoftransform ′Rp+T′′Rp+T′′Rp+T′′Rp+T′′Rp+T′′Rp+T′′R(p-T)′′R(p-T)′′R(p-T)′′R(p-T)′′R(p-T)′′R(p-T)′ OrderofRotation ’gba’ ’abg’ ’rodriguez’ ’gba’ ’abg’ ’rodriguez’ ’gba’ ’abg’ ’rodriguez’ ’gba’ ’abg’ ’rodriguez’ ViewOfTran form ’point’ ’point’ ’point’ ’coordinate_system’ ’coordinate_system’ ’coordinate_system’ ’point’ ’point’ ’point’ ’coordinate_system’ ’coordinate_system’ ’coordinate_system’ Code 0241358101291113
你可以使用convert_pose_type
算子来修改姿态的表征类型,或者使用get_pose_type
来读取姿态的表征类型。