Pythonを使用して結果を計算

機能

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.0\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 を追加する必要があります。

スクリプト作成時にデータ型の次元に注意

Pythonスクリプトを作成する際には、ステップポートの基本データ型の次元にも注意が必要です。

  • デフォルトのデータ次元が0: Image、Cloud(XYZ)、Cloud(XYZ-Normal)、Surface、Profile。

  • デフォルトのデータ次元が1: NumberList、BoolList、IndexList、StringList、Shape3DList。

  • デフォルトのデータ次元が2: PoseList、Pose2DList、Size3DList。

データ型の後に「[]」を追加すると、データの次元を増やすことができます。

例えば、NumberListは1次元の数値リストを示し、NumberList[]は2次元の数値リストを示します。

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

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

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

これらの事前定義モジュールは、ソフトウェアのインストールディレクトリ(例:C:\Mech-MSR-2.1.0\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
      python
  • プロファイルデータ

    • 説明:プロファイルデータを表します。プロファイルは点で構成され、各点の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
      python
  • 幾何学的特徴

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

    • ポートタイプ:Shape3DList

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

      使用説明
      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

パラメータ説明

入力ポート

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

初期値:空

出力ポート

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

初期値:空

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

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

PoseList

リスト

[[10, 20, 30, 0.951, 0.255, 0.168, 0.045]], [10, 20, 30, 0.951, 0.255, 0.168, 0.045]]
最初の3つの数値は座標値、後の4つの値は四元数

Pose2DList

リスト

[[0, 0, 0]], [2, 0, 120]]
最初の2つの数値は座標のX値とY値、3番目の数値は角度

NumberList

リスト

[1.1, 2, 999.9, -22]

StringList

文字列

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

Image

8ビット符号なし整数 / 64ビット浮動小数点数

画像データ

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)

配列

[[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)

配列

[[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つの数値は点の赤、緑、青の成分をそれぞれ表します。

Size3DList

64ビット浮動小数点数

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

最初の2つの数値は幅と高さ、3番目の数値はピクセルの長さ

IndexList

整数

[45, 10, 90]

BoolList

ブール値

[True, False, True]

Surface

カスタムクラス

サービスデータ(深度画像と強度画像を含む)

Profile

カスタムクラス

プロファイルデータ

Shape3DList

リスト

[PyPoint3D(), PyPoint3D(), …​]
[PyLine3D(), PyLine3D(), …​]
[PyPlane3D(), PyPlane3D(), …​]
[PyCircle3D(), PyCircle3D(), …​]
PyPoint3D、PyLine3D、PyPlane3D、PyCircle3Dはカスタムクラスであり、それぞれ点、直線、平面、および円という幾何学的特徴を表します。

スクリプトパス

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

呼び出される関数名

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

トラブルシューティング

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

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

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

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

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