http://dx.doi.org/10.XXXXX/JCCT.20XX.X.X.XXX

라즈베리파이와 Open-CV, nVidia CNN 모델을 적용한 라즈베리파이 자율주행자동차 개발
Development of Raspberry Pi Autonomous Car using OpenCV and NVIDIA CNN Model
요 약 인공지능이 다양한 분야에 도입되면서 모빌리티 산업에도 새로운 활기를 불어넣고 있다 그 중에서도 스마트 모빌리티는 삶의 질을 높이고 새로운 산업을 창출할 수 있는 분야로 떠오르고 있다. 스마트 모빌리티의 핵심 기술로 자율주행자동차를 들 수 있으며, 모형자동차를 이용한 자율주행 알고리즘 연구에 박차를 가하고 있다. 하지만, 자율주행의 원리와 개념을 처음부터 끝까지 연구하면서 적용할 수 있는 플랫폼은 많이 제공되고 있지 않은게 현실이다. 본 연구에서는 대표적인 소형 마이크로컴퓨터인 라즈베리파이4를 이용한 자율주행자동차의 동작 원리와 nVidia CNN을 이용한 딥러닝 모델을 적용한 자율주행자동차를 개발하였다. 자율주행자동차는 2채널 DC모터가 라즈베리파이의 GPIO 핀에 연결되어 있으며, 마우스를 이용하여 조향각을 구한 후 좌우측 모터의 속도를 조정하여 트랙을 자율주행하는 과정을 보여주었다. 이때 저장된 이미지를 코랩에 업로드하여 T4 GPU를 이용하여 모델을 생성하였다. 생성된 모델은 다시 라즈베리파이에 전송되어 자율주행을 수행하도록 하였다. 다양한 주행특성을 살펴볼 수 있는 트랙을 제작하여 이미지를 학습하고 자율주행을 테스트한 결과 어느 단계에서도 트랙을 이탈하지 않고 모든 경로를 자율주행하는 결과를 얻었다.
주요어 :	스마트모빌리티, 자율주행자동차, 딥러닝, 신경망, 라즈베리파이
Abstract As artificial intelligence continues to be adopted across various industries, it is bringing new vitality to the mobility sector. Among these advancements, smart mobility has emerged as a promising field capable of improving quality of life and creating new industries. Autonomous vehicles are considered a core technology of smart mobility, driving research into autonomous driving algorithms using model vehicles. However, platforms that allow researchers to study and apply the principles and concepts of autonomous driving from start to finish are still limited. In this study, we developed an autonomous vehicle using the Raspberry Pi 4, a representative microcomputer, and applied a deep learning model based on Nvidia's CNN. The autonomous vehicle utilizes a 2-channel DC motor connected to the GPIO pins of the Raspberry Pi. Steering angles are calculated using a mouse, and the speed of the left and right motors is adjusted accordingly to demonstrate autonomous driving on a track. Images captured during the process were uploaded to Google Colab, where a T4 GPU was used to generate the model. The resulting model was then transferred back to the Raspberry Pi to perform autonomous driving. A track was designed to allow the examination of various driving characteristics, and the model was trained using the captured images to test autonomous driving. The results showed that the vehicle successfully completed all routes without deviating from the track at any point.
Key words :		Smart mobility, Autonomous Vehicle, Deep learning, Neural network, Raspberry pi

JCCT 2025-1-XX

The Journal of the Convergence on Culture Technology (JCCT)

Vol. 11, No. 1, pp.XX-XX, January 31, 2025. pISSN 2384-0358, eISSN 2384-0366

-  -

Ⅰ. 서 론

딥러닝 기술이 발전함에 따라 주변 환경을 인지할 수 있는 차량, 사람이 없어도 스스로 안전하게 운전하고 운전할 수 있는 자율주행자동차에 대한 연구가 활발하게 진행되고 있다. 자율주행 기술은 현대 교통 시스템을 혁신적으로 변화시키고 있으며, 미래의 지능형 교통시스템을 향해 지속적인 발전을 거듭하고 있다. 자율주행차의 등장은 운전의 편의성과 안전성을 향상시키는 동시에 환경 친화적인 교통 수단으로 발전하여 자동차를 단순한 교통수단이 아니라 문화적인 수단으로까지 발전시키고 있다[1]. 그리고 전 세계 여러 지역의 연구자들이 자율주행차의 다양한 측면을 고려한 연구를 진행하고 있다[2-7]. 그러나 대다수의 자율주행차 연구는 고가의 센서 및 장비를 필요로 하며, 이로 인해 기술의 보급과 접근에 대한 제약이 따르고 있으며, 자율주행자동차에 대해 연구하고 하는 연구자들이 고비용의 장치를 구비해야하는 단점이 있다. 따라서, 이러한 제한을 극복하고 저비용으로 오픈소스 하드웨어 및 소프트웨어 플랫폼을 기반으로 한 자율주행차 개발에 대한 많은 연구가 진행되고 있다.

자율주행자동차의 전망은 쉽게 예측할 수 없다. 미래의 조건. 많은 실무자와 분석가는 주차, 교통 문제 및 대중 교통에 미치는 영향 측면에서 자율 주행 자동차의 미래에 대해 걱정하고 있다[8]. 이러한 추론에 있어서 자동차공학회(SAE)는 2030년까지 자율주행차는 인간의 운전을 대체할 수 있을 만큼 안전하고 신뢰할 수 있어 운전자를 최소화할 것이라고 주장하고 있다. 자율주행차는 또한 사고, 혼잡, 오염 문제를 줄일 것이다. 또한 일부 분석가는 자율주행차의 승객 공유 여행에 드는 총 비용이 인간이 운전하는 차량보다 낮을 것이라고 예측하고 있다[9]. 이러한 점을 고려하는 본 연구에서는 소형 마이크로컴퓨터인 라즈베리파이를 활용하여 자율주행차를 개발함으로써, 저비용, 오픈소스 하드웨어 및 소프트웨어 플랫폼을 통해 자율주행 기술을 보급하고 확산시키는 데에 기여하고자 한다. 구체적으로는 라즈베리파이를 기반으로 한 저비용의 차량 플랫폼을 개발하고, 이를 통합적으로 제어할 수 있는 소프트웨어 시스템을 설계한다. 다양한 환경에서 안정적인 자율주행을 위해 필요한 거리감지 센서, 비전 센서, 조도센서 등을 통합하여 주행하는 도로의 환경을 인식하고 장애물을 회피하는 기능을 개발한다. 라즈베리파이의 성능을 최대한 활용하여 실시간으로 수집된 센서 데이터를 처리하고, 자율주행을 위한 의사결정 알고리즘을 개발한다. 이를 통해 차량은 주행 환경에 대한 신속하고 효과적인 응답을 보일 수 있다. 라즈베리파이 기반의 저비용 자율주행 시스템을 개발함으로써, 기술의 접근성을 높이고 다양한 연구 및 산업 분야에 활용할 수 있는 자율주행 기술개발을 위한 교육 발전에 기여하는 것이 본 연구의 최종적인 목표이며, 자율주행자동차를 학습하고자 하는 모든 학생들이 저비용으로 오픈소스를 사용하여 직접 자율주행자동차를 개발하는데 필요한 지식과 경험을 제공하고자 한다.

Ⅱ. 관련 연구

많은 연구에서 Raspberry Pi, Arduino Uno 및 카메라 기반 접근 방식을 사용하여 작동 모델의 자율 주행 자동차를 제안한다. 자동차가 수행하는 세 가지 주요 모듈로는 차선 감지, 장애물 감지 및 교통 신호 감지를 들 수 있다.. 자동차에 설치된 카메라 모듈은 실시간 이미지를 캡처하고 이를 Raspberry Pi로 전송하며, Raspberry Pi는 이미지를 처리하고 자율주행을 위한 관련 모듈로 전송한다. 차선 감지에는 Canny Edge Detection 및 Hough Transform과 같은 알고리즘을 기반으로 자동차의 이동하고자 하는 방향을 예측한다. 교통 신호 감지 모듈은 CNN 및 OpenCV 기반 접근 방식을 사용하여 교통 신호를 식별한다. 장애물 감지는 거리감지 센서와 이미지 처리 기술을 사용하여 도로에서 만날 수 있는 차량 및 보행자와 같은 물체를 감지한다. 이러한 모듈들이 통합된 자율 주행 자동차는 최대 95~97%의 정확도를 보여주고 있다[10].

Michael G. Bechtel은 저비용 카메라와 처리 장치를 사용하여 자율주행 차량의 차선 유지 시스템을 제안한 연구에서 OpenCV를 활용하여 이미지 처리를 수행하며, 주로 Canny 엣지 검출 알고리즘과 Hough 변환을 사용하여 차선 라인을 식별하였다. 차량의 움직임은 아두이노에서 실행되는 PID 알고리즘에 의해 제어되며, 이를 통해 차선 유지의 안정성과 정확성을 보장하고, 연구 결과 라즈베리 파이와 같은 저비용 구성 요소를 사용하여 제어된 환경에서 효과적인 자율주행 차량 시스템을 구축할 수 있다는 결론을 얻었다[11].

Alfa Rossi는 인간의 개입 없이 차선을 감지하고 이동을 계획하는 차량 프로토타입을 제안하였고, Raspberry Pi 카메라를 사용하여 비디오를 캡처하고, 라즈베리 파이 3.0 모델 B에서 Python과 OpenCV를 사용하여 처리하였다. 차선 감지는 Canny 엣지 검출과 Hough 변환을 통해 이루어지며, 차량은 아두이노를 사용하여 제어하였다. 칼만 필터 예측 및 과거 누적 평균 방법과 같은 방법을 사용하여 시스템의 효과를 향상시켰으며, 프로토타입으로 개발한 자동차를 이용하여 실시간으로 차선을 성공적으로 감지하고 이동을 계획할 수 있음을 나타내었고, 저비용 구성 요소가 자율주행 시스템에서 가질 수 있는 잠재력을 입증하였다[12].

Ⅲ. 자율주행자동차 개발

본 논문에서는 소형 마이크로컴퓨터인 라즈베리파이4B를 기반으로 Open-CV와 n-Vidia CNN 모델을 이용한 자율주행자동차를 개발하고, 직진 주행, 곡선 주행 및 차선 분리를 포함하는 자율주행 검증용 주행 트랙을 제안하고, 트랙 인식과 저장, 딥러닝 모델 생성 및 자율주행 과정을 평가하고자 한다.

1. 라즈베리파이 자율주행자동차의 구성

1) 하드웨어

본 연구에서 개발한 라즈베리파이 자율주행자동차는 라즈베리파이4B를 기반으로 한다. 라즈베리파이4B는 Rasbian Linux 운영체제를 탑재하고 있으며, 40핀의 GPIO(General Purpose Input Output)를 제공하고 있어서 다양한 입력센서와 출력장치를 활용하여 외부장치를 제어하는 임베디드시스템을 제공한다. 특별히, 소형컴퓨터임에도 와이파이와 유선랜을 제공하고 있어서 원격지에서 접속할 수 있는 기능을 활용하여 라즈베리파이에 연결된 LCD 외에서 원격컴퓨터에서 와이파이로 연결하여 화면을 크게 확대하여 제어할 수 있는 장점을 가지고 있다. 파이썬을 포함한 다양한 데이터 분석 라이브러리, 머신러닝 및 딥러닝 라이브러리를 오픈소스로 제공받을 수 있기 때문에 자율주행자동차를 구현하고 확장시킬 수 있는 장점을 가지고 있다. 본 논문에서는 자동차에서 필수적으로 요구하는 좌,우회전 점멸등, 전조등, 경적과 거리 측정 등을 담당하는 센서들을 GPIO를 통해 제어하고, DC모터를 사용하여 자동차의 속도와 회전를 구현한다. 도로 이미지를 생성하기 위해 카메라를 사용하고 저장된 이미지로 딥러닝 모델을 생성한 후에 자율주행 과정에서는 이미 학습된 모델에 이미지를 입력하여 주행할 주행각을 예측하여 주행하도록 시스템을 설계한다.

표 1. 라즈베리파이4의 제원

Table 1. The specification of Raspberry 4B

브로드컴BCM2711, 쿼드코어Cortex-A72 (ARM v8), 64-bit SoC @ 1.5GHz, 4GB LPDDR4-3200 SDRAM

2.4/5GHz IEEE 802.11ac 와이파이, Bluetooth 5.0, BLE, 기가비트 이더넷, USB 3.0 포트 2개, USB 2.0 포트 2개

표준 40핀 GPIO 헤더, 2 × micro-HDMI, 2열 MIPI DSI 디스플레이 포트, 2열 MIPI CSI 카메라 포트

H.265(4kp60 decode), H.264(1080p60 decode, 1080p30 encode)

OpenGL ES 3.0 그래픽, Micro-SD 카드 슬롯(저장장치 및 운영체제 로딩용)

2) 시스템 구성

라즈베리파이 기반의 자율주행자동차의 시스템 구성은 그림 1과 같다. 640x480 픽셀의 해상도를 가진 카메라에서 주행 트랙의 이미지를 저장하고, nVidia CNN 모델에서 요구하는 200x66 해상도의 이미지로 변환하고, 이미지 처리 속도를 높이기 위해 RGB로 된 컬러 모델을 YUV 컬러 모델로 변환한다. 변환된 모델을 CNN 모델을 생성하기 위한 학습데이터로 사용된다. PyTorch로 생성된 CNN 모델은 자율주행 과정에서 카메라에서 입력된 이미지를 이용하여 자동차가 주행할 조향각을 예측한다. 이 예측된 값으로 모터쉴드에 연결된 DC모터를 조정하여 자동차의 주행 방향을 결정한다.

그림 1. 라즈베리파이 자율주행자동차의 시스템 구성

Figure 1. The system structure for Raspberry Autonomous Car

그림 2. 라즈베리파이 자율주행자동차 및 배선도

Figure 2. The Wiring diagram of Raspberry Pi autonomous car

그림 2는 라즈베리파이4를 기반으로 하는 자율주행자동차와 시스템 구성에 따른 하드웨어 연결도를 보여준다. 자동차에 연결된 입출력 장치들은 GPIO를 이용하여 제어한다. 자동차가 가지고 있는 기본적인 제어장치를 필수로 다루고 있으며, 카메라를 이용한 도로 이미지의 획득과 마우스 입력에 의한 자동차의 조향각 제어 등을 수행하는 입출력 장치로 구성되어 있다. 자율주행자동차시스템에서 사용하는 입출력 장치들에 대한 사양은 표 2와 같다.

표 2. 자율주행자동차의 시스템 사양 Table 2. The specification of Raspberry Pi autonomous car
항 목	세부 내용	비고
카메라	OV5647, 130eh 조절 가능한 야간 카메라
거리측정센서	VL53L0X, 비행거리센서, 최대측정거리 2M, I2C
배터리	WP401, 모루이 40,000mAh 대용량 보조배터리
모터드라이버	TB6612FNG 내장 2CH DC 모터드라이버 컨트롤러
네오픽셀	WS2812 네오픽셀 8개 스틱 5050 RGB LED 모듈
스피커	UM66T, 피에조 5mm AT3040 패시브 와이어 부저
부저	DM-03 사각 부저, DC 5V
LCD	4.3inch Capacitive Touch Display, DSI 800×480
LED	PP-D078, 10파이 일반휘도 LED 원형

2) 소프트웨어 구성

자율주행자동차의 소프트웨어 구성은 크게 세 단계로 이루어진다. 첫 번째로 도로 이미지를 수집하는 단계, 두 번째로 저장된 이미지와 조향각을 기반으로 신경망 딥러닝 모델을 생성하는 단계, 마지막으로 생성된 딥러닝 모델을 적용하여 자율주행하는 단계로 구성되었으며 그림 3과 같은 과정으로 소프트웨어를 실행한다. 자율주행자동차를 위한 파이썬 코드는 크게 네 가지로 구성된다. 첫 번째는 테스트 트랙을 주행하기 위한 자동차 주행 기능과 카메라를 통한 도로 이미지를 저장하는 기능을 수행하는 코드이다. 두 번째 코드는 앞 단계에서 저장된 이미지를 입력받아 nVidia CNN 딥러닝 모델을 생성하는 코드로써 라즈베리파이에서 직접 실행할 수 있는 코드와 구글 드라이브에 이미지 파일을 압축해서 업로드한 후 구글 코랩과 T4 GPU를 이용하여 생성하는 두 개의 코드로 구성되어 있다. 이렇게 생성된 딥러닝 모델을 자율주행자동차로 다운로드받아 테스트용 트랙을 주행하면서 얻은 도로 이미지를 딥러닝 모델의 입력으로 제공하면 자율주행자동차의 조향각을 예측한 값을 얻게 되고 그 값을 이용하여 자동차의 모터를 제어하여 자율주행을 수행한다. 이때 사용된 라이브러리는 다음과 같다.

- Python Version: 3.10.12

- OpenCV version: 4.10.0

- Pytorch version: 2.5.1+cu121

Colab GPU: T4 GPU(무료 버전)

그림 3. 소프트웨어 구성도

Figure 3. The Software diagram for Autonomous Car

2. 도로 이미지 저장(gi.py)

자율주행자동차를 조종하는 기능과 카메라를 이용한 도로 이미지를 저장하는 기능을 수행하는 코드는 gi.py로 구현하였다. 이 프로그램을 실행하는 명령어는 다음과 같다.

sudo python gi.py testA

“sudo”는 관리자 권한으로 실행하는 명령어이며, 파이썬 코드를 실행하면서 testA라는 디렉토리를 생성하여 도로이미지와 조향각을 파일명으로 지정하여 저장한다. 그림 4는 자율주행자동차의 이미지 획득 및 저장을 위한 프로그램의 실행화면이다. 자율주행자동차에서 사용하는 카메라의 해상도는 640x480인데 비하여 프로그램을 출력하는 LCD의 해상도는 800x480으로 X축 해상도가 160픽셀 만큼 크기 때문에 좌우로 각각 80픽셀 만큼 여유를 두고 자동차를 제어하기 위한 주요 명령어의 실행방법을 이미지로 추가하였다. 그림 4(a)의 하단부에 파란색 4각 박스로 된 영역이 도로 이미지로 저장하기 위한 영역을 나타낸다. 이 영역은 트랙의 상황에 따라 프로그램 실행시에 기본 영역을 표시되며 키보드의 Shift+0~6을 이용하여 상하좌우의 크기를 조정할 수 있다. 상단부의 작은 이미지는 nVidia CNN 모델에서 200x66 해상도의 이미지를 요구하기 때문에 파이썬의 resize()함수를 이용하여 크기를 재조정한 이미지를 보여준다. 가운데 보이는 –1로 된 숫자는 화면의 X축 중심을 기준으로 마우스가 왼쪽에 위치할 때는 음수를, 오른쪽에 위치할 때는 양수를 나타내며 숫자는 좌우로 회전할 조향각 정보를 제공한다. 그림 4(b)는 그림 4(a)의 도로이미지의 크기를 640x240이라고 가정할 때 200x66 해상도로 변경된 이미지와 변경된 이미지에 대해 YUV 컬러로 변환하고 이미지 블러링 전처리를 수행한 이후 nVidia CNN 모델의 입력으로 제공할 이미지를 보여준다.

파일명 : P0001__+01.png

이미지 파일은 P를 시작으로 네 자리의 이미지 번호를 붙이고 “__”를 추가한 후 부호를 포함한 세 자리 숫자로 자동차의 주행방향을 표시한다. “__”는 향후 다양한 형태로 이미지를 저장할 수 있도록 예약어로 지정하였다.

(a)이미지저장 프로그램(Image saving program:gi.py)	(b)이미지 전처리(Image preprocessing)
그림 4. 자동차 조종 및 이미지 저장 Figure 4. Autonomous car control and image saving

3. 딥러닝 모델 생성

딥러닝 모델을 생성하기 위해 이미지 저장단계에서 생성한 디렉토리를 동일하게 사용한다. 다음과 같은 명령어를 사용하여 디렉토리에 저장된 이미지 파일을 불러와 훈련 셋과 검증 셋, 그리고 테스트 셋을 분류하고, nVidia CNN 딥러닝 모델을 사용하여 파이토치 모델을 생성한다.

sudo python dl.py testA

그림 5는 딥러닝 모델 생성 프로그램(dl.py)의 실행 예를 보여준다. 이미지 저장단계에서 저장된 이미지의 조향각은 –99에서 +99사이의 값으로 저장되기 때문에 한 화면서 각도별로 모든 이미지를 보여주면 혼란스럽기 때문에 각도의 그룹을 A~G로 구분하여 각 그룹의 이미지를 같은 열에 표시하였다. 이미지의 각도는 0을 기준으로 작은 값을 가지는 이미지가 큰 값을 가지는 이미지보다 많기 때문에 표 3과 같은 기준으로 구분하였다. 그림 5에서 딥러닝 과정을 수행하기 위해서는 화면 하단에 있는 “DeeP” 예에서 “P” 키를 입력하면 화면이 터미널 화면으로 전환되면서 딥러닝 과정이 실행되며, 이 과정이 완료되면 “testA” 디렉토리 내에 “_testA_model_check.pt” 의 형식으로 파이토치 딥러닝 모델이 생성되어 저장된다.

표 3. 조향각 그룹 Table 3. The steering angle group
변수/값	의미	변수/값	의미
aAL = -99 aAR = -47 aBL = -46 aBR = -22 aCL = -21 aCR = -6 aDL = -5 aDR = +5	A Left A Right B Left B Right C Left C Right D Left D Right	aEL = +6 aER = +21 aFL = +22 aFR = +46 aGL = +47 aGR = +99	E Left E Right F Left F Right G Left G Right

그림 5. dl.py 프로그램 실행화면

Figure 5. Execution example of dl.py program

본 연구에서는 최대 2,800개의 이미지를 사용하였기 때문에 라즈베리파이에서 딥러닝을 수행하기에는 시간이 너무 오래 걸리는 단점이 있어서 그림 5에서 “z”키를 입력하여 “testA” 디렉토리 전체를 testA.zip이라는 압축파일로 저장하여 구글 코랩에 업로드한 후 딥러닝 과정을 수행하였다. 구글 코랩은 30분 내외의 짧은 시간동안 T4 GPU를 무상으로 사용할 수 있기 때문에 10분 내에 딥러닝 모델을 생성할 수 있었다.

4. nVidia CNN 모델 생성

nVidia CNN 딥러닝 모델은 자율주행 자동차의 엔드 투 엔드 학습(End-to-End Learning)을 목표로 설계된 합성곱 신경망(CNN)이다[13]. CNN 모델은 다양한 영역에 적용되고 있으며 대표적으로 필기체 인식분야에 활용되고 있다. CNN은 이미지의 인식과 분류에 뛰어난 성능을 보이는 알고리즘 중 하나이며 간단하지만 많은 연산량을 가지기 때문에 많은 시간을 소요한다. 이 연구에서는 병렬처리를 통해 연산량을 줄일 수 있는 방법을 제안했다[14]. 본 연구에서는 차량 전방에 장착된 카메라로부터 연속적으로 수집되는 이미지를 입력으로 받아, 해당 이미지에 기반하여 적절한 조향각(steering angle)을 예측하면서 코랩의 GPU를 사용하는 가정하에서 연산량을 고려하지는 않았다.

그림 6. nVidia CNN 딥러닝 모델 Figure 6. nVidia CNN deeplearning model	그림 7. nVidia CNN 파이썬 코드 Figure 7. nVidia CNN python code

그림 6은 nVidia CNN 모델의 구성을 보여준다. 모델의 구조는 크게 세 가지로 나눌 수 있다. 첫째, 합성곱 계층(Convolutional Layers)은 입력 이미지에서 도로 패턴, 차선, 주변 환경 등 중요한 특징(feature)을 자동으로 추출한다. 둘째, 풀링 계층(Pooling Layers)은 데이터의 크기를 줄여 계산 효율성을 높이고 과적합을 방지하는 데 기여한다. 마지막으로, 완전 연결 계층(Fully Connected Layers)은 추출된 특징을 바탕으로 조향각을 계산하여 최종 예측값을 제공한다. 그림 6의 nVidia CNN 모델을 파이토치 라이브러리를 사용하여 파이썬 언어로 구현하면 그림 7과 같다.   구글 코랩에서 파이썬 코드를 작성하여 자동차에서 저장한 이미지를 입력받아 실행하면 “_testA_model_check.pt” 파일이 생성되며, 이 파일을 다운로드받아 자율주행자동차의 testA 디렉토리에 저장한다. 라즈베리파이에서 딥러닝을 수행한 결과와 동일한 환경으로 자율주행을 수행한다.

5. 자율주행

자율주행자동차를 테스트하기 위하여 2절에서 소개한 도로 이미지 저장 파일과 유사한 형태의 파이썬 코드(ar.py)를 작성하고, 카메라를 사용하여 저장한 640x480 해상도의 영상을 200x66 해상도로 변환한 후 전처리과정(YUV 모델 변환 및 블러링 적용)을 거친 후 4절에서 생성한 딥러닝 모델에 입력으로 제공하여 자동차의 조향각을 예측한다. 그림 8에서 procImg 변수는 카메라의 영상 중에서 하단부에 있는 도로 이미지 영역을 전처리과정을 거친 후 얻은 최종 이미지이며, 이 이미지를 딥러닝 모델에 적용한 model(X) 함수를 적용하면 자동차의 주행방향을 예측한 값을 얻게 된다. 이렇게 예측한 조향각은 자율주행자동차의 모터 특성에 맞게 좌, 우측 모터의 속도를 적절하게 조정하는 과정을 거쳐 트랙을 주행한다. 본 연구에서 개발한 자율주행자동차는 카메라가 정상적으로 동작할 때만 의미가 있으므로 while문에서 카메라의 상태를 점검한다. 조건문 if가 나오기 전까지는 카메라에서 획득한 영상을 nVidia CNN 모델에서 요구하는 이미지로 변환하는 과정과 800x480 LCD 화면에 출력하기 위해 필요한 화면처리 과정을 거친다.

while(camera.isOpened()):

_, frame = camera.read()                                     # 입력 이미지 획득

viewWin[0:480,80:720] = frame[0:480,0:640]                  # 480 x 640 VGA 이미지의 좌우에 80픽셀 추가

viewWin[0:480,0:0+80] = msgBoxL                            # 왼쪽 메시지 박스

viewWin[0:480,720:720+80] = msgBoxR                       # 오른쪽 메시지 박스

image = viewWin[WIN_YU:WIN_YD,WIN_XL+80:WIN_XR+80]     # 트랙 이미지 영역 추출

image = cv.resize(image,(200,66))                             # NVIDEA Image 포맷(X:200, Y:66)으로 변환

imageYUV = cv.cvtColor(image, cv.COLOR_BGR2YUV)          # RGB 색상을 YUV 색상으로 변환

imageYUVG = cv.GaussianBlur(imageYUV, (3,3), 0)             # Gauss 노이즈 제거

procImg = imageYUVG/255                                    # 0-255 범위(정수)를 0.000-0.999 범위(실수)로 변환

if MODEL_FILE and autoRun:                                  # 학습 파일 존재, 자율주행 모드

X = np.asarray([procImg])

X = torch.Tensor(X).permute(0, 3, 1, 2)

angle = 0

model.eval()

with torch.no_grad():

angle = int(model(X)[0] * ANGLE_GAIN)

그림 8. nVidia CNN 딥러닝 모델을 이용한 조향각 예측

Figure 8. Steering Angle Prediction Using nVidia CNN Deep Learning Model

testA 디렉토리에 모델 파일(.pt)이 존재하고 자율주행 모드일 경우에 준비된 procImg 이미지를 PyTorch에 적용할 텐서로 변환하여 딥러닝 모델에 입력으로 제공하면 자동차가 주행해야할 조향각을 얻게 된다. 여기서 ANGLE_GAIN은 자동차의 DC 모터 특성에 따라 조향 값을 조정할 수 있는 비례상수를 나타낸다.

angle = int(model(X)[0] * ANGLE_GAIN)

Ⅳ. 실험 및 결과

본 연구에서 개발한 라즈베리파이4 자율주행자동차를 검증하기 위하여 1)주행트랙에서 이미지와 조향각을 png 파일로 저장, 2)저장된 이미지를 이용한 딥러닝 모델 생성, 3)생성된 딥러닝 모델로 주행트랙에서 자율주행의 3단계로 테스트를 진행하였다.

1. 테스트용 트랙을 이용한 이미지 저장

자율주행자동차를 검증하기 위해서 가장 중요한 단계는 주행할 트랙 이미지와 그 이미지에 해당하는 자동차의 주행방향 즉, 조향각을 확보하는 것이다. 이를 위해 자동차의 다양한 주행경로를 테스트할 수 있는 주행트랙을 그림 9와 같이 디자인하였다. 이 트랙은 1.5m x 3.1m의 크기로 제작되었다.  자율주행자동차는 트랙의 A지점에서 출발하여 알파벳 순으로 주행하면서 1초에 약 10프레임의 이미지를 저장한다. 마우스 포인트의 X축 좌표를 기준으로 –99에서 +99사이의 조향값을 포함하여 P0000__+05.png와 같은 형식의 파일명으로 저장된다.

그림 9. 자율주행자동차의 테스트용 트랙 Figure 9. Test Track for Autonomous Car	그림 10. nVidia CNN 모델의 학습과정 Figure 10. The learning process of nVidia CNN model

이때 주행하는 속도는 –100에서 +100사이의 값으로 주행하며 양수는 전진을, 음수는 후진을 나타낸다. 본 연구에서는 후진하는 기능을 적용하지 않기 때문에 양의 값을 가지며, 마우스의 Y축 좌표에 따라 +40에서 +100사이의 속도로 주행한다. 직선 도로의 경우에는 마우스를 위쪽으로 향하게 하여 +100에 가까운 값으로 높이고, 곡선 주로의 경우에는 회전하는 각도에 따라 마우스를 아래 부분으로 향하게 하여 +40에 가까운 값으로 자동으로 조정되게 하였으며, 이것은 곡선구간을 주행할 때 속도를 낮추는 기능을 구현하였다. 그림 9의 트랙을 한 바퀴 주행하는 동안 평균 400장 정도의 이미지가 저장되며 주행의 정확도를 높이기 위하여 약 1,200장 내외의 이미지를 저장하였다.

2. 딥러닝 모델 생성

이미지 저장단계에서 생성한 트랙 이미지는 training set, validation set과 test set으로 분류한다. 우선, training set의 이미지를 사용하여 딥러닝 모델을 생성한 후에 validation set의 이미지에 적용하여 loss 값을 계산하며 이 값을 최소화할 수 있도록 모델의 파라메타를 수정하면서 모델 생성을 반복한다. 이러한 과정을 epoch이라고 하며 본 연구에서는 epoch를 300으로 지정하였으며, 300번의 epoch을 반복하는 과정에서 validation set의 loss값이 줄어들면 그때의 파라메타로 모델을 갱신한다. 이 과정에서 epoch를 30회 반복하는 동안 loss값이 줄어들지 않으면 더 이상 모델이 개선되지 않는다는 가정하에 epoch을 중단하는 earlystop() 함수를 구현하였다. 그림 10에서 학습 회수(epoch)는 300, 학습비율(learn rate)은 0.001, 훈련(train) 이미지 개수: 1,246개, 평가(validation) 이미지 개수: 315개, 시험(test) 이미지 개수: 7개를 사용하였다.

Layer (type) Output Shape Param # ============================================================= Conv2d-1 [-1, 24, 31, 98] 1,824 ELU-2 [-1, 24, 31, 98] 0 Conv2d-3 [-1, 36, 14, 47] 21,636 ELU-4 [-1, 36, 14, 47] 0 Conv2d-5 [-1, 48, 5, 22] 43,248 ELU-6 [-1, 48, 5, 22] 0 Conv2d-7 [-1, 64, 3, 20] 27,712 ELU-8 [-1, 64, 3, 20] 0 Dropout-9 [-1, 64, 3, 20] 0 Conv2d-10 [-1, 64, 1, 18] 36,928 ELU-11 [-1, 64, 1, 18] 0 Dropout-12 [-1, 1152] 0 Linear-13 [-1, 100] 115,300 ELU-14 [-1, 100] 0 Linear-15 [-1, 50] 5,050 ELU-16 [-1, 50] 0 Linear-17 [-1, 10] 510 ELU-18 [-1, 10] 0 Linear-19 [-1, 1] 11	Total params: 252,219 Trainable params: 252,219 Non-trainable params: 0 -------------------------------------------- Input size (MB): 0.15 Forward/backward pass size (MB): 1.67 Params size (MB): 0.96 Estimated Total Size (MB): 2.78 -------------------------------------------- pred [[-62.140564 ] [-51.84805 ] [ -5.7841234] [ -4.0958915] [ 23.468927 ] [ 31.651247 ] [ 51.91443 ]] target [[-63.] [-46.] [ -8.] [ 5.] [ 10.] [ 32.] [ 53.]] 표준 편차: 43.61 회귀 결정 계수: 96.97% 학습 소요 시간: 1 분 6 초

그림 11. nVidia CNN 모델 결과

Figure 11. The result of nVidia CNN model

그림 11은 딥러닝 모델을 생성하는 전 과정의 평가 결과를 보여준다. nVidia CNN 모델의 프로세스와 사용된 파라메타의 수, 테스트 셋의 실제 값과 예측값의 비교, 표준 편차와 회귀 결정 계수, 학습소요시간 등을 보여준다. 그림 12는 생성된 딥러닝 모델을 test set 이미지에 적용한 결과를 보여준다. 그림에서 제시한 P0160__-57.png/E:-56은 160번째 이미지 저장단계에서 자동차의 조향각이 –57을 나타냈으며, 동일한 이미지를 딥러닝 모델에 적용하여 예측한 조향각이 -56이라는 의미를 나타낸다.

그림 12. Test 이미지에 대한 조향각 예측 결과

Figure 12. The prediction results of steering angle for the test image

3. 자율주행

자율주행 단계에서는 그림 10에서 생성한 딥러닝 모델을 라즈베리파이4 자율주행자동차에 적용하여 그림 9에서 제시한 트랙을 자율주행하는 방법으로 테스트를 진행하였다. 자율주행자동차는 1대에서 4대까지 동시에 주행을 실시해 보았으며, 한 바퀴를 주행하는 동안 트랙을 이탈하지 않았으며 총 주행시간은 3분 53초로 나타났다. 또한 30분 동안 연속적인 주행을 실시하는 동안에도 트랙을 이탈하지 않고 반복적으로 자율주행하는 결과를 얻었다. 자율주행의 정확도를 높이기 위해서는 자율주행의 첫 단계인 이미지 획득단계가 가장 중요하다는 결론을 얻었다. 좋은 이미지와 그에 적절한 조향값을 입력으로 제공해야 좋은 딥러닝 모델을 생성할 수 있다. 자동차를 조종하는 사람이 마우스 조작이 미숙해서 제대로 된 정보가 입력되지 않으면 자율주행에서도 오류가 발생할 수 있다. 하지만 한 개의 이미지로 조향값을 예측하는 것이 아니기 때문에 이미지 저장단계에서 발생하는 일부의 오류는 자율주행에 크게 영향을 미치지 않는다는 것도 확인할 수 있었다.

그림 13. 주행트랙에서 자율주행하는 과정 Figure 13. The process of autonomous driving on a track

Ⅴ. 결 론

본 연구에서는 라즈베리파이4를 이용한 자율주행자동차의 동작 원리와 nVidia CNN을 이용한 딥러닝 모델을 적용한 자율주행자동차를 개발하였다. 자율주행자동차는 2채널 DC모터가 라즈베리파이의 GPIO 핀에 연결되어 있으며, 마우스를 이용하여 조향각을 구한 후 좌우측 모터의 속도를 조정하여 트랙을 자율주행하는 과정을 보여주었다. 라즈베리파이에서는 대량의 이미지를 기반으로 딥러닝 모델을 생성하기에 한계가 있기 때문에 저장된 이미지를 코랩에 업로드하여 T4 GPU를 이용하여 모델을 생성하였다. 생성된 모델은 다시 라즈베리파이에 전송되어 자율주행을 수행하도록 하였다. 다양한 주행특성을 살펴볼 수 있는 트랙을 제작하여 이미지를 학습하고 자율주행을 테스트한 결과 어느 단계에서도 트랙을 이탈하지 않고 모든 경로를 자율주행하는 결과를 얻었다. 향후 연구 주제로는 실제 자동차의 주행특성을 그대로 살릴 수 있는 좀더 큰 RC카를 사용하여 대형 트랙에서 자율주행을 수행하면서 자율주행의 제한속도, 물체, 교통신호 및 도로교통표시판 인식에 대해 연구하고, 소형 자동차에 적합한 다양한 딥러닝 모델을 적용하여 성능을 비교하고자 한다.

References

[1] S. K. Gehrig and F. J. Stein, “Dead reckoning and cartography using stereo vision for an autonomous car,” in Proc. IEEE/RSJ Int. Conf. Intell. Robots Syst. Hum. Environ. Friendly Robots High Intell. Emotional Quotients, Oct. 1999, pp. 1507–1512.

DOI: http://dx.doi.org/10.18208/ksdc.2020.26.4.189

[2] K. Jo and M. Sunwoo, “Generation of a precise roadway map for autonomous cars,” IEEE Trans. Intell. Transp. Syst., vol. 15, no. 3, pp. 925–937, Jun. 2014.

DOI : 10.37272/JIECR.2021.06.21.4.17

[3] M. Althoff and A. Mergel, “Comparison of Markov chain abstraction and Monte Carlo simulation for the safety assessment of autonomous cars,” IEEE Trans. Intell. Transp. Syst., vol. 12, no. 4, pp. 1237–1247, Dec. 2011.

DOI : https://doi.org/10.9717/kmms.2013.16.6.708

[4] Q. Li, L. Chen, M. Li, S.-L. Shaw, and A. Nuchter, “A sensor-fusion drivable-region and lane-detection system for autonomous vehicle navigation in challenging road scenarios,” IEEE Trans. Veh. Technol., vol. 63, no. 2, pp. 540–555, Feb. 2014.

[5] A. Borkar, M. Hayes, and M. T. Smith, “A novel lane detection system with efﬁcient ground truth generation,” IEEE Trans. Intell. Transp. Syst., vol. 13, no. 1, pp. 365–374, Mar. 2012.

[6] H. Yoo, U. Yang, and K. Sohn, “Gradient-enhancing conversion for illumination-robust lane detection,” IEEE Trans. Intell. Transp. Syst., vol. 14, no. 3, pp. 1083–1094, Sep. 2013.

[7] S. Sivaraman and M. M. Trivedi, “Integrated lane and vehicle detection, localization, and tracking: A synergistic approach,” IEEE Trans. Intell. Transp. Syst., vol. 14, no. 2, pp. 906–917, Jun. 2013.

[8] B. Grush and J. Niles, The End of Driving: Transportation Systems and Public Policy Planning for Autonomous Vehicles. Amsterdam, The Netherlands: Elsevier, 2018.

DOI : https://doi.org/10.48550/arXiv.1505.04597

[9] T. Litman, Autonomous Vehicle  Implementation  Predictions.  Victoria, BC, Canada: Victoria Transport Policy Institute Victoria, 2017.

[10] Vikrant  Shahane, Hrushikesh  Jadhav, Mihir  Sansare, Prathmesh  Gunjgur, 2022 6th International Conference On Computing, Communication, Control And Automation (ICCUBEA), Pune, India. Aug 26-27, 2022.

[11] Michael G. Bechtel, Elise McEllhiney, Minje Kim, Heechul Yun, “DeepPicar: A Low-cost Deep Neural Network-based Autonomous Car”, 2018 IEEE 24th International Conference on Embedded and Real-Time Computing Systems and Applications (RTCSA), 2018.
DOI: 10.1109/RTCSA.2018.00011

[12]Alfa Rossi, Nadim Ahmed, Sultanus Salehin, Tashfique Hasnine Choudhury, Golam Sarowar,  “Real-time Lane detection and Motion Planning in Raspberry Pi and Arduino for an Autonomous Vehicle Prototype”, arXiv.org, sep., 2020.
DOI: https://doi.org/10.48550/arXiv.2009.09391

[13] Mariusz Bojarski, et al., “End to End Learning for Self-Driving Cars”, arXiv:1604.07316, Apr, 2016.
DOI:10.48550/arXiv.1604.07316

[14] Lee, Sangil ; Nam, Kihun ; Jung, Jun Mo, “Implementation of handwritten digit recognition CNN structure using GPGPU and Combined Laye”, The Journal of the Convergence on Culture Technology (JCCT), Vol. 3, No. 4, pp.165-169, November 30, 2017.
DOI: https://doi.org/10.17703/JCCT.2017.3.4.165

이 논문은 2024년도 정부(산업통상자원부)의 재원으로 한국산업기술진흥원의 지원을 받아 수행된 연구임(P0017123, 2021년 산업혁신인재성장지원사업)