[임베디드 소프트웨어 대회] 자율주행자동차 부문 - 팀명:방울토마토맛있다

1. 프로젝트 목적
임베디드SW경진대회 자율주행 부문에 출전하여 수준 높은 자율주행 임베디드 소프트웨어를 만들고자 했다. 단순한 차선인식이 아닌 이번 대회에서 주어진 돌발상황들에 완벽히 대처할 수 있는 자동차를 개발하고자 하였다. 영상 크기 압축을 위해 NV12 포맷 사용, 체계적인 소프트웨어 구조를 통한 코드 가독성 및 유지보수 향상, 간결하고 정확한 차선 인식 알고리즘을 통한 성능 향상 등을 통해 대회에서 ‘특선상’을 수상할 수 있었다.
image

2. 개발 환경 및 시간
2020년 봄학기 종강 직후부터 개발을 진행했으며, 9월 말까지 최종 개발을 마치고, 12월 초까지 세부적인 성능 개선을 진행했다. 호스트 컴퓨터에서 코드를 작성하고 컴파일 한 다음, 임베디드 보드로 실행파일을 넘기는 방식으로 개발이 진행되었다. 호스트 컴퓨터는 Ubuntu 16.04 64bit를 설치하여 임베디드 보드 sdk를 설치하였으며, 임베디드 보드의 개발환경은 Linux OS TI (Texas Instruments) TDA2x (ARM Cortex-A15 Dual Core 1.5GHz) SMP mode 지원 DDR3 2GB, SD 메모리 16GB 이상, 카메라 CMOS HD급 (1280x720)으로 주어졌다. 또한, 자동차 제어 보드랑 임베디드 메인 보드랑 통신을 하기 위해서 UART 통신 제어 기반으로 통신이 이루어졌다.

3. 본론
해당 자율주행 자동차 프로젝트는 기존 방식들보다 우수한 점이 크게 4가지다.

a. NV12 영상 포맷을 이용한 영상처리 성능 및 처리 속도 개선

많은 영상 포맷들은 3채널을 사용하는 반면, NV12는 1.5채널만 사용한다. 이로 인해 연산 속도가 빨라지지만, U하고 V 채널은 원본 데이터의 75%를 사용하지 않으므로 데이터 손실이 일어난다. 하지만 chroma downsampling (2x2 pixel -> 1 pixel)을 진행하면서 4 픽셀들에 대한 평균값을 계산하여 픽셀 하나로 표현하는데 이는 평균 필터를 적용한 것과 동일한 효과를 나타내므로 노이즈 제거 및 연산 시간을 개선할 수 있었다. 그리고 TI TDAx2 보드에 있는 가속기를 활용하여 NV12 포맷을 얻었는데 이를 통해 CPU의 오버헤드를 줄일 수 있었다. 실제로 50% ROI를 사용하여 색상 이진화 영상을 출력할 시, 프레임당 3ms 정도의 시간이 소요되었고 일반 주행에서는 약 6ms 정도의 시간이 소요된다. 다른 팀들의 경우, 프레임 당 10ms~30ms의 시간이 소요됐는데 최대 5배 더 빠른 결과를 얻을 수 있었다. 아래 그림은 실제 NV12의 채널이 어떻게 구성되는지 간단하게 보여준다.
image

b. 체계적인 소프트웨어 구조를 통한 코드 가독성 및 유지보수 향상

대회 트랙 완주를 위해서는 다양한 과제를 수행해야 하고 차선을 이탈하지 않는 주행 알고리즘이 요구된다. 기존 수상 팀의 경우, 영상 스레드 및 센서 스레드를 사용하거나 NFA 상태도를 토대로 소프트웨어 구조를 설계했다. 그러나 해당 구조들은 코드 유지보수에 상당한 어려움이 있었을 것으로 추정되고 실제로 해당 구조를 응용해서 소프트웨어 개발을 진행할 시, 유지보수에 많은 어려움이 있었다. 그래서 우리 팀이 사용한 소프트웨어 구조 방식은 운영체제에서 쓰이는 user-level, kernel-level, 그리고 system call 개념에서 아이디어를 얻어 제작했다. 왼쪽 아래에 표현된 소프트웨어 구조를 이용하면 코드 간 계층도 명확해질 뿐만 아니라 스테이지 간 완벽한 추상화가 가능해지므로 유지보수에 큰 이점이 있었다. 그리고 오른쪽 아래에 서술된 그림을 토대로 자율주행 자동차를 구현하기 위한 기능들을 함수화했다.
image

c. 차선인식 알고리즘의 단순화

경기장 상황에 최적화되도록 알고리즘을 단순화시켰다. 노이즈에 취약하고 연산량이 느린 edge extraction이나 linear approximation (차선 직선화 근사) 대신 3등분 ROI를 기반으로 경우를 2^3가지로 단순화시켜 일차적으로 판단하고, 해당 경우에 맞추어 추가로 차선을 추정하였다. 결과적으로 알고리즘의 complexity를 낮춤으로써 직선 및 곡선 구간에서는 5~7ms/frame을 유지하며 95% 이상의 차선 인식 정확도를 확보하였다. 이는 개발 초기 행렬 연산을 통한 bird eye view 기법보다 빠르고 정확하게 판단한다.
image

d. 상황 변화에 견고한 알고리즘

대회 트랙 주행 중. 주차, 로터리, 터널, 추월차로, 신호등 판별 미션들이 존재한다. 해당 미션들을 무사히 통과하기 위해 해당 미션 수행 시, 실행속도보다 안정성에 더 중점을 두었다. 이를 통해 미션 성공률을 90% 이상 도달시킬 수 있었다.

4. 결과 및 결론

8월 말에 촬영한 주행 영상은 부록에 있는 QR 코드를 통해 확인할 수 있다. 전체적인 주행 성공률은 80%로 매우 높았으며 (20년 대회 결선의 경우, 완주 성공 비율은 25% 미만) 주행 속도도 빠른 편에 속했다. 그러나 코로나19로 인해 결선이 취소되면서 주행을 하지 못하고 ‘특선상’으로 마무리가 되어서 매우 아쉬웠다.