使用Python计算结果

功能描述

该步骤可通过Python运行用户自定义的脚本,并将计算结果输出到Mech-MSR。

该步骤特点如下:

  • 支持多线程使用;

  • 可实时加载Python脚本;

  • 在C++和Python端互相传输数据时,支持多种数据类型的转化;

  • 支持将Python端的日志重定向到Mech-MSR中。

使用场景

当需要进行自定义计算时,用户可使用该步骤运行编写的Python脚本,简化测量方案。

输入与输出

  • 输入:输入端口参数中填入的数据类型决定。

  • 输出:输出端口参数中填入的数据类型决定。

可根据前后步骤的输入/输出端口数据类型,决定该步骤输入/输出端口的数据类型。

安装和使用

安装方法

Mech-MSR中内置了Python 3.9.13 和 NumPy 、OpenCV 两个常用的 Python 库,“使用Python计算结果”步骤运行时将使用软件内置的 Python 环境。若在使用过程中出现缺少 Python 库的情况,需要将所缺少的 Python 库安装在Mech-MSR内置的Python环境中。安装方法如下:

  1. 进入 Mech-MSR 的 Python 安装目录。例如:C:\App\Mech-MSR-2.0.0\python

  2. 在当前目录下,按住Shift键,单击鼠标右键,然后从右键菜单中选择在此处打开 Powershell 窗口选项;

  3. 在 Windows PowerShell 窗口中,执行python -m pip install xxx命令(xxx为 Python 库的名称),下载安装对应的 Python 库。

    install python library
因网络问题导致 Python 库安装失败时,可查看常见问题Python 库安装失败怎么办?进行解决。

使用方法

准备好Python脚本后,该步骤的使用方法如下(关于各参数的解释可参考 参数说明 ):

  1. 设置输入/输出端口数据类型。根据前后步骤的输入/输出端口数据类型,或根据实际需求,填写输入端口输出端口的数据类型;

  2. 设置Python脚本路径。在脚本路径处选择需要加载的脚本的路径;

  3. 设置调用函数的名称。当选择脚本路径后,该步骤将自动获取该脚本内的函数名称,然后需在调用函数名称处的下拉栏中选择需要调用的脚本函数名称;

  4. 运行步骤。

  • 编写Python脚本时,直接编写用于处理数据的函数即可,无需在脚本内编写获取Mech-MSR数据的语句。

  • 当Python脚本发生变化时,如需该步骤实时运行最新Python脚本,可在步骤参数中勾选运行标志下的重新加载所需文件

使用注意事项

编写并使用该步骤运行Python脚本时的注意事项如下。

建议使用第三方库

由于在Mech-MSR中运行Python脚本和在Python环境中运行Python脚本存在差异,可能会导致某些Python库无法安装或安装后无法使用,所以建议使用第三方库。

注意使用NumPy库

在Python支持的数据类型中,其中比较复杂的类型是通过NumPy库来作为中间格式的。若存在某个参数类型是NumPy的数组类型,但却没有导入NumPy,则会发生报错。所以此时需要脚本开头添加import numpy

编写脚本时需注意数据类型的数据维度

编写Python脚本时需要注意步骤端口的基本数据类型本身的数据维度。

  • 默认数据维度为0的: Image、Cloud(XYZ)、Cloud(XYZ-Normal)、Surface、Profile;

  • 默认数据维度为1的: NumberList、BoolList、IndexList、StringList、Shape3DList;

  • 默认数据维度为2的: PoseList、Pose2DList、Size3DList。

在数据类型后添加“[]”符号,表示增加数据维度。

例如:NumberList表示一维数值列表,NumberList[]表示二维数值列表。

导入预定义模块

当该步骤的输入或输出端口类型为 Surface、Profile 或 Shape3DList 时,必须导入预定义模块。

在 Mech-MSR 软件中使用 Python 脚本处理 Surface、Profile、Shape3DList 类型的数据时,应导入相应的预定义模块,以便在运行 Python 脚本时,Python 能够识别并操作这些数据结构。如果未导入相应的模块,脚本将无法识别这些类,运行时会出现错误。

你可以在软件安装目录下(例如:C:\Mech-MSR-2.0.0\python\Lib\py_module)找到这些预定义模块。预定义模块可用于处理以下三种数据:

  • 表面数据

    • 描述:表示对物体表面的扫描数据,通常包括深度图和强度图。

    • 端口类型:Surface

    • 需导入 Python 脚本的模块:mmind_surface

      使用说明
      from mmind_surface import *		# must be imported
      
      def test_surface(surface):
          print(surface) # is a class
          print(type(surface)) # is a class
          print(surface.depth) # is numpy.ndarray (n, m)
          print(surface.intensity) # is numpy.ndarray (n, m)
          print(surface.xResolution)
          print(surface.yResolution)
          print(surface.xOffset)
          print(surface.yOffset)
          print(surface.zOffset)
      
          return surface
      
      
      def test_surfaces(surfaces):
          print(type(surfaces)) # is list
          for surface in surfaces:
              print(type(surface)) # is class
              print(surface.depth)
              print(surface.intensity)
              print(surface.xResolution)
              print(surface.yResolution)
              print(surface.xOffset)
              print(surface.yOffset)
              print(surface.zOffset)
          return surfaces
  • 轮廓线数据

    • 描述:表示轮廓线数据。轮廓线由点构成,包含各点的X、Z值,反映物体一个截面高度的变化。

    • 端口类型:Profile

    • 需导入 Python 脚本的模块:mmind_profile

      使用说明
      from mmind_profile import *		# must be imported
      
      def test_surface(profile):
          print(profile) # is a class
          print(type(profile)) # is a class
          print(profile.points) # is numpy.ndarray (n,2)
          print(profile.yResolution)
          print(profile.xOffset)
          return profile
      
      
      def test_surfaces(profiles):
          print(type(profiles)) # is list
          for profile in profiles:
              print(type(profile)) # is a class
              print(profile.points) # is numpy.ndarray (n,2)
              print(profile.yResolution)
              print(profile.xOffset)
          return profiles
  • 几何特征

    • 描述:表示点、直线、平面、圆等几何特征。

    • 端口类型:Shape3DList

    • 需导入 Python 脚本的模块:mmind_featuremmind_util

      使用说明
      from mmind_util import *		# must be imported
      from mmind_feature import *		# must be imported
      
      def test_shape3dList(point_list, line_list, plane_list, circle_list):
          point = point_list[0]       # class PyPoint3D
          line = line_list[0]         # class PyLine3D
          plane = plane_list[0]       # class PyPlane3D
          circle = circle_list[0]     # class PyCircle3D
      
          p_x = point.x               # number
          p_y = point.y
          p_z = point.z
      
          l_p = line.point            # class PyVector3D
          l_d = line.direction        # class PyVector3D
          print(l_d.x, l_d.y, l_d.z)
      
          p_a = plane.a               # number
          p_b = plane.b
          p_c = plane.c
          p_d = plane.d
      
          c_p = circle.point          # class PyVector3D
          c_r = circle.radius         # number
          c_n = circle.normal         # class PyVector3D
      
      
      def create_shape3dList():
          point1 = PyPoint3D(1.0, 2.0, 3.0)
          point2 = PyPoint3D()
          point2.x = 4.0              # must be a number
          point2.y = 5.0
          point2.z = 6.0
      
          line1 = PyLine3D(PyVector3D(1.0, 1.0, 1.0), PyVector3D(1.0, 1.0, 0.0))
          line2 = PyLine3D()
          line2.point = PyVector3D(1.1, 1.2, 1.3)     # can be PyVector3D or PyPoint3D
          line2.direction.x = 0.0     # must be a number
          line2.direction.y = 1.0
          line2.direction.z = 1.0
      
          plane1 = PyPlane3D(2.0, 0.0, 0.0, 10.0)
          plane2 = PyPlane3D()
          plane2.a = 0.0056           # must be a number
          plane2.b = 0.001
          plane2.c = 0.0023
          plane2.d = -3.22
      
          circle1 = PyCircle3D(point1, 10.0, PyVector3D(0.0, 0.0, 1.0))
          circle2 = PyCircle3D()
          circle2.point = point2      # can be PyVector3D or PyPoint3D
          circle2.radius = 100.0      # must be a number
          circle2.normal = PyVector3D(0.0, 1.0, 0.0)  # must be unit vector
      
          return [point1, point2], [line1, line2], [plane1, plane2], [circle1, circle2]

参数说明

输入端口

参数解释:该参数用于设置该步骤输入端口的数据类型,输入的数据类型将会变为对应顺序的参数传入所调用的函数。

默认值:空。

输出端口

参数解释:该参数用于设置该步骤输出端口的数据类型,函数返回的各数据会按照对应顺序返回给该步骤,并且会按照对应数据类型进行解析。

默认值:空。

目前支持的数据类型如下表所示:

步骤端口类型 Python 中使用的数据类型 输入数据示例

PoseList

列表

[[10, 20, 30, 0.951, 0.255, 0.168, 0.045], [10, 20, 30, 0.951, 0.255, 0.168, 0.045]]

(每组数据中,前三个数值表示坐标值,后四个数值表示四元数。)

Pose2DList

列表

[[0, 0, 0], [2, 0, 120]]

(每组数据中,前两个数值分别表示坐标的 X、Y 值,第三个数值表示角度。)

NumberList

列表

[1.1, 2, 999.9, -22]

StringList

字符串

['string_1', 'string_2', 'string_3']

Image

8 位无符号整数/64 位浮点数

图像数据

Cloud(XYZ)

数组

点云数据

Cloud(XYZ-Normal)

数组

带法向的点云数据

Cloud(XYZ-RGB)

数组

彩色点云数据

Size3DList

64 位浮点数

[[2.5, 5, 0.001], [6, 5, 0.02]]

(每组数据中,前两个数值分别表示宽度、高度,第三个数值表示每个像素的长度。)

IndexList

整数

[45, 10, 90]

BoolList

布尔

[True, False, True]

Surface

自定义类

表面数据,通常包含深度图和强度图。

Profile

自定义类

轮廓线数据

Shape3DList

列表

[PyPoint3D(), PyPoint3D(), …​]

[PyLine3D(), PyLine3D(), …​]

[PyPlane3D(), PyPlane3D(), …​]

[PyCircle3D(), PyCircle3D(), …​]

其中,PyPoint3D、PyLine3D、PyPlane3D、PyCircle3D为自定义类,分别表示点、直线、平面和圆这几种几何特征。

脚本路径

参数解释:该参数用于选择所需要加载的脚本的文件路径。

调用函数名称

参数解释:该参数用于设置被调用的脚本函数名称。

错误排查

查看错误码列表了解通用的错误信息及解决方案。

我们重视您的隐私

我们使用 cookie 为您在我们的网站上提供最佳体验。继续使用该网站即表示您同意使用 cookie。如果您拒绝,将使用一个单独的 cookie 来确保您在访问本网站时不会被跟踪或记住。