#미션 소개
대회에서는 예선과 본선 ( 본선과 결선 )으로 나누어 진행되었다. 예선과 본선에서는 다른 시나리오를 불러와 각 팀에서 구현한 자율주행 시스템을 평가하였다. 시나리오 난이도는 예선에서는 거의 모든 팀이 완주할 수 있을 만큼 난이도였으며 본선에 올라갈 4개의 팀은 충돌이 없었던 팀 중 랩타임이 적은 팀이 올라갔다.
예선과 본선의 미션을 정리하면 아래와 같다.
# 예선
- 차간 간격 유지 1
- 정적 장애물 회피
- GPS 음영 구역 1
- 동적 장애물 회피
- 차간 간격 유지 2
- 정지
# 본선
- 차간 간격 유지 1
- 정적 장애물 회피
- GPS 음영 구역 1
- 주차
- 차간 간격 유지 2
- GPS 음영 구역 2
- 신호등
- 돌발 장애물
- 정지
미션 별 주행 영상은 아래와 같다. LiDAR만을 활용하여 주행한 미션에 대해서는 직접 준비한 것이니 자세히 정리하지만 카메라 팀에서 준비한 미션에 대해서는 영상과 함께 간략한 정리만 하겠다.
#차간 간격 유지 1,2
차간 간격 유지 구간에서 뿐만 아니라 모든 주행에 있어 ego 차량이 따라가는 global path를 기준으로 좌우 6m와 현재 ego 차량의 global path 상에서 index보다 30 큰 것 부터 200까지 (gps 기준 약 3m 앞부터 약 20m내의 범위 영역)에 위치한 object 정보를 publish 하도록 한다.
이 이유는 차간 간격 유지 판단 제어 알고리즘에서 물체와 ego 차량간의 거리를 기반으로 차량의 속도를 제어하는데 뒤에 있거나 바로 옆에 존재하는 물체를 인식해버리면 물체와 충돌할 일이 없지만 거리가 가깝다는 이유로 정지해버리는 문제가 발생하였기 때문이다.
차량은 tracking 되어 정보가 publish되며 물체가 어느 한 프레임에서 탐지 되지 않더라도 이전 5개 frame에 해당 물체가 있다면 EKF를 활용해 다음 위치를 추정하여 publish한다.
# 정적 장애물 회피
정적 장애물 회피는 말 그대로 해당 구간에 존재하는 장애물을 회피하는 미션으로 위의 영상을 보면 잠깐 멈췄다가 장애물을 탐지한 후 장애물의 위치를 반영하여 회피 경로를 만들어 주행한다.
영상에서 노란색 영역이 길어지는 것을 볼 수 있는데 이는 멀리 있는 장애물도 한번에 탐지하기 위함이다. 이 구간에서는 Object detection을 위한 clustering parameter도 좀 더 민감하게 장애물을 탐지할 수 있도록 설정하였다.
# GPS 음영 구역 1, 2
GPS 음영 구역에서는 GPS의 data 중 latitude와 longitude값이 0으로 고정되어 GPS로 ego 차량의 location정보를 알 수 없다. 이를 해결하기 위해 wall following 이나 lane tracking 등 여러 방법을 고민을 해 보았으나 위험 요소가 존재하여 LiDAR로 ego 차량의 위치를 추정하는 방법을 활용하였다.
해당 방법에는 NDT_localization이 활용되었으며 이는 github에서 검색하여 찾아볼 수 있다. NDT Localization의 경우 미리 생성한 PCD map에서 실시간으로 현재 위치를 LiDAR scene을 downsampling 한 것과 비교하여 현재 ego 차량의 pose 정보를 추정한다.
ndt localization애 활용할 PCD map은 이전 포스팅에서 정리한 PCD map과는 다르게 GPS음영 구역의 poincloud만으로 구성되어있다. 또한, PCD map을 만들때 voxel의 size를 더 크게 설정하였다.
그 이유는 실시간성 확보를 위함으로 기존에 만든 PCD map을 활용하면 point cloud가 많아서 그런지 연산이 오래걸려 pose 추정이 어긋나는? 그런 현상이 발생하여 차량의 위치가 막 공중에 있다고 추정하거나 빙빙 돌아버려 pose 추정이 안되는 문제가 발생하였기 때문이다.
위의 영상은 ndt localization을 활용하여 차량의 pose를 추정하여 tf로 publish하는 것으로 영상을 보면 차량의 움직임이 잘 반영되어 rviz에 시각화되는 것을 볼 수 있다.
본선에서 GPS 음영 구역이 가평가와 예선 때와는 달리 곡선이 추가되어 난이도가 어렵게 나왔다.
만약 S자 코스를 대비 했더라면 정적 장애물 회피에서 사용한 코드를 응용하여 global path에 장애물이 있는 경우 새로운 path를 만들어 주행하는 식으로 미션을 해결했을 것이다.
# 동적 장애물 회피
처음에는 LiDAR만으로 EKF를 통해 tracking한 물체의 1초 뒤 위치를 기반으로 긴급 정지를 할 수 있도록 설계하였다. 해당 코드도 잘 작동하였으나 본선에 있는 돌발 장애물을 대비하기 위해 아무때나 물체가 앞에 있다고 냅다 긴급정지 해버리면 랩타임이 느려지는 문제가 발생할 수 있기 때문에 camera와 LiDAR를 활용하여 돌발 장애물과 동적 장애물 미션을 해결하였다.
# 주차
주차 가능 구역을 탐색하기 위해 우선 주차 구역을 PCD map과 point_clicker.py를 활용하여 txt파일로 저장하였다.
ego 차량과 가장 가깝고 거리가 10m안의 주차 구역 3개를 후보로 장애물이 없어 주차 가능한지 확인한다.
이때 PCL라이브러리의 nearestSearch()를 활용하여 해당 주차 구역 중심점에서 가까운 100개의 점을 불러와 해당 점이 주차 구역 안에 존재하는지 Ray Casting Algorithm을 활용하여 판단하였다.
위의 영상에서 자세히 보면 rviz상에 파란색으로 주차 가능 구역의 양 끝 입구 점이 SPHERE로 시각화되는 것을 확인할 수 있다.
# 돌발 장애물
돌발 장애물 미션에서는 동적 장애물 미션과 같은 코드를 사용하였다. image에서 yolo를 활용해 사람과 동물을 detection하고 LiDAR와 sensor fusion을 통해 해당 물체와 특정 거리 범위 안에 있다면 긴급 제동한다.
아쉬운 점은 여기에 물체의 위치를 EKF를 통해 tracking 한다면 더 빨리 멈출 수 있다고 생각하지만 위의 영상에서 볼 수 있듯이 이미 잘 멈추기 때문에 적용하지 않았다.
# 신호등
신호등 미션은 딥러닝을 사용하지않고 영상처리 방법으로 미션을 해결하였다.
'플젝 > SHARK 대회' 카테고리의 다른 글
2024_SHARK_LiDAR 전체 프로세스 flow chart 및 정리 (0) | 2024.09.02 |
---|---|
2024 SHARK 자율 주행 대회 (1) | 2024.08.29 |