使用Python计算结果
功能描述
该步骤可通过 Python 运行用户自定义的脚本,并将计算结果输出到 Mech-Vision。
该步骤特点如下:
-
支持多线程使用;
-
可实时加载 Python 脚本;
-
在 C++ 和 Python 端互相传输数据时,支持多种数据类型的转化;
-
支持将 Python 端的日志重定向到 Mech-Vision 中。
输入与输出
-
输入:由输入端口参数中填入的数据类型决定,不支持对端口重命名。
-
输出:由输出端口参数中填入的数据类型决定,不支持对端口重命名。
|
可根据前后步骤的输入/输出端口数据类型,决定该步骤输入/输出端口的数据类型。 |
Python 库安装和步骤使用
Python 库安装方法
Mech-Vision 中内置了 Python 3.9.13 和 NumPy 、OpenCV 两个常用的 Python 库,“使用Python计算结果”步骤运行时将使用软件内置的 Python 环境。若在使用过程中出现缺少 Python 库的情况,需要将所缺少的 Python 库安装在 Mech-Vision 内置的 Python 环境中。安装方法如下:
-
进入 Mech-Vision 的 Python 安装目录。
-
在 Python 安装目录下的空白处,按住Shift的同时单击鼠标右键,然后选择在此处打开 Powershell 窗口,打开 Powershell 命令行工具。
-
在Powershell命令行工具执行“.\python.exe -m pip install xxx”命令(“xxx”为 Python 库的名称),下载安装对应的 Python 库。
|
因网络问题导致 Python 库安装失败时,可参考Python 库安装失败怎么办章节进行解决。 |
步骤使用方法
准备好 Python 脚本后,该步骤的使用方法如下(关于各参数的解释可参考 参数说明 ):
-
设置输入/输出端口数据类型。根据前后步骤的输入/输出端口数据类型,或根据实际需求,填写输入端口和输出端口的数据类型。
-
设置 Python 脚本路径。在脚本路径处选择需要加载的脚本的路径。
-
设置调用函数的名称。当选择脚本路径后,该步骤将自动获取该脚本内的函数名称,然后需在调用函数名称处的下拉栏中选择需要调用的脚本函数名称。
-
运行步骤。
|
|
从Mech-Vision 1.8.0起,“使用Python计算结果”步骤程序运行方式由串行改为并行(与 Python 中的 threading 模块效果一致)。在脚本内调用个别不支持并行运行的相机 API(例如枚举相机)时,需在该 API 调用处加锁。 |
使用注意事项
编写并使用该步骤运行 Python 脚本时的注意事项如下。
建议使用第三方库
由于在 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 中使用的数据类型 | 输入数据示例 |
|---|---|---|
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工程如下图所示,可通过双击输出端口对应的数据流来查看输出结果。
通过 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工程如下图所示,可通过双击各输出端口对应的数据流来查看输出结果。
通过两个“使用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工程如下图所示,可通过双击各输出端口对应的数据流来查看输出结果。
通过多个“使用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工程如下图所示,可通过双击各输出端口对应的数据流来查看输出结果。
实际应用
对工程运行时产生的异常数据进行保存
在实际项目中,工程运行时可能会产生各种问题,用户可以通过Mech-Vision中的数据保存功能,并结合自定义的 Python 脚本对异常的数据进行保存,用于排查问题,提高视觉系统稳定性。
具体操作过程如下。
-
开启数据保存功能。
在Mech-Vision工程助手中开启保存数据与参数功能,当工程运行发生错误弹窗时,原始数据将被保存至工程文件夹/data/error_data路径下。
-
编写 Python 脚本。
以判断“3D匹配”输出位姿结果是否为空为例,Python 例程如下:
def abnormal_output_detection(outputs): if len(outputs) == 0: raise Exception("NO RESULT!!!") else: pass -
参考 “使用Python计算结果”步骤使用方法 在“使用Python计算结果”步骤中调用上述例程,然后将该步骤连接至“3D匹配”后。
运行工程后,当“3D匹配”输出位姿结果为空时,将出现弹窗提示,且异常数据将被保存至工程文件夹/data/error_data路径下。