Python을 통해 결과를 계산하기
기능
이 스텝에서는 Python을 통해 사용자 정의 스크립트를 실행하고 계산 결과를 Mech-MSR로 출력할 수 있습니다.
이 스텝의 특징은 다음과 같습니다.
-
멀티스레드 사용을 지원합니다.
-
Python 스크립트는 실시간으로 로드될 수 있습니다.
-
C++와 Python 간에 데이터를 전송할 때 여러 데이터 유형의 변환을 지원합니다.
-
Python 측에서 Mech-MSR로 로그 리디렉션을 지원합니다.
입력 및 출력
-
입력: 입력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다.
-
출력: 출력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다.
이번 스텝의 입출력 포트의 데이터 유형은 이전 스텝과 이후 스텝의 입출력 포트의 데이터 유형에 따라 결정될 수 있습니다. |
설치 및 사용
설치 방법
Mech-MSR에는 Python 3.9.13과 일반적으로 사용되는 두 가지 Python 라이브러리인 NumPy 및 OpenCV가 내장되어 있습니다. 'Python을 통해 결과를 계산하기' 스텝이 실행되는 동안 내장된 Python 환경을 사용합니다. 사용 중에 누락된 Python 라이브러리가 있는 경우Mech-MSR의 내장 Python 환경에 라이브러리를 설치해야 합니다. 설치 방법은 다음과 같습니다.
-
Mech-MSR의 Python이 설치된 디렉터리로 이동합니다. 예를 들어 C:\App\Mech-MSR-2.1.0 \python 입니다.
-
현재 디렉터리에서 Shift키를 누른 채 마우스 오른쪽 버튼을 클릭한 다음 메뉴에서 여기에 PowerShell 창 열기를 클릭합니다.
-
Windows PowerShell 창에서
python -m pip install xxx
명령(xxx
는 Python 라이브러리의 이름)을 실행하여 해당 Python 라이브러리를 다운로드하고 설치합니다.
사용 방법
Python 스크립트를 준비한 후 이 스텝을 다음과 같이 사용하십시오(각 파라미터에 대한 설명은 파라미터 설명 부분 참조).
-
입력/출력 포트의 데이터 유형을 설정합니다. 이전 또는 이후 스텝의 입력/출력 포트의 데이터 유형에 따라 입력 포트 및 출력 포트의 데이터 유형을 입력합니다.
-
Python 스크립트 경로를 설정합니다. 스크립트 파일 경로에서 로드할 스크립트의 경로를 선택합니다.
-
호출할 함수의 이름을 설정합니다. 스크립트 파일 경로가 지정되면 이 스텝에서는 스크립트의 함수 이름을 자동으로 검색하고 호출할 함수 이름의 드롭다운 목록에서 호출할 함수 이름을 선택합니다.
-
스텝을 실행합니다.
Python 스크립트를 작성할 때 데이터를 얻기 위해 스크립트에 명령문을 작성하지 않고도 Mech-MSR 데이터를 처리하는 함수를 직접 작성할 수 있습니다. |
사용 시 주의사항
Python 스크립트를 작성하고 이 스텝에서 스크립트를 실행할 때 다음 문제에 주의하십시오.
타사 라이브러리 사용 권장
Mech-MSR에서 Python 스크립트를 실행하는 것은 Python 환경에서 스크립트를 직접 실행하는 것과 다르기 때문에 일부 Python 라이브러리가 성공적으로 설치되지 않거나 설치 후 제대로 작동하지 않을 수 있으므로 타사 라이브러리를 사용하는 것이 좋습니다.
NumPy 라이브러리 사용
NumPy 라이브러리는 일부 복잡한 형식의 데이터를 지원하는 데 사용됩니다. 파라미터 유형이 NumPy인데 NumPy를 가져오지 않은 경우 오류가 발생할 수 있습니다. 따라서 스크립트 시작 부분에 import numpy를 추가해야 합니다.
스크립트 작성 시 데이터 차원 주의
Python 스크립트 작성 시 스텝의 각 포트에 해당하는 데이터의 차원을 참고하시기 바랍니다.
-
기본 데이터 차원이 0: Image, Cloud(XYZ), Cloud(XYZ-Normal), Surface, Profile
-
기본 데이터 차원이 1: Image, Cloud(XYZ), Cloud(XYZ-Normal), Surface, Profile
-
기본 데이터 차원이 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)에서 이러한 사전 정의된 모듈을 찾을 수 있습니다. 이러한 모듈은 다음 세 가지 유형의 데이터를 처리하는 데 사용할 수 있습니다.
-
표면 데이터
-
설명: 일반적으로 뎁스 맵과 광도 이미지를 포함하여 물체 표면의 스캔 데이터를 나타냅니다.
-
포트 유형: 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_feature
및mmind_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]]
|
Pose2DList |
리스트 |
[[0, 0, 0]], [2, 0, 120]]
|
NumberList |
리스트 |
[1.1, 2, 999.9, -22] |
StringList |
문자열 |
['string_1', 'string_2', 'string_3'] |
Image |
8비트 부호 없는 정수/64비트 부동 소수점 숫자 |
이미지 데이터 |
Cloud(XYZ) |
배열(Array) |
[[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) |
배열(Array) |
[[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) |
배열(Array) |
[[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 좌표이고, 마지막 세 값은 각각 점의 빨간색, 녹색, 파란색 구성 요소입니다.) |
Size3DList |
64비트 부동 소수점 숫자 |
[[2.5, 5, 0.001], [6, 5, 0.02]] (각 배열에서 처음 두 값은 너비와 높이이고 세 번째 값은 각 픽셀의 길이) |
IndexList |
정수 |
[45, 10, 90] |
BoolList |
부울 |
[True, False, True] |
Surface |
사용자 정의 |
표면 데이터 (뎁스 맵 및 광도 이미지 포함) |
Profile |
사용자 정의 |
프로파일 데이터 |
Shape3DList |
리스트 |
[PyPoint3D(), PyPoint3D(), …]
|
- 스크립트 파일 경로
-
파라미터 설명: 이 파라미터는 로드할 스크립트의 파일 경로를 선택하는 데 사용됩니다.
- 호출되는 함수 이름
-
파라미터 설명: 이 파라미터는 호출할 스크립트 함수의 이름을 설정하는 데 사용됩니다.
오류 분석
일반적인 오류 메시지와 해결 방법은 오류 코드 리스트를 참조하세요.