본문 바로가기
정나우/Jetson

Jetson-OpenCR 간 시리얼 통신하는 법

by 정_나우 2022. 5. 12.

Jetson에서 yolov4를 통해 얻은 정보를 이용하여 다이나믹셀을 제어하기 위해

 

Jetson과 OpenCR 사이의 시리얼 통신하는 법에 대해 알아보겠습니다.

 

OpenCR은 ARM 개발환경을 지원하지 않기 때문에 노트북에서 개발을 한 뒤 ARM에서 업로드하는 방식으로 진행해야 합니다.

 


젯슨에서 데이터를 보내는 코드입니다.

 

우선 serial 라이브러리를 설치해야 합니다.

pip3 install pyserial

 

코드 내용 중 통신 관련 부분만 발췌했습니다.

(이전에 게시한 tensorrt변환 내용 중 trt_yolo.py 내용을 일부 변경한 코드입니다.)

import serial #시리얼 통신용 라이브러리

serial_error = False #serial 통신 체크용

#try-except문을 이용한 Serial 확인 및 열려있는 통신 확인
try:
    try:
        ser = serial.Serial('/dev/ttyACM0',115200,timeout=0.1)
    except:
        serial.Serial("/dev/ttyACM0", 115200).close()
        ser = serial.Serial('/dev/ttyACM0',115200,timeout=0.1) 
except:
    print('Serial error')
    serial_error = True
    
def loop_and_detect(cam, trt_yolo, conf_th, vis):

	while True:
        boxes, confs, clss = trt_yolo.detect(img, conf_th)
        
        if boxes.size > 0: #인식 확인
            xx_dot = int((boxes[0,0]+boxes[0,2])/2) #0번 인식 객체의 x 위치
            yy_dot = int((boxes[0,1]+boxes[0,3])/2) #0번 인식 객체의 y 위치
            x_y = str(x_dot)+','+str(y_dot) #x,y 위치 저장

        if serial_error == False: #serial 통신 실패 시 출력 유무 확인
            ser.write(x_y.encode('utf-8'))

컴퓨터에 따라 시리얼 포트 이름이 ttyACM0가 아닐 수도 있습니다.

 

이때는

 

dmesg | grep tty

를 통해 알 수 있습니다.

 

코드를 간략하게 보면

ser = serial.Serial('/dev/ttyACM0',115200,timeout=0.1)

로 연결하고

 

ser.write(x_y.encode('utf-8'))

로 젯슨에서 계산한 데이터를 보내주는 내용입니다.


그리고 OpenCR에서 데이터를 받는 코드입니다.

 

Arduino ide를 설치합니다. (저는 윈도우 환경에서 설치했습니다.)

 

https://www.arduino.cc/en/software

 

Software

Open-source electronic prototyping platform enabling users to create interactive electronic objects.

www.arduino.cc

 

설치를 한뒤 아두이노 ide를 실행해서 파일-환경설정에 들어가서 

 

추가적인 보드 매니저 URLs에 

https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/arduino/opencr_release/package_opencr_index.json

다음 내용을 넣고 확인을 눌러줍니다.

 

그리고 툴-보드-보드매니저에 들어가서

 

OpenCR을 검색한 뒤 설치해줍니다.

 

코드 내용 중 시리얼 통신과 관련된 부분만 보면

void setup() {
  // put your setup code here, to run once:

}

String command;

void loop() {
  if (Serial.available()) {

    command =  Serial.readStringUntil('\n');
    Serial.setTimeout(5);
  
  }

 

젯슨에서 계산한 데이터를 5ms 간격으로 받는 코드입니다.

 

나머지 내용은 (x,y)형태로 받은 데이터를 x값과 y값으로 분리하고

 

그 값을 이용해서 다이나믹셀을 pid제어하는 코드인데 제가 짠게 아니라 시리얼 통신 부분만 발췌했습니다.


 

OpenCR은 젯슨과 연결했을 때 업로드만 되고 개발이 안 되기 때문에

 

전체적으로 실행할 때 모터가 돌아가는 모습을 통해 두 코드가 정상적으로 작동하는 것을 확인은 할 수 있었으나

 

Arduino ide에서 시리얼모니터를 통해 값을 잘 받고 있는지 그런 모습은 확인할 수 없었습니다

 

 

 

 

댓글