Pythonを使用して結果を計算

現在ご覧いただいているのは最新版の内容です(V2.2.1)。異なるバージョンを参照する場合は、画面右上のボタンから切り替えが可能です。

■ ご利用中のバージョンが分からない場合や、サポートが必要な場合はお気軽にサポート窓口までご連絡ください。

機能

Pythonを介してカスタマイズのスクリプトを実行し、計算結果をMech-Visionに出力します。

このステップの特徴は以下の通りです。

  • マルチスレッドでの使用をサポートします。

  • Pythonスクリプトをリアルタイムに読み込むことができます。

  • C++側とPython側でデータを転送する際に、複数のデータ型変換をサポートします。

  • Python側からのログをMech-Visionにリダイレクトすることに対応します。

使用シーン

カスタマイズの計算が必要な場合は、このステップを使用してビジョンソリューションを簡素化するPythonスクリプトを実行することができます。

入力と出力

  • 入力: 入力ポート パラメータに入力されるデータ型によって決定されます。ポートの名前変更はサポートされていません。

  • 出力: 出力ポート パラメータに入力されるデータ型によって決定されます。ポートの名前変更はサポートされていません。

前後のステップの入力/出力ポートのデータ型に応じて、このステップの入力/出力ポートのデータ型も決定できます。

Pythonライブラリのインストールとステップの使用

Pythonライブラリのインストール方法

Mech-VisionにはPython 3.9.13、およびNumPyとOpenCVという2つのよく使用される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スクリプトを準備したら、このステップを以下のように使用します。各パラメータの詳細については、パラメータ説明 をご参照ください。

  1. 入出力ポートのデータ型を設定します。入力ポート出力ポート のデータ型は、前後のステップの入出力ポートのデータ型に従って、または必要に応じて入力してください。

  2. Pythonスクリプトのパスを設定します。読み込むスクリプトのパスを スクリプトファイルのパス で選択します。

  3. 呼び出される関数の名前を設定します。スクリプトパスを選択すると、このステップではスクリプト内の関数名が自動的に取得されます。次に、呼び出される関数名 のドロップダウンリストで必要なスクリプト関数名を選択する必要があります。

  4. ステップを実行します。

  • Pythonスクリプトを記述する際は、データ処理のための関数を直接記述し、スクリプト内でMech-Visionのデータを取得するためのステートメントを記述する必要はありません。スクリプトの具体的な形式は、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 は0次元の数値リストを、Number[] は1次元の数値リストを表します。

パラメータ説明

パラメータ 説明

入力ポート

パラメータ説明:このパラメータは、ステップの入力ポートのデータ型を設定するために使用されます。入力データ型は、対応する順序で呼び出された関数にパラメータとして渡されます。
初期値:空

出力ポート

パラメータ説明:このパラメータは、ステップの出力ポートのデータ型を設定するために使用されます。関数が返すデータは、対応する順序でステップに返され、対応するデータ型に従って解析されることになります。
初期値:空

スクリプトファイルのパス

パラメータ説明:このパラメータは、読み込むスクリプトのファイルパスを選択するために使用されます。
初期値:空

呼び出される関数名

パラメータ説明:このパラメータは、呼び出されるスクリプト関数の名前を設定するために使用されます。
初期値:空

現在対応しているデータ型は以下の通りです。

ステップのポートタイプ Pythonで使用されるデータ型 入力データの例

Pose[]

リスト

[[10, 20, 30, 0.951, 0.255, 0.168, 0.045]], [10, 20, 30, 0.951, 0.255, 0.168, 0.045]]
各データグループ内の最初の3つの値は座標値を表し、後の4つの値は四元数を表します。

Pose2D[]

リスト

[[0, 0, 0]], [2, 0, 120]]
各データグループ内の最初の2つの値は座標のX値とY値を表し、3番目の値は角度を表します。

Number[]

リスト

[1.1, 2, 999.9, -22]

String[]

文字列

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

Image

8ビット符号なし整数(1チャンネルまたは3チャンネル)
16ビット符号なし整数(1チャンネルまたは3チャンネル)
32ビット浮動小数点数(1チャンネル)

1チャンネルのグレースケール画像を例として、入力データは以下の通りです。
\[[ 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]]
各データグループ内の3つの数値は、それぞれ点の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

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プロジェクトを下図に示します。各出力ポートのデータフローをダブルクリックして、出力結果を確認できます。

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 パスに保存されます。

この情報は役に立ちましたか?

ご意見・ご要望がございましたら、以下よりお寄せください:

Mech-Mindは、お客様のプライバシーを重視しています

このサイトでは最高の体験を提供するために Cookie を使用しています。サイトの閲覧を続ける場合、Cookie の使用に同意したことになります。「拒否する」を選択すると、このサイトを訪れた際に追跡や記憶が行われないように単独の Cookie が使用されます。