LineOperation 线段处理工具

LineOperation算子用于对 Line 以及 Pose 对象进行一些 3D 几何运算。

type 功能
PointToLineDistance 计算点(以 Pose 形式给出)到直线的距离,并给出垂足和垂线段。
LineCrossPoint 求两条直线交点或者两条异面直线距离最近处的中间点。
PoseStepByLine 过点( 以 Pose 形式给出) 作直线的平行线,该平行线长度由算子参数给出注意,上述直线方向,由给定线段 Line 的 pose1 指向 pose2 。
LineProjectionAngle 求一条线段在 3 个空间基坐标面 (Oxy 、Oxz 、Oyz) 下的投影角度。
LineCrossAngle 求两条线之间的夹角角度。夹角角度起点为 Line1 的 P2 ,角度终点为 Line2 的 P2。

PointToLineDistance

将 LineOperation 算子的 类型 属性选择 PointToLineDistance,用于计算点 (以 Pose 形式给出) 到直线的距离,并给出垂足和垂线段。

注意:上述垂足 Pose ,仅有 xyz 数值是有效值,而三个旋转角全部同输入 Pose 保持一致。

算子参数

  • 垂直线/vertical_line:设置垂线段 Line 在 3D 视图中的可视化属性。

    • icon_visOn 打开线段可视化。

    • icon_visOff 关闭线段可视化。

    • icon_color 设置线段的颜色。取值范围:[-2,360] 。默认值:60 。

    • icon_linewidth 设置线段的线宽。取值范围:[0,100] 。默认值:1 。

  • 垂直点/vertical_point:设置垂足 Pose 在 3D 视图中的可视化属性。

    • icon_visOn 打开 pose 可视化。

    • icon_visOff 关闭 pose 可视化。

    • icon_size 设置 pose 的尺寸大小。取值范围:[0.001,10] 。默认值:0.1。

  • 距离/distance:设置垂线段到垂足的距离曝光属性。 打开后可用于与交互面板中输出工具——“文本框”控件绑定。

    • icon_visOn 打开 distance 曝光。

    • icon_visOff 关闭 distance 曝光。

数据信号输入输出

输入:

  • line

    • 数据类型:Line

    • 输入内容:线段

  • point

    • 数据类型:Pose

    • 输入内容:点(仅使用 Pose 的 xyz )

输出:

  • vertical_line

    • 数据类型:Line

    • 输出内容:以输入点和垂足点为端点的垂线段

  • vertical_point

    • 数据类型:Pose

    • 输出内容:垂足

  • distance

    • 数据类型:String

    • 输出内容:点到直线的距离

功能演示

使用 LineOperation 算子中 PointToLineDistance 求点到直线的距离。

步骤1:算子准备

添加 Trigger 、Emit(4个) 、LineOperation 算子至算子图。

步骤2:设置算子参数

  1. 设置 Emit 算子参数:

    • 类型 → Pose

    • 坐标 → 0.1 0 0 0 0 1

    • 坐标 → icon_visOn 可视

  2. 设置 Emit_1 算子参数:

    • 类型 → Pose

    • 坐标 → -0.1 0.2 0 0 1 0

    • 坐标 → icon_visOn 可视

  3. 设置 Emit_2 算子参数:

    • 类型 → Pose

    • 坐标 → 0.3 0.2 0 0 0 1

    • 坐标 → icon_visOn 可视

  4. 设置 Emit_3 算子参数:

    • 类型 → Line

    • 线段 → icon_visOn 可视

  5. 设置 LineOperation 算子参数:

    • 类型 → PointToLineDistance

    • 垂直线 → icon_visOn 可视

    • 垂直点→ icon_visOn 可视

步骤3:连接算子

3D_LineOperation_PointToLineDistance_nodese

步骤4:运行

点击 RVS 运行按钮,触发 Trigger 算子。

运行结果

结果显示如下,分别显示 Emit / Emit_1 / Emit_2 生成的 pose ,Emit_3 生成的线段,LineOperation 的 Vertical_line 、vertical_point 。

3D_LineOperation_PointToLineDistance_result

LineCrossPoint

将 LineOperation 算子的 类型 属性选择 LineCrossPoint ,用于求两条直线交点或者两条异面直线距离最近处的中间点。

算子参数

  • 最大距离/max_distance:距离阈值。当两条直线之间的最短距离小于该阈值时,则算子触发failed信号。

  • 中垂线中点/cross_point:对 cross_point 输出端口的 Pose 进行显示控制,默认为关闭状态,参数介绍如下所示。

  • line1中垂线交点/line1_point:对 line1_point 输出端口的 Pose 进行显示控制,默认为关闭状态,参数介绍如下所示。

  • line2中垂线交点/line2_point:对 line2_point 输出端口的 Pose 进行显示控制,默认为关闭状态,参数介绍如下所示。

    • icon_visOn 打开 pose 可视化。

    • icon_visOff 关闭 pose 可视化。

    • icon_size 设置 pose 的尺寸大小。取值范围:[0.001,10] 。默认值:0.1 。

数据信号输入输出

输入:

  • line1

    • 数据类型:Line

    • 输入内容:线段1

  • line2

    • 数据类型:Line

    • 输入内容:线段2

输出:

  • cross_point

    • 数据类型:Pose

    • 输出内容:两条空间直线的“交点”。异面直线不相交时,则为两条直线相距最近点的中点。

  • line1_point

    • 数据类型:Pose

    • 输出内容:两条空间直线的“交点”。异面直线不相交时,则为直线line1上的相距最近点。

  • line2_point

    • 数据类型:Pose

    • 输出内容:两条空间直线的“交点”。异面直线不相交时,则为直线line2上的相距最近点。

    注意,上述三个Pose输出仅有 xyz 数值是有效值,而三个旋转角全部是 0。

功能演示

使用 LineOperation 算子中 LineCrossPoint 求加载点云中两条直线角点或者两条异面直线距离最近处的中间点。

步骤1:算子准备

添加 Trigger、Emit 、Load 、FindElement (2个) 、LineOperation 、GeometryProbe 、(2个)、WaitAllTriggers 算子至算子图。

步骤2:设置算子参数

  1. 设置 Emit算子参数:

    • 类型 → cube

    • 坐标 → 0.199179 0.26519 0.092586 2.61142 -2.82994 3.07943

    • 宽度 → 0.02

    • 高度 → 0.01

    • 深度 → 0.005

  2. 设置 Load 算子参数:

    • 类型 → PointCloud

    • 文件 → icon_more → 选择点云文件名( example_data/pointcloud/cloud.pcd )

  3. 设置 LineOperation 算子参数:

    • 类型 → LineCrossPoint

    • 最大距离→ 0.003

    • 中垂线中点 → icon_visOn 可视 → icon_size 0.01

  4. 设置 FindElement 算子参数:

    • 类型 → Line

    • 最大迭代次数 → 1000

    • 距离阈值 → 0.0001

    • 线段长度 → 0.1

    • 线段 → icon_visOn 可视

  5. 设置 FindElement_1 算子参数:

    • 类型 → Line

    • 最大迭代次数 → 1000

    • 距离阈值 → 0.0001

    • 线段长度 → 0.1

    • 线段 → icon_visOn 可视

  6. 设置 GeometryProbe 算子参数

    • 类型 → Line

    • 探测方向 → y-

    • 圆锥体顶角度 → 45

    • 有效点百分比 → 10

    • 步进值 → 5

    • 线段点云 → icon_visOn 可视

  7. 设置 GeometryProbe_1 算子参数

    • 类型 → Line

    • 探测方向 → x-

    • 圆锥体顶角度 → 45

    • 有效点百分比→ 10

    • 步进值 → 5

    • 线段点云 → icon_visOn 可视

  8. 设置 WaitAllTriggers 算子参数:输入数量 → 2

步骤3:连接算子

3D_LineOperation_LineCrossPoint_nodes

步骤4:运行

点击 RVS 运行按钮,触发 Trigger 算子。

运行结果

结果如下图所示,两条直线为 FindElement 中属性 line 的可视化结果,蓝色点云和绿色点云为 GeometryProbe 算子的属性 line_cloud 可视化结果。pose 为LineOperation 算子的可视化结果。

3D_LineOperation_LineCrossPoint_result

PoseStepByLine

将 LineOperation 算子的 类型 属性选择 PoseStepByLine ,过点( 以 Pose 形式给出 )作直线的平行线,该平行线长度由算子参数给出。

注意:上述直线方向,由给定线段 Line 的 pose1 指向 pose2 。

算子参数

  • 步长距离/step_distance:延伸长度。

  • 方向与参考线段一致/direction_same_with_line:默认不勾选,此时输出的 pose 的3个旋转角同输入 pose 保持一致。

    • True:输出的 pose 方向轴的 x 轴同线段方向保持一致。

    • False:输出的 pose 的3个旋转角同输入 pose 保持一致。

  • 坐标/pose:对 pose 输出端口的 Pose 进行显示控制。

    • icon_visOn 打开 pose 可视化。

    • icon_visOff 关闭 pose 可视化。

    • icon_size 设置 pose 的尺寸大小。取值范围:[0.001,10] 。默认值:0.1 。

数据信号输入输出

输入:

  • pose

    • 数据类型:Pose

    • 输入内容:pose 坐标

  • ref_line

    • 数据类型:Line

    • 输入内容:参考线段

输出:

  • pose

    • 数据类型:Pose

    • 输出内容:延伸点

功能演示

使用 LineOperation 算子中 PoseStepByLine 作直线的平行线。

步骤1:算子准备

添加 Trigger 、Emit (4个) 、LineOperation 算子至算子图。

步骤2:设置算子参数

  1. 设置 Emit 算子参数:

    • 算子名称 → Emit_Pose

    • 类型 → Pose

    • 坐标 → 0.1 0 0 1.5708 0 0

    • 坐标 → icon_visOn 可视 → icon_size 0.05

  2. 设置 Emit_1 算子参数:

    • 算子名称 → Emit_Pose1

    • 类型 → Pose

    • 坐标 → 0 0 0 0 0 0

    • 坐标 → icon_visOn 可视 → icon_size 0.05

  3. 设置 Emit_2 算子参数:

    • 算子名称 → Emit_Pose2

    • 类型 → Pose

    • 坐标 → 0 0 0.1 0 0 1

    • 坐标 → icon_visOn 可视 → icon_size 0.05

  4. 设置 Emit_3 算子参数:

    • 算子名称 → Emit_line

    • 类型 → Line

    • 线段 → icon_visOn 可视

  5. 设置 LineOperation 算子参数:

    • 类型 → PoseStepByLine

    • 步长距离 → 0.1

    • 坐标 → icon_visOn 可视 → icon_size 0.05

步骤3:连接算子

3D_LineOperation_PoseStepByLine_nodes

步骤4:运行

点击 RVS 运行按钮,触发 Trigger 算子。

运行结果

  1. Emit 算子的 Pose 或 Line 的可视化,LineOperation 算子的 pose 可视化,结果显示如下。

3D_LineOperation_PoseStepByLine_result1

  1. 勾选 LineOperation 算子的 direction_same_with_line 参数,重新触发 XML 中的 trigger 算子,运行结果显示如下。(可见下图右上角的结果 pose 的红色 x 轴已经沿着线段方向 )

3D_LineOperation_PoseStepByLine_result2

LineProjectionAngle

将 LineOperation 算子的 类型 属性选择 LineProjectAngle ,求一条线段在3个空间基坐标面 ( Oxy 、Oxz 、Oyz ) 下的投影角度。

算子参数

  • 与xy|xz|yz平面夹角/angle_xy|xz|yz:设置 angle_xy|xz|yz 投影角度在 3D 视图中的可视化属性。

    • icon_visOn 打开投影角度可视化。

    • icon_visOff 关闭投影角度可视化。

    • icon_color 设置 3D 视图中投影角度的颜色。取值范围:[-2,360] 。默认值:60 。

    • icon_linewidth 设置投影角度线的线宽。取值范围:[0,100] 。默认值:1 。

    • icon_label 标注角显示。

数据信号输入输出

输入:

  • line

    • 数据类型:Line

    • 输入内容:线段

输出:

  • angle_xy

    • 数据类型:Angle

    • 输出内容:原线段在 Oxy 平面上的投影角度

  • angle_xz

    • 数据类型:Angle

    • 输出内容:原线段在 Oxz 平面上的投影角度

  • angle_yz

    • 数据类型:Angle

    • 输出内容:原线段在 Oyz 平面上的投影角度

      说明:RVS 中的 Angle 数据在数学形式上是三个点,第一和第三个点表征两条边,中间点是角点;​Line 在数学形式上是两个点,第一个点为起点,第二个点为终点;该算子输出的三个 Angle 的角点全部是原始输入线段的起点。

功能演示

使用 LineOperation 算子中 LineProjectionAngle 求一条线段在3个空间基坐标面 ( Oxy 、Oxz 、Oyz ) 下的投影角度。

步骤1:算子准备

添加 Trigger 、Emit(3个) 、LineOperation 算子至算子图。

步骤2:设置算子参数

  1. 设置 Emit 算子参数:

    • 类型 → Pose

    • 坐标 → 0 0 0 0 0 0

  2. 设置 Emit_1 算子参数:

    • 类型 → Pose

    • 坐标 → 0.03 0.1 0.05 0 1 0

  3. 设置 Emit_2 算子参数:

    • 类型 → Line

    • 线段 → icon_visOn 可视

  4. 设置 LineOperation 算子参数:

    • 类型 → LineProjectionAngle

    • 与XY平面夹角 → icon_visOn 可视

    • 与XZ平面夹角 → icon_visOn 可视

    • 与YZ平面夹角 → icon_visOn 可视

步骤3:连接算子

3D_LineOperation_LineProjectionAngle_nodes

步骤4:运行

点击 RVS 运行按钮,触发 Trigger 算子。

运行结果

如下图所示,展示了 LineOperation 算子的结果。

  • 与XY平面夹角

3D_LIneOperation_LineProjectionAngle_result1

  • 与XZ平面夹角

3D_LIneOperation_LineProjectionAngle_result2

  • 与YZ平面夹角

3D_LIneOperation_LineProjectionAngle_result3

LineCrossAngle

将 LineOperation 算子的 类型 属性选择 LineCrossAngle ,求两条线之间的夹角角度。夹角角度起点为 Line1 的 P2 ,角度终点为 Line2 的 P2。

算子参数

  • cross_angle:设置 cross_angle 角度在 3D 视图中的可视化属性。

    • icon_visOn 打开 cross_angle 角度可视化。

    • icon_visOff 关闭 cross_angle 角度可视化。

    • icon_color 设置 3D 视图中 cross_angle 角度的颜色。取值范围:[-2,360] 。默认值:60 。

      • icon_linewidth 设置 cross_angle 角度线的线宽。取值范围:[0,100] 。默认值:1 。

      • icon_label 标注角显示。

数据信号输入输出

输入:

line1

  • 数据类型:Line

  • 输入内容:线段

line2

  • 数据类型:Line

  • 输入内容:线段

输出:

cross_angle

  • 数据类型:Angle

  • 输出内容:两条线之间的夹角角度

功能演示

使用 LineOperation 算子中 LineCrossAngle 求两条线的夹角角度。

步骤1:算子准备

添加 Trigger 、Emit(2个) 、LineOperation 算子至算子图。

步骤2:设置算子参数

  1. 设置 Emit 算子参数:

    • 类型 → Line

    • P1 → -1 0 0 0 0 0

    • P2 → 1 0 0 0 0 0

    • 线段 → icon_visOn 可视

  2. 设置 Emit_1 算子参数:

    • 类型 → Line

    • P1 → 0 0 0 0 0 0

    • P2 → 1 1 0 0 0 0

    • 线段 → icon_visOn 可视

  3. 设置 LineOperation 算子参数:

    • 类型 → LineCrossAngle

    • cross_angle → icon_visOn 可视

步骤3:连接算子

3d_LineOperation_nodes

步骤4:运行

点击 RVS 运行按钮,触发 Trigger 算子。

运行结果

如下图所示,左图是生Emit 算子生成的两条线段。右图为 LineCrossAngle 计算出的两条线段的夹角。

3d_LineOperation_result