[프로젝트] LIMO 자율주행 프로젝트
Demo
데모 주행 영상
전체 트랙 주행
차선 인식과 조향 제어를 통합한 전체 트랙 주행
Problem
문제 정의
실험 트랙에는 흰 배경, 지그재그 차선, 넓어지는 도로, 장애물이 함께 존재했고, 카메라 기반 차선 인식만으로는 오인식과 제어 진동이 반복되어 센서별 역할을 분리한 주행 파이프라인이 필요했다.
- 차선 오인식 흰색 트랙 배경과 출발선, 장애물 배치 구역을 차선으로 오검출
- 코너링 불안정 조향각 한계와 PID 튜닝 문제로 직진 구간 진동과 코너 진입 실패
- 장애물 회피 한계 LiDAR 단독 판단의 공간 구분 한계로 무한 전진·후진 루프 발생
Architecture
시스템 구조
RGB 카메라는 차선 중심을 계산하고, LiDAR는 장애물 접근을 트리거하며, Depth 카메라는 좌·중·우 빈 공간을 판단해 최종 제어를 ROS2의 /cmd_vel 메시지로 통합했다.
Implementation
구현 범위
트랙 환경에서 실제로 실패한 지점을 기준으로 원본 패키지의 인식·판단·제어 코드를 수정했다.
차선 인식 파이프라인 재구성
BEV·ROI·HLS·Canny·HoughLinesP 조합과 기울기·중심 margin 기반 좌우 차선 분리
PID 기반 조향·속도 제어
차선 중심 오차를 이용한 조향각 계산과 코너 구간 감속
LiDAR 트리거와 안전 후진
전방 0.3m 이내 장애물 감지와 차선 이탈 시 안전 후진
Depth 카메라 기반 빈 공간 판단
좌·중·우 Depth ROI의 픽셀 합을 비교한 빈 공간 선택
ROI 기반 차선 인식
RGB 영상을 BEV로 변환하고 필요한 구간만 계산해 차선 후보를 안정적으로 추출
좌우 차선 분리
중앙 margin과 직선 기울기를 함께 사용해 왼쪽·오른쪽 차선을 구분했다.
검출 실패 보완
한쪽 차선이 사라질 때 이전 프레임의 이동평균으로 주행 판단을 안정화
Depth ROI 회피 판단
장애물 접근 시 Depth 판단을 활성화하고 좌·중·우 영역을 비교해 빈 공간으로 이동
Debugging
문제 해결 과정
실제 주행에서 발생한 문제를 프레임별 디버깅 화면과 주행 영상으로 확인하고, 실패한 접근의 원인을 다음 설계에 반영했다.
흰 배경을 차선으로 오인식
- 발생한 문제
- HLS 색상 범위만으로 차선을 분리하자 트랙 중앙과 외곽의 흰 배경, 출발선과 장애물 배치 구역까지 차선 후보에 포함됐다.
- 해결 과정
- HLS 마스크에 Canny Edge를 결합해 경계 성분만 남기고, BEV·ROI와 Hough 직선 검출을 적용했다. 실제 트랙을 보며 밝기 범위도 다시 조정했다.
- 얻은 교훈
- 색상 임계값 하나에 의존하기보다 색과 형상 조건을 함께 사용하고, 실제 환경에서 발생하는 유사한 색의 구조물까지 검증해야 했다.
지그재그와 한쪽 차선 소실
- 발생한 문제
- 지그재그 구간을 여러 차선으로 인식했고, 도로가 넓어져 한쪽 차선이 사라지면 기존 로직이 이를 좌·우회전으로 잘못 판단했다.
- 해결 과정
- ROI에는 지그재그 한 패턴만 들어오도록 범위를 좁혔다. 직선의 기울기와 중앙 margin으로 좌우 차선을 구분하고, 검출이 끊기면 최근 대표 직선을 사용했다.
- 얻은 교훈
- 한 프레임의 검출 결과만으로 판단하면 순간적인 차선 소실에 취약했다. 이전 프레임의 상태를 보존하는 fallback이 주행의 급격한 변화를 줄였다.
직진 진동과 부족한 조향각
- 발생한 문제
- 차선 중심 오차를 사용한 초기 PID 제어로도 좌우 진동이 남았고, 코너 진입 시점이 빨랐다. 실제 조향 범위와 바퀴 정렬에도 한계가 있었다.
- 해결 과정
- ROI와 제어값을 다시 조정하고 회전량에 따라 속도를 낮췄다. 차선 기울기와 최근 대표선의 가중치를 조향에 반영하고, 이탈 가능성이 있을 때는 안전 후진을 사용했다.
- 얻은 교훈
- 제어 문제를 gain만으로 해결하기보다 인식 범위와 실제 구동계의 한계를 함께 확인해야 했다. 불확실한 상황을 위한 안전 동작도 제어기의 일부였다.
LiDAR 단독 회피의 무한 루프
- 발생한 문제
- LiDAR 데이터를 두 노드로 나누는 시도에서는 point cloud queue 문제가 발생했다. 단순 우측 후진 방식은 전진·후진을 반복했고, 중앙 통로도 장애물로 판단했다.
- 해결 과정
- 드라이버 구성을 원상복구하고 LiDAR ROI를 전방으로 좁혔다. LiDAR는 접근 감지와 안전 후진만 담당하고, Depth 카메라가 좌·중·우 빈 공간을 비교해 회피 방향을 선택하도록 역할을 분리했다.
- 얻은 교훈
- 센서 수를 늘리거나 데이터를 복제하는 것보다 각 센서가 잘하는 판단을 분리하는 편이 안정적이었다. 임시 보정의 한계가 반복되면 판단 구조 자체를 바꿔야 했다.
Results
검증 결과
차선 기반 주행 흐름을 통합하고, 좌측·중앙·우측의 빈 공간이 달라지는 회피 상황을 각각 테스트했다.
장애물 회피 동작
LiDAR 트리거와 Depth ROI 판단을 결합한 회피 동작
좌측 공간 회피
왼쪽 영역이 비어 있는 상황의 회피 방향 선택
중앙 공간 통과
좌우 장애물 사이의 중앙 빈 공간 통과
우측 공간 회피
오른쪽 영역이 비어 있는 상황의 회피 방향 선택
Retrospective
핵심 역량
실제 주행 실패를 분석하고 센서 처리, 판단 기준, 제어값을 반복적으로 개선했다.
카메라·LiDAR·Depth 데이터의 강점에 맞춘 역할 분리
오인식·진동·무한 루프 등 실제 하드웨어 문제의 단계적 디버깅
노드·토픽·launch·파라미터를 연결한 주행 시스템 구성
Future Plan
댓글 남기기