Pythonを使用して結果を計算
機能
Pythonを介してカスタマイズのスクリプトを実行し、計算結果をMech-Visionに出力します。
このステップの特徴は以下の通りです。
-
マルチスレッドでの使用をサポートします。
-
Pythonスクリプトをリアルタイムに読み込むことができます。
-
C++側とPython側でデータを転送する際に、複数のデータ型変換をサポートします。
-
Python側からのログをMech-Visionにリダイレクトすることに対応します。
入力と出力
-
入力: 入力ポート パラメータに入力されるデータ型によって決定されます。ポートの名前変更はサポートされていません。
-
出力: 出力ポート パラメータに入力されるデータ型によって決定されます。ポートの名前変更はサポートされていません。
|
前後のステップの入力/出力ポートのデータ型に応じて、このステップの入力/出力ポートのデータ型も決定できます。 |
Pythonライブラリのインストールとステップの使用
Pythonライブラリのインストール方法
Mech-VisionにはPython 3.9.13、およびNumPyとOpenCVという2つのよく使用される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スクリプトのパスを設定します。読み込むスクリプトのパスを スクリプトファイルのパス で選択します。
-
呼び出される関数の名前を設定します。スクリプトパスを選択すると、このステップではスクリプト内の関数名が自動的に取得されます。次に、呼び出される関数名 のドロップダウンリストで必要なスクリプト関数名を選択する必要があります。
-
ステップを実行します。
|
|
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で使用されるデータ型 | 入力データの例 |
|---|---|---|
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]]
|
Number[] |
リスト |
[1.1, 2, 999.9, -22] |
String[] |
文字列 |
['string_1', 'string_2', 'string_3'] |
Image |
8ビット符号なし整数(1チャンネルまたは3チャンネル)
|
1チャンネルのグレースケール画像を例として、入力データは以下の通りです。
|
PointCloud |
定義済みモジュール を参照 |
|
Size3D[] |
64ビット浮動小数点数 |
[[2.5, 5, 0.001]], [6, 5, 0.02]]
|
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プロジェクトを下図に示します。各出力ポートのデータフローをダブルクリックして、出力結果を確認できます。
2つの「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 パスに保存されます。