create_pose
名称
create_pose —创建3D姿势。
签名
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姿态通常以两种方式使用:首先,描述一个坐标系相对于另一坐标系的位置和方向(例如,零件坐标系相对于相机坐标系的姿态)
其次,零件相对姿态其次是描述如何在两个坐标系之间转换坐标(例如,将点从零件坐标转换为摄像机坐标)。
方向表示(旋转)
围绕任意轴的3D旋转可以多种方式由3个参数表示。HALCON允许您使用参数OrderOfRotation在其中三个中进行选择:如果传递值'gba',则旋转将通过以下围绕三个轴的旋转链来描述(有关旋转矩阵的内容, 请参见hom_mat3d_rotate):
在文献中称为“ Yaw-Pitch-Roll约定”。请注意,您可以通过两种方式“读取”该链:如果从右开始,则始终相对于全局(即固定或“旧”)坐标系执行旋转。因此, 可以理解为:首先绕着z轴旋转,然后绕着“旧” y轴旋转,最后绕着“旧” x轴旋转。相反,如果从左到右读取,则相对于局部(即“新”)坐标系执行旋转。然后, 对应于以下内容:首先绕x轴旋转,绕“新” y轴旋转,最后绕“新(est)” z轴旋转。
从右到左读取对应于以下操作员调用序列:
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)
相反,从左向右读取对应于以下操作符序列:
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'时,旋转对应于以下链:
在文献中被称为“ Roll-Pitch-Yaw”惯例。
如果在OrderOfRotation中传递“ rodriguez”,则旋转参数RotX,RotY和RotZ将被解释为所谓的Rodriguez旋转向量的x,y和z分量。向量的方向定义了(任意)旋转轴。向量的长度通常以正方向定义旋转角度。此处,使用Rodriguez向量的变体,其中向量的长度定义了旋转角一半的切线:
请注意,这些3D姿势可能是模棱两可的,这意味着同构转换矩阵可以具有多个姿势表示形式。例如,对于 , 以下姿势对应于相同的齐次变换矩阵:
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)表示旋转。
对应的齐次变换矩阵
您可以使用运算符pose_to_hom_mat3d获得与姿势相对应的齐次变换矩阵。在标准定义中,以下是齐次变换矩阵,可以将其分解为两个单独的矩阵,一个矩阵用于平移(H(t)),另一个矩阵用于旋转(H(R)):
坐标转换
以下等式描述了如何使用相应的齐次变换矩阵(输入和输出点作为齐次矢量,另请参见affine_trans_point_3d)使用姿势或更精确地将一个点从坐标系1转换为坐标系2 。请注意,要将点从坐标系1转换为系统2,请使用描述坐标系1相对于系统2的姿态的转换矩阵。
这对应于以下操作员调用:
pose_to_hom_mat3d(PoseOf1In2,HomMat3DFrom1In2) affine_trans_point_3d(HomMat3DFrom1In2,P1X,P1Y,P1Z,P2X,P2Y,P2Z)
非标准姿势定义
到目前为止,我们已经描述了标准姿势定义。要创建这样的姿势,您选择(默认)值“卢比+ T”的参数 OrderOfTransform和“点”的ViewOfTransform。通过为这些参数指定其他值,您可以创建非标准姿势类型,我们将在下面简要描述。请注意,仅出于向后兼容的目的才支持这些表示类型。我们强烈建议使用标准类型。
如果为OrderOfTransform选择'R(pT)',则创建的位姿对应于以下转换链,即,旋转和平移的顺序相反,而平移取反:
如果为ViewOfTransform选择'coordinate_system',则转换顺序保持不变,但旋转角度将被取反。请注意,与其名称相反,这并不等同于变换坐标系!
返回的数据结构
创建的3D姿势将以Pose返回,该姿势是长度为7的元组。前三个元素包含平移参数 TransX,TransY和TransZ,后跟旋转参数RotX,RotY和RotZ。最后一个元素使用参数OrderOfTransform,OrderOfRotation和 ViewOfTransform编码您选择的姿势的表示类型。
下表列出了可能的组合。如前所述,我们建议仅使用OrderOfTransform = 'Rp + T'和 ViewOfTransform ='point'(代码0、2和4)。
转换顺序 | 旋转顺序 | ViewOfTransform | 码 |
---|---|---|---|
'Rp + T' | 'gba' | '点' | 0 |
'Rp + T' | 'abg' | '点' | 2 |
'Rp + T' | 罗德里格斯(rodriguez) | '点' | 4 |
'Rp + T' | 'gba' | '坐标系' | 1个 |
'Rp + T' | 'abg' | '坐标系' | 3 |
'Rp + T' | 罗德里格斯(rodriguez) | '坐标系' | 5 |
'R(pT)' | 'gba' | '点' | 8 |
'R(pT)' | 'abg' | '点' | 10 |
'R(pT)' | 罗德里格斯(rodriguez) | '点' | 12 |
'R(pT)' | 'gba' | '坐标系' | 9 |
'R(pT)' | 'abg' | '坐标系' | 11 |
'R(pT)' | 罗德里格斯(rodriguez) | '坐标系' | 13 |
您可以使用convert_pose_type将姿势转换为其他表示类型, 并使用get_pose_type查询类型。
并行化
多线程类型:可重入(与非排他运算符并行运行)。
多线程作用域:全局(可以从任何线程调用)。
未经并行处理。
参量
沿x轴平移(以[m]为单位)。
默认值: 0.1
建议值: -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
沿y轴平移(以[m]为单位)。
默认值: 0.1
建议值: -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
沿z轴平移(以[m]为单位)。
默认值: 0.1
建议值: -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
绕Rodriguez向量的x轴或x分量旋转(以[°]为单位,无单位)。
默认值: 90.0
建议值: 0.0、90.0、180.0、270.0
典型值的范围:0≤ ROTX ≤360
绕Rodriguez向量的y轴或y分量旋转(以[°]为单位或无单位)。
默认值: 90.0
建议值: 0.0、90.0、180.0、270.0
典型值的范围:0≤ ROTY ≤360
绕Rodriguez矢量的z轴或z分量旋转(以[°]为单位,无单位)。
默认值: 90.0
建议值: 0.0、90.0、180.0、270.0
典型值的范围:0≤ ROTZ ≤360
示例(HDevelop)
*目标:使用非标准校准对象进行校准 *读取相机内部参数的起始值 read_cam_par('campar.dat',CameraParam) *(读取3D世界点[WorldPointsX,WorldPointsY,WorldPointsZ], *提取相应的2D图像点[PixelsRow,PixelsColumn]) *任务:为外部摄像机参数创建起始值,即*校准图像中校准对象的姿势 *第一张图片:标定物体放置在0.5和0.1之间*位于相机坐标系下方 *方向“从左向右读取”:旋转30度*围绕相机的光轴(z轴), *然后围绕新的y轴倾斜10度 create_pose(0.1,0.0,0.5,30,10,0,'Rp + T','abg','point',StartPose1) *(累积StartPoses中的所有姿势= [StartPose1,StartPose2,...]) *执行校准 camera_calibration(WorldPointsX,WorldPointsY,WorldPointsZ,\ PixelsRow,PixelsColumn,CameraParam,StartPoses,\ 'pose',FinalCamParam,FinalPoses,错误)
结果
如果所有参数值都正确,则create_pose返回2(H_MSG_TRUE)。如有必要,将引发异常。
可能的继任者
备择方案
也可以看看

