Pythonを使用して結果を計算

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

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

機能

Pythonでユーザーが作成したカスタムスクリプトを実行し、その計算結果をMech-MSRに出力します。

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

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

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

  • C++とPython間でデータを相互に転送する際、さまざまなデータ型の変換をサポートします。

  • Python側のログをMech-MSRにリダイレクトすることが可能です。

使用シーン

カスタム計算が必要な場合、このステップを使用して作成したPythonスクリプトを実行し、測定ソリューションを簡略化することができます。

入力と出力

  • 入力入力ポート パラメータに設定されたデータ型によって決定されます。

  • 出力出力ポート パラメータに設定されたデータ型によって決定されます。

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

インストールと使用

インストール方法

Mech-MSRにはPython 3.9.13と、NumPyおよびOpenCVという2つの一般的なPythonライブラリが内蔵されています。「Pythonを使用して結果を計算」ステップを実行する際は、ソフトウェア内蔵のPython環境が使用されます。使用中にPythonライブラリが不足している場合は、必要なライブラリをMech-MSRに内蔵されたPython環境にインストールする必要があります。インストール方法は以下の通りです。

  1. Mech-MSRのPythonインストールディレクトリに移動します。例えば:C:\App\Mech-MSR-2.1.1\python

  2. 現在のディレクトリ内でShiftキーを押しながら右クリックし、右クリックメニューから PowerShellウィンドウをここで開く を選択します。

  3. Windows PowerShellウィンドウで、python -m pip install xxxxxxはインストールするPythonライブラリの名前)コマンドを実行し、対応するPythonライブラリをダウンロードしてインストールします。

    install python library

使用方法

Pythonスクリプトの準備が整ったら、このステップを以下の手順で使用します。各パラメータの詳細については、パラメータ説明 をご参照ください。

  1. 入出力ポートのデータ型を設定します。前後のステップの入出力ポートのデータ型や実際のニーズに応じて、入力ポート出力ポート のデータ型を設定します。

  2. Pythonスクリプトのパスを設定します。スクリプトファイルのパス を指定し、読み込む必要があるスクリプトを選択します。

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

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

Pythonスクリプトを作成する際、データを処理する関数をそのまま記述すればよく、Mech-MSRのデータを取得するためのコードは記述する必要はありません。

使用上の注意事項

Pythonスクリプトを作成し、このステップで実行する際の注意事項は以下の通りです。

サードパーティライブラリの使用を推奨

Mech-MSRでPythonスクリプトを実行する際、通常のPython環境とは異なる動作をする可能性があります。一部のPythonライブラリがインストールできなかったり、インストール後に使用できなかったりすることがあるため、サードパーティライブラリの使用を推奨します。

NumPyライブラリの使用に注意

Pythonがサポートするデータ型の中で、比較的複雑な型はNumPyライブラリを中間フォーマットとして使用します。あるパラメータがNumPyの配列型である場合、NumPyをインポートしていないとエラーが発生します。そのため、スクリプトの最初に import numpy を追加する必要があります。

NumPyのバージョンは1.19.3以上、2.0.0未満のみサポートされています。推奨バージョンは1.22.4です。2.0.0以上のバージョンを使用すると、互換性の問題が発生し、このステップが正常に動作しない可能性があります。

事前定義モジュールのインポート

このステップの入力または出力ポートタイプがSurface、Profile、またはShape3Dの場合、事前定義モジュールをインポートする必要があります。

Mech-MSRソフトウェア内でPythonスクリプトを使用してこれらのデータタイプ(Surface、Profile、Shape3D)を処理する際には、対応する事前定義モジュールをインポートする必要があります。これにより、Pythonがこれらのデータ構造を認識し、操作できるようになります。モジュールをインポートしない場合、スクリプトはこれらのクラスを認識できず、実行時にエラーが発生します。

これらの事前定義モジュールは、ソフトウェアのインストールディレクトリ(例:C:\Mech-MSR-2.1.1\python\Lib\py_module)内にあります。事前定義モジュールは、以下の3種類のデータを処理するために使用されます。

  • サーフェスデータ

    • 説明:対象物表面のスキャンデータを表し、通常は深度画像と強度画像を含みます。

    • ポートタイプ: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
  • 幾何学的特徴

    • 説明:点、直線、平面、円などの幾何学的特徴を表します。

    • ポートタイプ:Shape3D

    • インポートするPythonスクリプトのモジュール:mmind_featuremmind_util

      使用説明(Shape3D []を例として)
      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のデータ型 入出力ポート名 サンプルデータ例

Pose

(カスタム型)

py::list または np.array

Pose

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

最初の3つの数値はそれぞれ X、Y、Z 座標を表し、後の4つの数値は回転情報を表します。回転は四元数で表され、順序は [w, x, y, z] です。

Pose []

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

Pose2D

(カスタム型)

py::list または np.array

Pose2D

[2, 0, 120]

最初の2つの数値はそれぞれ X、Y 座標を表し、3つ目の数値は角度を表します。

Pose2D []

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

Number

float または np.float64

Number

233

Number []

[1.1, 2, 999.9, -22]

String

str

String

'string_1'

String []

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

Index

int

Index

1

Index []

[45, 10, 90]

Bool

bool

Bool

True

Bool []

[True, False, True]

Surface

(カスタム型)

事前定義モジュール を参照

Surface

サーフェスデータであり、通常は深度画像と強度画像を含みます。

Profile

(カスタム型)

事前定義モジュール を参照

Profile

プロファイルデータです。

Shape3D

(カスタム型)

事前定義モジュール を参照

Shape3D

PyPoint3D()、PyLine3D()、PyPlane3D()、PyCircle3D()

PyPoint3D、PyLine3D、PyPlane3D、PyCircle3Dはカスタム型であり、それぞれ点、直線、平面、円といった幾何学的特徴を表します。

Shape3D []

[PyPoint3D(), PyPoint3D(), …​]
[PyLine3D(), PyLine3D(), …​]
[PyPlane3D(), PyPlane3D(), …​]
[PyCircle3D(), PyCircle3D(), …​]

Image

CV_8UC1CV_8UC3CV_16UC1CV_16UC3CV_32FC1

Image

単チャンネルのグレースケール画像(CV_8UC1):[[ 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]]

Cloud(XYZ)

(カスタム型)

np.array

Cloud(XYZ)

[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4], [0.3, 0.4, 0.5], [0.4, 0.5, 0.6], [0.5, 0.6, 0.7]]

各データグループ内の3つの数値は、それぞれ点のX、Y、Z座標を表します。

Cloud(XYZ-Normal)

(カスタム型)

np.array

Cloud(XYZ-Normal)

[[0.1, 0.2, 0.3, 0.4, 0.5, 0.6], [0.2, 0.3, 0.4, 0.5, 0.6, 0.7], [0.3, 0.4, 0.5, 0.6, 0.7, 0.8], [0.4, 0.5, 0.6, 0.7, 0.8, 0.9], [0.5, 0.6, 0.7, 0.8, 0.9, 1.0]]

各データグループ内の最初の3つの数値は点のX、Y、Z座標をそれぞれ表し、後の3つの数値は法線のX、Y、Z軸方向の成分をそれぞれ表します。

Cloud(XYZ-RGB)

(カスタム型)

np.array

Cloud(XYZ-RGB)

[[0.1, 0.2, 0.3, 52, 64, 13], [0.2, 0.3, 0.4, 45, 21, 72], [0.3, 0.4, 0.5, 17, 69, 13], [0.4, 0.5, 0.6, 12, 8, 37], [0.5, 0.6, 0.7, 25, 58, 46]]

各データグループ内の最初の3つの数値は点のX、Y、Z座標をそれぞれ表し、後の3つの数値は点の赤、緑、青の成分をそれぞれ表します。

Size3D

(カスタム型)

np.float64

Size3D

[2.5, 5, 0.001]

それぞれ X、Y、Z 方向の寸法を表します。

Size3D []

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

スクリプトパス

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

呼び出される関数名

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

Pythonのサンプルコード

ステップ内で関数を呼び出す方法は、ステップの使用方法 をご参照ください。

Pythonスクリプトによる同じ型データを出力

以下は、単一のデータ型を出力する関数の例です。

def get_bool():
    return True

結果出力 パネルでステップの出力結果を確認できます。

測定項目の出力データの読み込み

以下は、測定項目の出力から測定値、判定結果(OKまたはNG)、補正値、設定された上下限(最小値・最大値)などの情報を取得する例です。

import mmind_measure
# Or use wildcard import
# from mmind_measure import *

def test(numberList, stringList, boolList):

    entries = mmind_measure.measurement_entries_at(1) 	# Calls the function with the port number as the argument.
    # If wildcard import is used (e.g., from mmind_measure import *), the function can be called directly:
    # entries = measurement_entries_at(1)
    print(entries)

    for entry in entries:
        print(entry.observeValue) # Measured value(s)                     (float, str, bool)
        print(entry.judgement)    # Judgment result, OK or NG             (str)
        print(entry.offset)		  # Corrective compensation value         (float)
        print(entry.lowerLimit)   # The set Min for the measurement item  (float)
        print(entry.upperLimit)	  # The set Max for the measurement item  (float)
        print(entry.compensation) # Compensated value(s)                  (float)
        print(entry.entryName)	  # Port name                             (str)

トラブルシューティング

共通のエラー情報と解決方法については、エラーコード一覧 をご参照ください。

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

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

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

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