Python을 통해 결과를 계산하기
기능 설명
이 스텝에서는 Python을 통해 사용자 정의 스크립트를 실행하고 계산 결과를 Mech-Vision으로 출력할 수 있습니다.
이 스텝의 특징은 다음과 같습니다.
-
멀티스레드 사용을 지원합니다.
-
Python 스크립트는 실시간으로 로드될 수 있습니다.
-
C++와 Python 간에 데이터를 전송할 때 여러 데이터 유형의 변환을 지원합니다.
-
Python 측에서 Mech-Vision으로 로그 리디렉션을 지원합니다.
입력 및 출력
-
입력: * *입력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다. 포트 이름 바꾸기는 지원되지 않습니다.
-
출력: * *출력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다. 포트 이름 바꾸기는 지원되지 않습니다.
이번 스텝의 입출력 포트의 데이터 유형은 이전 스텝과 이후 스텝의 입출력 포트의 데이터 유형에 따라 결정될 수 있습니다. |
설치 및 사용
설치 방법
Mech-Vision에는 Python 3.9.13이 내장되어 있으므로, 이 스텝에서는 소프트웨어의 내장 환경을 사용합니다. 사용 중에 Python 라이브러리가 누락된 경우 누락된 Python 라이브러리를 Mech-Vision에 내장된 Python 환경에 설치해야 합니다. 설치 방법은 다음과 같습니다.
-
명령 프롬프트를 엽니다.
-
명령줄에서 "cd" 명령을 사용하여 경로를 Mech-Vision의 Python 디렉터리로 전환합니다.
-
python -m pip install Python 라이브러리 명령을 실행하여 해당 Python 라이브러리를 다운로드하여 설치합니다.
Mech-Vision에 일반적으로 사용되는 두 가지 Python 라이브러리인 NumPy와 OpenCV가 내장되어 있습니다. |
사용 방법
Python 스크립트를 준비한 후 이 스텝을 다음과 같이 사용하십시오(각 파라미터에 대한 설명은 파라미터 설명 참조).
-
입력/출력 포트의 데이터 유형을 설정합니다. 이전 또는 이후 스텝의 입력/출력 포트의 데이터 유형에 따라 입력 포트 및 출력 포트의 데이터 유형을 입력하십시오.
-
Python 스크립트 경로를 설정합니다. 스크립트 파일 경로에서 로드할 스크립트의 경로를 선택합니다.
-
호출할 함수의 이름을 설정합니다. 스크립트 파일 경로가 지정되면 이 스텝에서는 스크립트의 함수 이름을 자동으로 검색하고 호출할 함수 이름의 드롭다운 목록에서 호출할 함수 이름을 선택할 수 있습니다.
-
스텝을 실행합니다.
|
Mech-Vision 1.8.0부터 "Python을 통해 결과를 계산하기" 스텝의 실행 모드가 직렬에서 병렬로 변경됩니다(Python의 threading 모듈과 동일한 효과). 스크립트 내에서 병렬 실행을 지원하지 않는 카메라 API를 호출하는 경우(예: 카메라 열거) 해당 API 호출 위치에 잠금을 추가해야 합니다. |
사용 시 주의사항
Python 스크립트를 작성하고 이 스텝에서 스크립트를 실행할 때 다음 문제에 주의하십시오.
타사 라이브러리 사용 권장
Mech-Vision에서 Python 스크립트를 실행하는 것은 Python 환경에서 스크립트를 직접 실행하는 것과 다르기 때문에 일부 Python 라이브러리는 성공적으로 설치되지 않거나 설치 후 제대로 작동하지 않을 수 있으므로 타사 라이브러리를 사용하는 것이 좋습니다.
NumPy 라이브러리 사용
NumPy 라이브러리는 일부 복잡한 형식의 데이터를 지원하는 데 사용됩니다. 파라미터 유형이 NumPy인데 NumPy를 가져오지 않은 경우 오류가 발생할 수 있습니다. 따라서 스크립트 시작 부분에 import numpy를 추가해야 합니다.
스크립트 작성 시 데이터 차원을 주의
Python 스크립트 작성 시 스텝의 각 포트에 해당하는 데이터의 차원을 참고하시기 바랍니다.
-
디폴트 데이터 차원이 0: Image; Cloud(XYZ); Cloud(XYZ-Normal)
-
디폴트 데이터 차원이 1: NumberList; BoolList; IndexList; StringList;Shape2DList
-
디폴트 데이터 차원이 2: PoseList; Pose2DList; Size3DList
데이터 차원을 추가하려면 데이터 유형 뒤에 "[]"를 사용하십시오. 예를 들어 NumberList의 데이터 차원은 1이고 NumberList[]의 데이터 차원은 2입니다. |
파라미터 설명
- 입력 포트
-
설명: 이 파라미터는 입력 포트의 데이터 유형을 지정하는 데 사용됩니다. 입력한 데이터 유형은 해당 순서에 따라 호출된 함수에 파라미터로 전달됩니다.
기본값: 비어 있음.
- 출력 포트
-
설명: 이 파라미터는 출력 포트의 데이터 유형을 지정하는 데 사용됩니다. 함수에서 반환된 데이터는 해당 순서대로 스텝에 반환되며 해당 데이터 유형에 따라 구문 분석됩니다.
기본값: 비어 있음.
현재 지원되는 데이터 유형은 다음과 같습니다.
스텝 포트 유형 | 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] |
Shape2DList |
리스트 |
['{"theta": 0,"x": 988.89129638671875,"y": 422.89129638671875}', '{"theta": 0,"x": 988.89129638671875,"y": 422.89129638671875}'] |
StringList |
문자열 |
['string_1', 'string_2', 'string_3'] |
Image |
8비트 부호 없는 정수/64비트 부동 소수점 숫자 |
데이터 경로 |
Cloud(XYZ) |
배열(Array) |
포인트 클라우드 데이터 |
Cloud(XYZ-Normal) |
배열(Array) |
법선 방향이 있는 포인트 클라우드 데이터 |
Cloud(XYZ-RGB) |
배열(Array) |
컬러 포인트 클라우드 데이터 |
Size3DList |
64비트 부동 소수점 숫자 |
[[2.5, 5, 0.001]], [6, 5, 0.02]]
|
IndexList |
정수 |
[45, 10, 90] |
BoolList |
부울 |
[True, False, True] |
- 스크립트 파일 경로
-
설명: 이 파라미터는 로드할 스크립트의 파일 경로를 선택하는 데 사용됩니다.
기본값: 비어 있음.
- 호출되는 함수 이름
-
파라미터 설명: 이 파라미터는 호출할 스크립트 함수의 이름을 설정하는 데 사용됩니다.
기본값: 비어 있음.
Python 예제 프로그램
이 스텝의 학습 및 활용을 쉽게 하기 위해 다음 부분에서는 스텝 포트 유형에 익숙해지는 데 도움이 되는 일부 Python 프로그램을 제공합니다.
퀵 가이드
Python 스크립트를 사용하여 한 가지 유형의 데이터 출력
한 가지 형태의 데이터를 출력하는 함수는 아래에 정의되어 있습니다. “Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 스텝에서 이 함수를 호출하십시오.
def get_doublelist():
return [1.1,22,3.3]
이 기능에 해당하는 Mech-Vision 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.
Python 스크립트를 사용하여 여러 유형의 데이터 출력
여러 유형의 데이터를 출력하는 함수는 아래 프로그램에 정의되어 있습니다. “Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 스텝에서 이 함수를 호출하십시오.
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 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.
두 가지 "Python을 통해 결과를 계산하기” 스텝으로 데이터를 처리
숫자 값 목록을 출력하는 함수는 프로그램 1에 정의되어 있습니다. 각 숫자 목록 내의 값의 합을 계산하는 함수는 프로그램 2에 정의되어 있습니다.
“Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 이 스텝에서 다음 프로그램을 호출하고 스텝을 연결하여 입력한 숫자 목록에 대해 총 연산을 수행 할 수 있습니다.
프로그램 1:
def get_numberlist_1():
return [[1, 2, 3],[4,5,6]]
프로그램 2:
def cal_number_list(nums_list):
sums = [align="center"]
for nums in nums_list:
sum = 0
for num in nums:
sum += num
sums.append(sum)
return [sums]
이 기능에 해당하는 Mech-Vision 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.
여러 "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 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.
실제 응용
프로젝트 실행 중 생성된 이상 데이터 저장
실제 응용에서는 프로젝트에 다양한 오류가 발생할 수 있습니다. Mech-Vision의 데이터 저장 기능과 함께 사용자 정의 Python 스크립트를 사용하여 문제 해결을 위해 비정상적인 데이터를 저장할 수 있으므로 비전 시스템의 안정성이 향상됩니다.
구체적인 작업은 다음과 같습니다.
-
데이터 저장 기능 활성화
Mech-Vision 프로젝트 지원에서 데이터 및 파라미터 저장을 활성화합니다. 프로젝트 실행 시 오류가 발생하면 원시 데이터는 프로젝트 폴더/data/error_data에 저장됩니다.
-
Python 스크립트 작성
“3D 매칭” 과정을 통해 출력된 포즈 결과가 null인지 판단하는 Python 예제 프로그램은 다음과 같습니다.
def abnormal_output_detection(outputs): if len(outputs) == 0: raise Exception("NO RESULT!!!") else: pass
-
“Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 “Python을 통해 결과를 계산하기”여 스텝에서 위의 프로그램을 호출하여 이 스텝을 “3D 매칭” 다음에 연결해주십시오.
프로젝트 실행 후 “3D 매칭”으로 출력된 포즈 결과가 null인 경우 에러 메시지가 뜨며, 비정상적인 데이터는 프로젝트 폴더/data/error_data 폴더에 저장됩니다.
입력한 포인트 클라우드의 Z 값을 기반으로 의사 컬러 포인트 클라우드 생성
출력한 포인트 클라우드에 텍스처 정보가 없는 경우 사용자 정의 Python 스크립트를 사용하여 입력 포인트 클라우드의 Z 값을 기반으로 의사 컬러 포인트 클라우드를 생성하여 출력을 더 잘 시각화할 수 있습니다.
처리 과정은 다음과 같이 요약될 수 있습니다.
먼저 Z 값은 0에서 255 사이의 값으로 매핑되어 그레이스케일 값을 얻습니다. 그런 다음 OpenCV를 사용하여 그레이스케일 값을 RGB 값으로 매핑하므로 의사 컬러 포인트 클라우드가 생성될 수 있습니다.
Python 예제 프로그램은 다음과 같습니다.
import math
import cv2
import numpy as np
def generate_color_point_could_by_depth(point_cloud):
x = point_cloud[:, 0]
y = point_cloud[:, 1]
z = point_cloud[:, 2]
z_min = np.min(z)
z_max = np.max(z)
if math.isclose(z_max - z_min, 0):
return np.column_stack((x, y, z, np.full(z.shape, 0xFFFFFFFF, np.uint32).view(np.float32)))
color = 255 * (z - z_min) / (z_max - z_min)
color = cv2.applyColorMap(color.astype(np.uint8), cv2.COLORMAP_JET)
color = np.squeeze(color).astype(np.uint32)
color = (0xFF000000 | (color[:, 0] << 16) | (color[:, 1] << 8) | color[:, 2]).view(np.float32)
return np.column_stack((x, y, z, color))