Halcon create_pose算子帮助文档翻译

这篇博客详细介绍了HALCON中用于生成3D姿态的create_pose操作器,包括平移、旋转的不同表示方式(gba、abg、rodriguez模式)以及它们在坐标转换中的应用。此外,还讨论了非标准姿态定义,如旋转和平移顺序的改变以及旋转角度的反转。姿态转换涉及到坐标的平移和旋转,通过pose_to_hom_mat3d和affine_trans_point_3d算子实现坐标转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(Rot⁡x)⋅Ry(Rot⁡Y)⋅Rz(Rot⁡z) \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就可以被解读为下面的操作:

  1. Z轴旋转。
  2. 绕“旧的” Y轴旋转。
  3. 绕“旧的” X轴旋转。

反过来,如果你从左往右读的话,旋转就是参考局部坐标系进行的(也就是“新的”)。这时候RgbaR_{gba}Rgba对应下面的操作:

  1. X轴旋转。
  2. 绕“新的” Y轴旋转。
  3. 绕“(最)新的” 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(Rot⁡z)⋅Ry(Rot⁡Y)⋅Rx(Rot⁡X) \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(Rot⁡XRot⁡YRot⁡Z)by2⋅arctan⁡(Rot⁡X2+Rot⁡Y2+Rot⁡Z2) \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 aroundRotXRotYRotZby2arctan(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 Z1R( 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(Rot⁡x,Rot⁡Y,Rot⁡z)⋅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(Rot⁡X,Rot⁡Y,Rot⁡Z)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(pT)=R(RotX,RotY,RotZ)0000001100001000010 Trans X Trans Y Trans Z1=H(R)H(T)
如果你为 ViewOfTransform参数设定了coordinate_system值,变换的顺序不变,但旋转的角度会变为原先的相反数。请注意,不同于它的名字,这东西并不等价于变换坐标系!
Hcoordinate_system=[100 Trans X010 Trans Y001 Trans Z0001]⋅[0R(−Rot⁡X,−Rot⁡Y,−Rot⁡Z)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 Z1R(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+TRp+TRp+TRp+TRp+TRp+TR(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来读取姿态的表征类型。

### 回答1: 1. 打开终端,输入以下命令安装fcitx输入法: sudo apt-get install fcitx fcitx-config-gtk fcitx-table-wubi 2. 安装完毕后,打开“系统设置”-“语言支持”,将“键盘输入法系统”设置为fcitx。 3. 重新启动电脑,打开任意文本编辑器,按下Ctrl+Space键即可切换输入法,选择中文输入法即可开始输入中文。 ### 回答2: 在Linux系统下安装中文输入法有多种方法,以下是其中一种较常见的方法: 1. 打开终端,输入以下命令安装fcitx输入法框架: sudo apt-get install fcitx 2. 安装后,再次在终端中输入以下命令安装fcitx的输入法引擎: sudo apt-get install fcitx-googlepinyin 3. 安装完成后,打开系统设置,找到“地区和语言”或“语言支持”选项,在“输入源”或“键盘输入法系统”中选择fcitx作为默认输入法。 4. 重新启动电脑,启动时会自动加载fcitx输入法框架。 5. 在系统托盘中找到输入法图标,右键点击选择“配置”,进入fcitx配置页面。 6. 在配置页面中,点击“+”号添加中文输入法。一般情况下,选择“pinyin”或“googlepinyin”作为中文输入法。 7. 完成上述步骤后,就可以在需要输入中文的应用程序中使用中文输入法了。在输入框中点击右键,选择“切换输入法”,或使用快捷键(默认为Ctrl + Space)进行切换。 需要注意的是,以上方法适用于大多数Linux系统,对于不同的发行版可能会有细微的差异。对于某些特定的发行版,也可以通过软件包管理器直接搜索和安装相应的中文输入法。另外,还可以通过其他输入法框架,如ibus,来安装和使用中文输入法。 ### 回答3: 要在Linux系统中安装中文输入法,可以按照以下步骤进行操作。 第一步,打开终端窗口,在终端中输入以下命令,以安装ibus输入法框架: sudo apt-get install ibus 第二步,再次在终端中输入以下命令,以安装ibus-pinyin中文输入法: sudo apt-get install ibus-pinyin 第三步,在终端中输入以下命令,以重新启动ibus服务: ibus restart 第四步,打开系统设置,选择“区域与语言”或类似选项,找到“输入源”或“输入法”,然后添加中文输入法。 第五步,在输入法选项中选择新添加的中文输入法,这样就完成了中文输入法的安装。 在使用中文输入法时,可以通过以下方法进行切换: 方法一,使用快捷键:按下Ctrl+空格键,切换输入法。 方法二,通过任务栏中的输入法图标:点击输入法图标,然后从弹出的菜单中选择所需的输入法。 安装中文输入法后,可以在几乎所有的应用程序中使用中文输入。通过切换输入法,可以方便地在中文和其他语言之间切换,满足自己的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值