Halcon 3D create_pose

一、简介

如下:

create_pose (9, 0, 0, 90, 90, 0, 'Rp+T', 'gba', 'point', Pose1)
create_pose (-2, 0, 0, 90, 90, 0, 'Rp+T', 'gba', 'point', Pose2)

gen_plane_object_model_3d (Pose1, [-1,-1,1,1] * 90, [-1,1,1,-1] * 90, IntersectionPlane)
gen_plane_object_model_3d (Pose2, [-1,-1,1,1] * 90, [-1,1,1,-1] * 90, IntersectionPlane1)

这段这个create_pose,一直知道是三维的位姿,但是我不理解为啥要这么设置,同时也不知道有什么用,多后续的作用是什么,今天就一起来看一直这个,参考的博客是:halcon算子:create_pose-halcon标定-少有人走的路

从勇哥这里学到的很多东西,希望勇哥能带我们走向巅峰。

二、算子解释 

create_pose  创建3D姿太

create_pose(::TransX,TransY,TransZ,RotX,RotY,RotZ,OrderOfTransform,OrderOfRotation,ViewOfTransform:Pose)

TransX, TransY和TransZ分别指定沿x轴,y轴和z轴的平移,
RotX, RotY和 RotZ描述旋转

平移的很好理解,但是旋转的我记得有好几种方式

方向表示(旋转)

HALCON允许您使用参数OrderOfRotation在其中三个中进行选择:如果传递值'gba',则旋转将通过以下围绕三个轴的旋转链来描述(有关旋转矩阵的内容, 请参见hom_mat3d_rotate

1、Rgba=Rx*Ry*Rz   按照Yaw-Pitch-Roll约定 ,可以理解为 首先绕着z轴旋转,然后绕着“旧” y轴旋转,最后绕着“旧” x轴旋转,如下:

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)

下面更加简明

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

Rabg在文献中被称为“ Roll-Pitch-Yaw 翻滚-偏航-仰俯”惯例

Rabg=Rz*Ry*Rx

 请注意,这些3D姿势可能是模棱两可的,这意味着同构转换矩阵可以具有多个姿势表示形式。例如,对于 , 以下姿势对应于相同的齐次变换矩阵: 

扫描二维码关注公众号,回复: 14377405 查看本文章

 对应的齐次变换矩阵

可以使用运算pose_to_hom_mat3d得与姿势相对应的齐次变换矩阵。在标准定义中,以下是齐次变换矩阵,可以将其分解为两个单独的矩阵,一个矩阵用于平移(H(t)),另一个矩阵用于旋转(H(R)):

上图Rabg 写错了,是Rgba

pose_to_hom_mat3d(ObjInCameraPose, cam_H_cal)将 3D 姿态 Pose
(例如外部相机参数)转换为等效的齐次变换矩阵 HomMat3D

pose_to_hom_mat3d 的一个典型应用是您想要进一步变换姿势,例如,
使用 hom_mat3d_rotate 或 hom_mat3d_translate 旋转或平移它
。在外部相机参数的情况下,如果无法放置校准板以使其坐标系
与所需的世界坐标系重合,则可能需要这样做。


Pose (input_control)  pose → (real / integer)
3D pose.

Number of elements: 7

HomMat3D (output_control)  hom_mat3d → (real)
Equivalent homogeneous transformation matrix.

四元数axis_angle_to_quat (Operator)

* Normalize a vector and create a rotation quaternion
Length := sqrt(AxisX*AxisX+AxisY*AxisY+AxisZ*AxisZ)
AxisX := AxisX/Length
AxisY := AxisY/Length
AxisZ := AxisZ/Length
axis_angle_to_quat (AxisX, AxisY, AxisZ, rad(90), Quaternion)

四元数是复数的扩展。四元数集由 给出。在 HALCON 中,四元数由包含四个元素的元组表示:[x_{0},x_{1},x_{2},x_{3}]。单位四元数可以用来描述旋转,可以使用旋转四元数在 set_paint 中设置 3D 绘图的方向。

 坐标转换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)

非标准姿势定义

如果为OrderOfTransform选择'R(pT)',则创建的位姿对应于以下转换链,即,旋转和平移的顺序相反,而平移取反:

如果为ViewOfTransform选择'coordinate_system',则转换顺序保持不变,但旋转角度将被取反。请注意,与其名称相反,这并不等同于变换坐标系!

 返回的数据结构

返回的Pose 中,前三个元素包含平移参数 TransXTransYTransZ后跟旋转参数RotXRotYRotZ。最后一个元素使用参数OrderOfTransformOrderOfRotation和 ViewOfTransform编码您选择的姿势的表示类型。

下表列出了可能的组合。如前所述,我们建议仅使用OrderOfTransform = 'Rp + T'和 ViewOfTransform ='point'(代码0、2和4)。

create_pose  创建3D位姿
( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewOfTransform : Pose)
输入:

TransX  沿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

TransY 沿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

TransZ  沿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

RotX  绕Rodriguez向量的x轴或x分量旋转(以[°]为单位或无单位)。
默认值:90.0
建议值:0.0、90.0、180.0、270.0
典型值范围:0≤RotX≤360

RotY  绕Rodriguez向量的y轴或y分量旋转(以[°]为单位或无单位)。
默认值:90.0
建议值:0.0、90.0、180.0、270.0
典型值范围:0≤RotY≤360

RotZ  绕Rodriguez矢量的z轴或z分量旋转(以[°]或不带单位)。
默认值:90.0
建议值:0.0、90.0、180.0、270.0
典型值范围:0≤RotZ≤360

OrderOfTransform  旋转和平移的顺序。
默认值:“ Rp + T”
建议值:“ Rp + T”,“ R(p-T)”



OrderOfRotation  旋转值的含义。
默认值:“ gba”
建议值:“ gba”,“ abg”,“ rodriguez”



ViewOfTransfor   变换视角。
默认值:“point”
建议值:“ point(点)”,“ coordinate_system(坐标系)”
//===========================================================================
输出:

Pose
3D姿势。
元素数:7

三、案例

create_pose (9, 0, 0, 90, 90, 0, 'Rp+T', 'gba', 'point', Pose1)
create_pose (-200, 0, 0, 90, 90, 0, 'Rp+T', 'gba', 'point', Pose2)

gen_plane_object_model_3d (Pose1, [-1,-1,1,1] * 90, [-1,1,1,-1] * 90, IntersectionPlane)
gen_plane_object_model_3d (Pose2, [-1,-1,1,1] * 90, [-1,1,1,-1] * 90, IntersectionPlane1)

visualize_object_model_3d (WindowHandle, [TriangulatedObjectModel3D,IntersectionPlane,IntersectionPlane1], [], [], ['disp_pose'], ['true'], [], [], [], PoseOut1)
intersect_plane_object_model_3d (TriangulatedObjectModel3D, Pose1, ObjectModel3DIntersection1)
intersect_plane_object_model_3d (TriangulatedObjectModel3D, Pose2, ObjectModel3DIntersection2)

猜你喜欢

转载自blog.csdn.net/weixin_39354845/article/details/125796603