使用Python计算结果

您正在查看最新版本(V2.2.1)的文档。如果您想查阅其他版本的文档,可以点击页面右上角“切换版本”按钮进行切换。

■ 如果您不确定当前使用的产品是哪个版本,请随时联系梅卡曼德技术支持

功能描述

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

该步骤特点如下:

  • 支持多线程使用;

  • 可实时加载 Python 脚本;

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

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

使用场景

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

输入与输出

  • 输入:输入端口参数中填入的数据类型决定,不支持对端口重命名。

  • 输出:输出端口参数中填入的数据类型决定,不支持对端口重命名。

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

Python 库安装和步骤使用

Python 库安装方法

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

  1. 进入 Mech-Vision 的 Python 安装目录。

    enter the python installation path
  2. 在 Python 安装目录下的空白处,按住Shift的同时单击鼠标右键,然后选择在此处打开 Powershell 窗口,打开 Powershell 命令行工具。

    open powershell
  3. 在Powershell命令行工具执行“.\python.exe -m pip install xxx”命令(“xxx”为 Python 库的名称),下载安装对应的 Python 库。

    input command in powershell

因网络问题导致 Python 库安装失败时,可参考Python 库安装失败怎么办章节进行解决。

步骤使用方法

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

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

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

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

  4. 运行步骤。

  • 编写 Python 脚本时,直接编写用于处理数据的函数即可,无需在脚本内编写获取Mech-Vision数据的语句。脚本的具体形式可参考 Python 例程

  • 当 Python 脚本发生变化时,如需该步骤实时运行最新 Python 脚本,可在步骤参数中勾选运行标志下的重新加载所需文件。勾选后,运行步骤时将仅重新加载脚本路径参数处选择的 Python 脚本,不会重新加载所选 Python 脚本导入的其他 Python 脚本。

从Mech-Vision 1.8.0起,“使用Python计算结果”步骤程序运行方式由串行改为并行(与 Python 中的 threading 模块效果一致)。在脚本内调用个别不支持并行运行的相机 API(例如枚举相机)时,需在该 API 调用处加锁。

使用注意事项

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

使用合理的命名方式

Python 脚本的文件名只能包含汉字、字母、数字和下划线。例如,calc_result.py、test_01.py。不能包含“-”,否则无法调用函数名称。

建议使用第三方库

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

注意使用 NumPy 库

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

导入预定义模块

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

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

你可以在软件安装目录下(例如:C:/Mech-Vision & Mech-Viz-2.2.1/Mech-Vision/python/Lib/py_module ) 找到预定义模块。预定义模块可用于处理以下数据:

  • 点云数据

    • 描述:表示点云数据的类,包含点云的坐标、法向量、颜色等信息。

    • 端口类型:PointCloud

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

      使用说明
      from mmind_pointcloud import *        # must be imported
      
      def create_simple_pointcloud():
      
          xyz = np.array(                   # xyz is the basic data of the point cloud and must exist.
              [
                  [0.0, 0.0, 0.0],
                  [1.0, 0.0, 0.0],
                  [0.0, 1.0, 0.0],
                  [0.0, 0.0, 1.0],
                  [1.0, 1.0, 1.0],
              ],
              dtype=np.float32,
          )
      
          normals = np.array(               # The number of normals values ​​must be the same as the number of xyz points.
              [
                  [0.0, 0.0, 1.0],
                  [0.0, 0.0, 1.0],
                  [0.0, 0.0, 1.0],
                  [0.0, 0.0, 1.0],
                  [0.0, 0.0, 1.0],
              ],
              dtype=np.float32,
          )
      
          colors = np.array(                # The number of colors values ​​must be the same as the number of xyz points.
              [
                  0xFF0000,
                  0x00FF00,
                  0x0000FF,
                  0xFFFF00,
                  0xFFFFFF,
              ],
              dtype=np.uint32,
          )
      
          intensity = np.array([10, 20, 30, 40, 50], dtype=np.uint8)
      
          cloud = PyPointCloud(
              xyz=xyz,
              normals=normals,
              colors=colors,
              intensity=intensity,
              uniformColor=0,
              width=0,  # unorganized
          )
      
          return cloud

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

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

  • 默认数据维度为 0 的: Image; PointCloud; Number; Bool; Index; String

  • 默认数据维度为 1 的: Pose; Pose2D; Size3D

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

例如:Number 表示零维数值列表,Number[] 表示一维数值列表。

参数说明

参数 解释

输入端口

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

默认值:空。

输出端口

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

默认值:空。

脚本路径

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

默认值:空。

调用函数名称

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

默认值:空。

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

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

Pose[]

列表

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

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

Pose2D[]

列表

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

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

Number[]

列表

[1.1, 2, 999.9, -22]

String[]

字符串

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

Image

8 位无符号整数(单通道或三通道)

16 位无符号整数(单通道或三通道)

32 位浮点数(单通道)

以单通道灰度图为例,输入数据如下:

[[ 78 205 67 120 207], [136 201 46 187 166], [224 10 43 179 166], [253 245 29 1 122], [128 99 156 241 252]]

PointCloud

查看预定义模块

Size3D[]

64 位浮点数

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

(每组数据中,三个数值分别表示 X、Y、Z 方向上的尺寸。)

Index[]

整数

[45, 10, 90]

Bool[]

布尔

[True, False, True]

从Mech-Vision 2.2.1起,“使用Python计算结果”步骤的点云端口类型统一为“PointCloud”,端口配置时不再区分“PointCloud/XYZ”、“PointCloud/XYZNormal”、“PointCloud/XYZRGB”。用户如需使用点云端口,可将端口类型设置为“PointCloud”,并在 Python 脚本中编写点云数据。

Python 例程

为了方便用户了解该步骤端口类型,并使用该步骤运行 Python 脚本,本节通过介绍 Python 例程来辅助用户学习、使用该步骤。

快速入门

通过 Python 脚本输出一种类型数据

下面例程中定义了输出一种类型数据的函数,可参考 “使用Python计算结果”步骤使用方法 在该步骤中调用该函数。

def get_doublelist():
    return [1.1,22,3.3]

该例程对应的Mech-Vision工程如下图所示,可通过双击输出端口对应的数据流来查看输出结果。

single output project

通过 Python 脚本输出多类型数据

下面例程中定义了输出多类型数据的函数,可参考 “使用Python计算结果”步骤使用方法 在该步骤中调用该函数。

import numpy as np

def example_of_basic_portTypes():
    numList = [1.1, 2, 999.9, -22]
    indexList = [45, 10, 90]
    boolList = [True, False, True]
    strList = ['string_1', 'string_2', 'string_3']
    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, 0.785]]
    size3dList = [[2.5, 5, 0.001], [6, 5, 0.02]]
    return numList, indexList, boolList, strList, poseList, pose2dList, size3dList

该例程对应的Mech-Vision工程如下图所示,可通过双击各输出端口对应的数据流来查看输出结果。

multi output project

通过两个“使用Python计算结果”步骤对数据进行处理

例程1定义了输出数值列表的函数,例程2定义了对各数值列表内数值进行求和计算的函数。

可参考 “使用Python计算结果”步骤使用方法 在该步骤中调用如下例程,并进行步骤连接,对输入的数值列表进行求和运算。

例程 1:

def get_numberlist_1():
    return [[1, 2, 3],[4,5,6]]

例程 2:

def cal_number_list(nums_list):
    sums = []
    for nums in nums_list:
        sum = 0
        for num in nums:
            sum += num
        sums.append(sum)
    return [sums]

该例程对应的Mech-Vision工程如下图所示,可通过双击各输出端口对应的数据流来查看输出结果。

single sum output project

通过多个“使用Python计算结果”步骤对数据进行处理

例程1定义了输出数值列表的函数,例程2定义了输出布尔值列表的函数,例程3用于在数值列表中添加数值“9999”,在布尔值列表中添加“False”,然后输出新的数值列表和布尔值列表。

可参考 “使用Python计算结果”步骤使用方法 在该步骤中调用如下例程,对多个输入数据进行处理。

例程 1:

def get_doublelist():
    return [1.1,22,3.3]

例程 2:

def get_bool_list():
    return [[True,False],[True,True],[False,False]]

例程 3:

def print_multi_values(numberList, boolList):
	numberList.append(9999)
	boolList.append(False)
	return numberList, boolList

该例程对应的Mech-Vision工程如下图所示,可通过双击各输出端口对应的数据流来查看输出结果。

multi output process project

实际应用

对工程运行时产生的异常数据进行保存

在实际项目中,工程运行时可能会产生各种问题,用户可以通过Mech-Vision中的数据保存功能,并结合自定义的 Python 脚本对异常的数据进行保存,用于排查问题,提高视觉系统稳定性。

具体操作过程如下。

  1. 开启数据保存功能。

    在Mech-Vision工程助手中开启保存数据与参数功能,当工程运行发生错误弹窗时,原始数据将被保存至工程文件夹/data/error_data路径下。

  2. 编写 Python 脚本。

    以判断“3D匹配”输出位姿结果是否为空为例,Python 例程如下:

    def abnormal_output_detection(outputs):
        if len(outputs) == 0:
            raise Exception("NO RESULT!!!")
        else:
            pass
  3. 参考 “使用Python计算结果”步骤使用方法 在“使用Python计算结果”步骤中调用上述例程,然后将该步骤连接至“3D匹配”后。

    运行工程后,当“3D匹配”输出位姿结果为空时,将出现弹窗提示,且异常数据将被保存至工程文件夹/data/error_data路径下。

该页面是否有帮助?

可以通过以下方式反馈意见:

我们重视您的隐私

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