[객체인식 & Depth Estimation 프로젝트] 7. 전체 알고리즘

happy_quokka·2024년 1월 29일
0

자율주행 프로젝트

목록 보기
13/15

객체인식 & Depth Estimation 경진대회 규정

주행 코스

목표

  • 목표1 : 객체를 인식하여 자율주행
    • 모든 차량은 출발지점의 정지선에서 신호 대기 -> 정지선 인식
    • 신호등의 출발 신호에 맞춰 출발 -> 신호등 인식
    • 제시되는 표지판의 내용대로 정지, 좌, 우 조향 제어 -> 표지판 인식
    • 동적 장애물은 갑작스레 등장할 예정 -> LiDAR를 사용하여 장애물 인식
  • 목표2 : 차량주변의 객체 위치정보를 Bird’s Eye View로 표현
    • 트랙을 주행하며 주변 객체의 정보를 인식 -> object detection
    • BEV에 객체 정보 표현
    • 객체는 2D로 X,Y 좌표만 표현 (Point로 표현) -> depth 추정

점수 산정 기준

  • 합산한 과태료가 가장 적은 팀이 우승이다


전체 알고리즘

1. LiDAR로 장애물 인식

  • 갑자기 튀어나오는 장애물이나 차선 안에 주차되어 있는 차량 장애물을 인식하는 것은 다른 것들에 비해 가장 우선으로 인식되어야 한다
  • 2가지 상황에 따른 대처
    • 갑자기 튀어나오는 장애물 -> 정지
    • 차선 안에 주차되어 있는 차량 -> 회피 주행

LiDAR 알고리즘

  • LiDAR의 앞쪽 60도를 인식하여 차량 장애물과 돌발 장애물 인식
  • 차량 장애물의 경우
    • 오른쪽 30도의 LiDAR 값이 0.4보다 작은 값의 개수가 10개 이상이면 물체가 있다고 판단하여 회피 주행
    • 왼쪽 30도의 LiDAR 값이 0.4보다 작은 값의 개수가 10개 이상이면 물체가 있다고 판단하여 회피 주행
  • 돌발 장애물의 경우
    • 왼쪽, 오른쪽의 총 60도의 l값이 0.4보다 작은 값의 개수가 40개 이상이면 앞쪽에 물체가 있다고 판단하여 정지

2. 정지선 인식

  • 정지선을 인식하면 3초 정지하였다가 출발
  • 강제로 0.5초 동안 주행하도록 설정하였다. 이렇게 하지 않으면 그 다음 프레임에서도 정지선이 인식되어 계속 멈춰있기 때문이다
  • 표지판이 감지되지 않을 경우에만 정지선 인식으로 판단한다
  • 표지판이 있을 경우, 해당 표지판에 따라 행동해야하기 때문이다

정지선 인식 방법

  • 차선을 인식하는 ROI 부분에서 검출된 직선이 평행에 가까울 때 정지선이라고 판단
  • 기울기가 0.02보다 작고 그 선의 길이가 160보다 클 때 정지선이라고 판단

3. Object(표지판, 신호등, 차) 인식

  • YOLO v7 모델로 예측한 object의 id와 bounding box 정보를 메세지로 받는다
  • 추가로 계산한 depth도 메세지로 같이 받는다
  • 이 메세지를 활용하여 어떤 object인지 자이카와의 거리가 어떤지를 파악하여 object에 맞는 알고리즘을 지정해주었다
  • 신호등 (red light, green light, yellow light)
    • 초록불 : 전진
    • 빨간불 : 정지 (초록불이 들어올 때까지 정지)
  • 정지 표지판 (stop)
    • 3초 정지 후 전진
  • 횡단보도 표지판 (crosswalk)
    • 3초 정지 후 전진
  • 오른쪽 표지판 (right)
    • 2초 동안 오른쪽으로 회전 후 전진
  • 왼쪽 표지판 (left)
    • 2초 동안 왼쪽으로 회전 후 전진

4. default

  • 기본적으로 위와 같은 상황이 아니라면 차선을 인식하여 주행

결과 성적

  • 최종 2등을 하였다!!
  • 차선을 한번 이탈하고, 돌발 장애물과 충돌하여 최종 과태료가 6만원이 나왔다


어려웠던 점

교차로 구간

차선이 안보이는 문제

  • 교차로 구간에는 차선이 없는 부분이 많고 회전시 차선이 안보이는 문제도 같이 발생하기 때문에 어려웠다
  • 2초 또는 3초 동안 회전하도록 지정해주었다
  • 추후에 칼만 필터를 적용하여 현재 자신의 위치를 파악하고 그에 맞도록 주행하도록 개선하고 싶다
  • 또한 시간 문제를 해결하면서 지속적으로 프레임을 받아 올 수 있기 때문에 차선이 보일 때까지 강제로 회전하고 차선이 보인다면 차선 주행을 하는 방법으로도 수정하고 싶다

표지판의 위치

  • 표지판의 위치가 차선의 오른쪽 또는 왼쪽에 위치하는 경우도 있고 차선 앞쪽에 위치하는 경우도 있었다
  • 이 경우에는 depth가 다르게 추정되기 때문에 depth에 조건을 주는 것이 어려웠다
  • 따라서 표지판이 앞에 있는 경우로 판단되면 depth을 조금 늘려주는 방법을 통해 해결하였다

시간 관련 문제

  • 몇 초 동안 회전하고 주행하도록 설정하였는데 이때 시간을 계산하는 함수를 처음에 ctime의 time()을 사용하였다
  • 하지만 time() 함수는 1초 단위로밖에 조절할 수가 없고 그 사이에 sleep(1)을 사용하였더니 sleep되는 동안 다른 알고리즘은 멈춰버리는 문제가 있었다
  • 이를 ctime의 clock()으로 바꾸니 문제가 해결되었다

하드웨어 문제

자이카 바퀴

  • 오른쪽으로 회전할 때 바퀴가 최대로 꺾이지 않는 문제가 있어서 우회전을 할 때 제대로 회전하지 못하였다
  • 또한 좌회전과 우회전의 정도가 달랐기 때문에 이를 맞추는 과정이 어려웠다
  • 하드웨어 문제는 바로 해결할 수 없었기 때문에 좌회전의 각도를 최대 50이 아닌 조금 더 낮은 값으로 설정하여 양쪽의 비율을 맞춰주었다

라이다

  • 라이다에서 앞의 오른쪽 값이 제대로 들어오지 않았다
  • 이는 더 확인을 해봐야하는 문제지만 반대인 왼쪽은 값이 잘 들어오는데 오른쪽은 잘 들어오지 않아서 돌발 장애물과 차량 장애물을 회피하는 부분이 아쉬웠다

향후 하고 싶은 작업

  • 칼만 필터를 적용하여 차선이 보이지 않을 때 발생하는 문제를 해결하고 싶다
  • 표지판의 위치에 따라 depth를 다르게 계산하여 더 정확한 depth를 구하고 싶다
  • 전체적인 코드를 깔끔하게 작성하고 싶다
  • 라이다의 정확도를 높이고 싶다

0개의 댓글