처음 종합설계 일지를 작성한 이후 여러 테스트와 그에 따른 실험들을 진행하면서 여러 시행착오가 있었다. 하지만 결과적으로 AI Turret이라는 주제에 사용될 기본적인 구성 기능을 구현하는데에 성공하였고 처음 접해보는 YOLO 또한 생각보다 순조롭게 진행되고 있는 듯하다.
이번 일지에서는 지금까지 만들고 실험했던 것들을 정리해보며 1학기 종합설계를 마무리하려 한다. 아래는 1학기 동안 작성한 종합설계 일지이다!! 🐶
종합설계 일지 #0 - 프로젝트 구성
종합설계 일지 #1 - Raspberry Pi Cluster 사용에 대한 고찰
종합설계 일지 #2 - Stabilizer 구성 및 실험
종합설계 일지 #3 - Raspberry Pi-ESP32 통신 및 제어
초기에 YOLO를 활용한 사물 인식 기능을 주제로 잡았으며, 이후 실생활에 초점을 맞 추어 주제를 구체화했다. 최종적으로 생활권에서 달갑지 않은 존재인 “비둘기”라는 객체가 주의를 끌었다.
비둘기는 배설물과 악취, 소음 등 많은 해로움을 야기시키며 결정적으로 음식물 쓰레 기 봉투를 건드려 악취와 함께 미관상으로 불쾌감을 준다. 따라서 AI Turret을 도입하 여 비둘기를 인식하고 특정 구역에 대해 퇴치하는 용도로 AI Turret을 고안했다.
실제 비둘기를 대상으로 AI Turret을 구현하는 데에 있어, 동물 학대 및 학습 자료를 수집하기 어려움 등의 여러 요소를 고려하여 “산타 인형”으로 대체하였다.
기존 AI Turret을 기획하는 단계에서 목표 대상을 탐지하기 위한 수단으로 YOLO를 사용하고 더욱 효율적인 동작을 기대하며 Raspberry Pi Cluster에서 구현할 계획이었다. 하지만 Cluster를 구성하는 데에 있어 여러 문제가 발생하였다.
1) 예산 한계
최소한의 규모의 Cluster를 구성하기 위해서는 1대의 Master Raspberry Pi와 2대의 Slave Raspberry Pi가 있어야 하기에 총 3대의 Raspberry Pi가 소요된다. 추가로 Lan Hub와 Power Supply 등의 부가적인 장비들도 필요하기에 최소크기의 Cluster를 구성하기 위해서도 약 38만 원 정도의 예산이 필요하다.
2) 암달의 법칙 한계
YOLO를 통해 Object Detecting하기 위해 복잡한 연산을 수행 하는데, 최소한의 Raspberry Cluster를 사용하여 유의미한 연산 속도의 향상을 이끌 수 없다는 것을 여러 논문 및 참고 자료를 통해 확인할 수 있었다.
‘암달의 법칙’이란 컴퓨터 프로세스를 병렬화시켜도 병렬처리 부분이 전체 처리량의 약 5% 수준으로 성능 향상에 더 이상 영향을 주지 않는 법칙이다.
여러 문제 중 위의 두 이유에 의해 Raspberry Pi Cluster의 사용을 포기하였으며 하나의 Raspberry Pi를 사용하고 System을 구성하기로 계획을 수정하였다.
AI Turret을 구현하기 위해 주요 기능별로 분류하였으며 동작에 필요한 프로세서 및 플랫폼(개발Tool)에 따라 실험과 개발을 각각 진행하였다.
AI Turret이 구동되는 기능을 크게 4가지로 나누고 기능별 필요한 프로세서와 플랫폼 을 정리하였다. 이는 개발 순서와 상관없이 정리된 것이며 각각의 기능들이 다른 기능의 동작 여부에 영향을 받지 않고 독립적으로 개발 및 실험이 가능하다.
개별적으로 개발하여 각각의 기능이 구현 가능해졌을 때, 4가지 기능을 종합하여 AI Turret을 구성할 계획이다.
AI Turret에서 Stabilizer는 표면이 고르지 않은 환경 또는 경사면과 같은 환경에서도 Object detecting 범위를 유지하고 카메라와 사격 장치가 항시 지평면에 수평 상태를 유지할 수 있도록 동작한다.
메커니즘으로는 Turret Frame의 현재 상태를 인지할 수 있는 "MPU6050" 자이로-가속 도 센서를 사용하여 자세 제어에 필요한 Data를 받아올 수 있고 이를 Servo Motor로 동작하여 수평 상태를 이루게 되는 것이다.
• Stabilizer 개발 및 실험 과정
1. AI Turret는 X, Y의 2개 축을 사용하는 Stabilizer이지만 각각이 기능적으로는 같은 메커니즘으로 작동하므로 우선 Y축에 대해 Stabilizer 기능 개발
2. 기존 사용하던 코드에서 MPU6050의 자이로에 대한 외부 라이브러리로 대체
#include <MPU6050_light.h>
// ESP32 환경에서 MPU6050을 사용하기 위해 "MPU6050_light.h" 사용
...
gryo_X = map(angle_X, -90, 90, 0, 180);
gryo_Y = map(angle_Y, -90, 90, 180, 0);
// 수평면에 대해 Roll, Pitch의 기준축 초기화
// angle_x와 angle_y의 측정 범위가 달랐지만 이를 고려하지 않아 문제 발생
3. 자이로 Data가 초기화되는 기준 축을 "map" 함수를 이용하여 수정 및 이를 활용한 Servo Motor 제어
gryo_X = map(angle_X, -180, 180, 0, 180);
// map 함수를 활용하여 Servo Motor와의 동작 범위 동기화
// angle_x와 Servo Motor의 동작 범위에 대한 Scale이 1:1이 아니어서 문제 발생
4. X, Y 2개 축에 대해 Stabilizer 기능 구현과 “constrain" 함수를 사용하여 X(Roll)에 서 발생하는 Max-Min 범위 수정 및 Servo Motor 제어 범위와 동기화
gryo_con = constrain(angle_X, -90, 90);
gryo_X = map(gryo_con, -90, 90, 0, 180);
// constrain 함수를 사용하여 1:1 Scale을 위한 Max-Min 값 범위 제한
// constrain 함수 사용으로 이전 문제 해결
위의 개발 진행 순서에 따라 Stabilizer 기능을 구현할 수 있었으며 여기서 사용된 프로세서는 “ESP-WROOM-32”이다.
Turret은 x축을 기준으로 회전하는 Pan과 y축을 기준으로 회전하는 Tilt로 상하좌우의 방향으로 동작한다. Raspberry Pi의 카메라를 통해 바운딩 박스를 수집하여 카메라 중앙까지의 X(Pan), Y(Tilt) 좌표 값을 ESP32로 Serial 통신으로 송신한다. ESP32는 받은 Data에 맞게 Servo Motor를 제어하여 Object방향으로 Airsoft Gun을 위치시키게 된다.
• Turret 개발 및 실험 과정
1. ESP32 환경에서 가변저항을 사용하여 Servo Motor 단순 제어 실험을 진행
data = analogRead(val);
servo_val = map(data, 0, 4095, 0, 180);
// 아날로그의 가변저항 값을 map 함수로 Servo Motor와 동기화
servo1.write(servo_val);
// 가변저항의 제어를 통해 Servo Motor 제어
2. Raspberry Pi와 ESP32 간의 Serial 통신 구성
3. Serial 통신을 기반으로 두 개 이상의 값 송·수신 실험
if (mySerial.available() > 0) {
command = mySerial.readStringUntil('\n');
// readStringUntil() : 괄호() 안의 ‘\n'(줄바꿈)이 나오기 전까지의 데이터를 문자렬 형테로 저장
data = command.toInt();
// toint() : readStringUntil()을 사용하여 분류한 String 형태의 Data를 int 형으로 변환 및 저장
Serial.println(data);
}
// toint()와 readStringUntil() 함수를 사용한 ESP32 측에서의 통신 데이터 분류
4. 송·수신 Data 기반으로 2개의 Servo Motor 제어
YOLO는 실시간 객체 탐지 알고리즘이며, YOLO는 많은 버전이 존재한다. 그중 YOLOv3 Tiny 모델을 사용했고 그 이유는 다음과 같다.
• YOLOv3 Tiny 모델 선정 이유
1. 작은 크기와 적은 계산 비용을 가지고 있다. 따라서 Raspberry Pi와 같은 임베디드시스템이나 리소스가 제한된 환경에서도 효과적으로 실행할 수 있게 해준다.
2. 입력 이미지의 해상도를 416x416으로 제한한다. 이로 인해 YOLOv3 Tiny는 빠른 실행 속도를 보장하면서 객체를 탐지할 수 있다.
3. 더 적은 계층을 가지고 있다. 이는 모델의 복잡도를 줄이고, 실행 시간을 단춛시키는데 도움을 준다.
산타 인형을 AI Turret의 Object로 선정했다. 산타인형을 베이스로 1000장의 이미지 파일을 촬영했고 800장에 대해 Labelling 작업을 진행했다.
Labelling 작업은 YOLO의 교과서 같은 존재로 이 Labelling 데이터 파일을 토대로 학습한다. 이후, 남은 200장은 학습이 완료된 모델의 정확도를 검증하기 위해 활용할 계획이다.
AI Turret의 외장을 3D Printing을 통해 구현할 계획이다. 따라서 AI Turret의 구성요소를 미리 모델링하여 이를 바탕으로 수치 및 부품 간 결합을 확인할 수 있는 “Proto -Type Model"을 설계하였다.
측정된 수치 자료를 기반으로 설계한 부품들을 적합하게 배치하여 사격 장치를 구성하였으며 부품 결합 및 동작에 아무런 이상이 없으면 이후 Proto-Type을 설계할 때 사용되었던 Data를 중심으로 최종 Frame을 설계할 예정이다.
1학기 동안 진행한 종합 설계 정리를 중간 정리해보았다. Stabilizer 구성 및 Turret 기능의 대부분을 구현하였기에 2학기 중으로는 YOLOv3 Tiny 모델의 학습과 이를 활용한 Tracking 실험을 많이 다룰 예정이다.