2020년 새로운 회사에 이직하게 되면서 python을 사용할 기회?가 생겼다.
보통은 하드웨어 개발을 하면서 시리얼 통신을 이용한 데이터 입출력 및 저장 같은 동작을 코드를 공부하면서 사용하고 있었다.
그러다가 이번에 카메라로 영상을 추가로 함께 저장하면서 데이터를 분석해야 하는 업무가 생겼다.
예전 같으면 랩뷰로 후다닥 동작을 만들고 UI까지 예쁘게 다듬는 수준으로 여유를 부리며 만들 수 있었을텐데, 파(python)린이 수준인 상태에서는 이것조차 굉장히 어렵다...
이번 기회에 하나씩 블로그로 내용을 올리면서 학습하고자 한다.
파이썬은 쓰레드에 대한 뭔가 다른 규칙과 방법들이 있는거 같은데, 아직 이부분에 대해서는 하나씩 동작해보면서 공부해야 할듯 하다.
우선은 오늘은 카메라를 켜고 시리얼로 데이터를 받은 동작까지를 구현해보고자 한다. 이러한 동작을 하기 위해서는 opencv, pyserial이 있어야겠고, 둘을 병렬로 동작시키기 위해 multiprocessing의 process을 사용했다.
예제로는 아래의 2가지 기능을 동시에 동작할 수 있도록 하였다:
1. STM32F429보드에서 1초마다 8bytes 데이터를 날리면, 그 데이터를 받아 print 하기
2. camera 스트리밍
2개의 각 기능을 위한 def 작성한 뒤, process target에 넣어주면 각자가 병렬로 동작한다.
동작을 확인했으니, 다음에는 camera 영상을 저장하는 것과 graph를 그리는 것을 추가로 넣어서 구현해보고자 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import cv2
import time
import serial
from multiprocessing import Process
stm32 = serial.Serial('/dev/tty.usbmodem14203', 115200)
var_range = range(0,8)
def func_cam_stream():
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
def func_serial():
while(True):
y = stm32.read(8)
for i in var_range:
print("%d" % y[i]);
time.sleep(1);
if __name__ == '__main__':
p1 = Process(target=func_cam_stream)
p2 = Process(target=func_serial)
p1.start()
p2.start()
p1.join()
p2.join()
|
cs |
'Python' 카테고리의 다른 글
camera 출력과 serial 통신 동시에 동작하기[2] #opencv#multiprocessing#pyserial (0) | 2020.10.04 |
---|