Python을 통해 결과를 계산하기

현재 최신 버전 (2.1.1)에 대한 매뉴얼을 보고 계십니다. 다른 버전에 액세스하려면 페이지 오른쪽 상단 모서리에 있는 '버전 전환' 버튼을 클릭하세요.

■ 현재 사용하고 있는 제품의 버전이 확실하지 않은 경우에는 언제든지 당사 기술 지원팀에 문의하시기 바랍니다.

기능

이 스텝에서는 Python을 통해 사용자 정의 스크립트를 실행하고 계산 결과를 Mech-MSR로 출력할 수 있습니다.

이 스텝의 특징은 다음과 같습니다.

  • 멀티스레드 사용을 지원합니다.

  • Python 스크립트는 실시간으로 로드될 수 있습니다.

  • C++와 Python 간에 데이터를 전송할 때 여러 데이터 유형의 변환을 지원합니다.

  • Python 측에서 Mech-MSR로 로그 리디렉션을 지원합니다.

응용 시나리오

사용자 정의 계산이 필요한 경우 사용자는 이 스텝을 사용하여 작성된 Python 스크립트를 실행하여 측정 솔루션을 단순화할 수 있습니다.

입력 및 출력

  • 입력: 입력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다.

  • 출력: 출력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다.

이번 스텝의 입출력 포트의 데이터 유형은 이전 스텝과 이후 스텝의 입출력 포트의 데이터 유형에 따라 결정될 수 있습니다.

설치 및 사용

설치 방법

Mech-MSR에는 Python 3.9.13과 일반적으로 사용되는 두 가지 Python 라이브러리인 NumPy 및 OpenCV가 내장되어 있습니다. '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 xxx 명령(xxx는 Python 라이브러리의 이름)을 실행하여 해당 Python 라이브러리를 다운로드하고 설치합니다.

    install python library

사용 방법

Python 스크립트를 준비한 후 이 스텝을 다음과 같이 사용하십시오(각 파라미터에 대한 설명은 파라미터 설명 부분 참조).

  1. 입력/출력 포트의 데이터 유형을 설정합니다. 이전 또는 이후 스텝의 입력/출력 포트의 데이터 유형에 따라 입력 포트출력 포트의 데이터 유형을 입력합니다.

  2. Python 스크립트 경로를 설정합니다. 스크립트 파일 경로에서 로드할 스크립트의 경로를 선택합니다.

  3. 호출할 함수의 이름을 설정합니다. 스크립트 파일 경로가 지정되면 이 스텝에서는 스크립트의 함수 이름을 자동으로 검색하고 호출할 함수 이름의 드롭다운 목록에서 호출할 함수 이름을 선택합니다.

  4. 스텝을 실행합니다.

Python 스크립트를 작성할 때 데이터를 얻기 위해 스크립트에 명령문을 작성하지 않고도 Mech-MSR 데이터를 처리하는 함수를 직접 작성할 수 있습니다.

사용 시 주의사항

Python 스크립트를 작성하고 이 스텝에서 스크립트를 실행할 때 다음 문제에 주의하십시오.

타사 라이브러리 사용 권장

Mech-MSR에서 Python 스크립트를 실행하는 것은 Python 환경에서 스크립트를 직접 실행하는 것과 다르기 때문에 일부 Python 라이브러리가 성공적으로 설치되지 않거나 설치 후 제대로 작동하지 않을 수 있으므로 타사 라이브러리를 사용하는 것이 좋습니다.

NumPy 라이브러리 사용

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)에서 이러한 사전 정의된 모듈을 찾을 수 있습니다. 이러한 모듈은 다음 세 가지 유형의 데이터를 처리하는 데 사용할 수 있습니다.

  • 표면 데이터

    • 설명: 일반적으로 뎁스 맵과 광도 이미지를 포함하여 물체 표면의 스캔 데이터를 나타냅니다.

    • 포트 유형: 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]

(처음 세 값은 각각 X, Y, Z 좌표를 나타내며, 마지막 네 값은 회전을 쿼터니언 형식으로 [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]

(처음 두 값은 각각 X, Y 좌표를 나타내며, 세 번째 값은 각도를 의미합니다.)

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_8UC1, CV_8UC3, CV_16UC1, CV_16UC3, CV_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]]

(각 배열에서 세 숫자는 각각 점의 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]]

(각 배열에서 처음 세 값은 점의 X, Y, Z 좌표이고, 마지막 세 값은 각각 법선 벡터의 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]]

(각 배열에서 처음 세 값은 점의 X, Y, Z 좌표이고, 마지막 세 값은 각각 점의 빨간색, 녹색, 파란색 구성 요소입니다.)

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), 보정값, 설정된 상한(Max) 및 하한(Min) 값 등이 포함됩니다.

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)

오류 분석

일반적인 오류 메시지와 해결 방법은 오류 코드 리스트를 참조하세요.

이 페이지가 도움이 되었습니까?

다음 방법을 통해 피드백을 보내주실 수 있습니다:

저희는 귀하의 개인정보를 소중히 다룹니다.

당사 웹사이트는 최상의 사용자 경험을 제공하기 위해 쿠키를 사용하고 있습니다. "모두 수락"을 클릭하시면 쿠키 사용에 동의하시는 것이며, "모두 거부"를 클릭하시면 이 웹사이트 방문 시 귀하의 정보가 추적되거나 기억되지 않도록 단일 쿠키만 사용됩니다.