CVPR Workshop on Autonomous Driving 2023 – Tesla
Tesla에서는 이렇게 3차원 occupancy map을 만들어서 굴곡이나 객체 등을 인지하여 🚘자율주행을 하고 있습니다. 따라서, 그 축소판으로 프로젝트를 진행해봤습니다. - ⭐
Nvidia Jetson Orin Nano 8GB
Nvidia Jetracer
CSI Camera X 1
자율주행을 위한 파이프라인을 Perception, Calibration, Planning, Control의 네 단계로 구성하였습니다.
🚦 YOLOv8
Object Detection 모델로 YOLOv8을 사용했습니다. YOLO는 실시간 객체 탐지모델로, 추론 속도가 빠르다는 장점이 있어서 자율주행에 적합합니다. YOLO로 차량, 보행자, 신호등 등의 객체를 탐지하며, 각 객체의 위치를 Bounding Box로 표시하고, 신뢰도를 나타내는 Confidence Score와 함께 클래스 정보를 제공합니다.
🛣️ Ultra Fast Lane Detection (UFLD)
Lane Detection 모델로 UFLD를 사용했습니다. UFLD는 이미지를 여러 row anchor로 나누고, row anchor에서 차선의 존재여부를 먼저 확인합니다. 그 후 차선이 없는 anchor에 대한 연산은 진행하지 않습니다. 차선이 있는 anchor에 대해서는 그리드를 만든 후, 각 셀에 차선의 존재여부를 추가로 예측합니다. 픽셀 단위의 segmentation이 아니라 특정 anchor의 셀을 선택하며 탐지하기 때문에, 연산량이 줄어 추론 속도가 빠른 모델입니다.
🚧 Metric3D
Depth Estimation 모델로 Metric3D를 사용했습니다. Metric3D로 정확한 깊이를 추정하여 depth map을 생성했습니다. 이때, Depth map은 각 픽셀의 거리 정보를 포함합니다. 이를 통해 차량과 전방 물체 간의 상대적인 거리를 파악할 수 있습니다.
🤔 하지만 바닥과 물체가 구분이 안되시죠?
깊이값만으로는 지면으로부터의 높이를 알 수 없기 때문에에 이런 현상이 발생합니다.
이를 해결하기 위해, occupancy map이라는 지도를 만들어야 합니다.
Occupancy Map
Occupancy Map은 물체의 존재 여부를 표현하는 지도입니다. 3D 객체를 Voxel(Volume + Pixel) 단위로 나누어 표현한 후, 이를 위에서 내려다본 형태로 변환하면 Occupancy Map이 생성됩니다. 따라서, 물체의 점유 여부가 지도에 표현됩니다.
차량은 Occupancy Map으로 도로의 상황을 파악하고, 장애물이 있는 Occupied 영역을 피해 최적의 주행 경로를 계획합니다.
Occupancy Map을 생성하기 위해 먼저 Depth Map과 카메라의 내부 파라미터 정보로 World 좌표계를 생성합니다. 이때 world 좌표계는 (x, y, z)의 3D 좌표를 가지며, point cloud 형태로 표현됩니다. 마지막으로, World 좌표계를 xz 평면으로 projection하면 Occupancy Map이 생성됩니다.
⚙️ A* Algorithm
Planning 단계에서는 A* Algorithm으로로 경로를 계획했습니다. A* 알고리즘은 출발 노드부터 목표 노드까지 가는 최단 경로를 찾는 알고리즘입니다.
⚙️ A* Algorithm + Occupancy Map
A* Algorithm으로 전체 경로를 생성한 후, 경로를 따라가는 중에 장애물을 마주치면 장애물이 적은 쪽으로 방향을 전환합니다. 이때 장애물은 Occupancy map으로 파악합니다.
🛠️ PID 제어기
Control이란 시스템을 원하는 상태로 바꾸는 과정으로, 차량이 원하는 특정 경로, 속도, 방향을 따르도록 하는 과정입니다. 이때, PID 제어기는 피드백 제어기 중 하나로, output과 설정값의 오차를 계산하여 피드백을 반복적으로 제공하여여 목표값에 도달하도록 합니다.
🚗 Jetracer를 주행하면서, 11243장의 주행 데이터 사진을 촬영하였습니다.
🚦 Object Detection - YOLOv8
🛣️ Lane Detection - UFLD
🚧 Depth Estimation - Metric3D
Overall Inference Time
Object, Lane, Depth, Planning의 engine을 통합하여 Autonomous Engine을 생성했습니다.
Object, Lane, Depth에서 이미지 frame을 input으로 받습니다.
Object는 표지판, 신호등에 따라 차량이 주행해야하는 speed를 반환합니다. Lane은 lane mask를 반환하여 Depth에 전달하고, Depth는 depth map을 반환합니다. Depth map과 lane mask로 Occupancy map을 생성하여 Planning에 전달합니다. Planning에서는 speed와 steer 값을 반환합니다. 최종적으로 Ego(차량)에 speed와 stter 값이 전달되어 제어가 가능해졌습니다.
Autonomous Engine을 실행했을 때의 결과입니다. Occupancy map에서 차선은 노란색으로 시각화하였고, 장애물은 하얀색으로 시각화했습니다. Planning을 통해 얻은 차량의 경로는 빨간 선으로 시각화했습니다.
ResNet-18
기존의 차선 탐지 방법 대신, ResNet-18을 사용하여 차선의 중심 좌표를 예측하는 방법을 시도해봤습니다.
예측한 중심좌표 (x, y) 표시
차량이 가야하는 방향을 시각화한 영상