대회 내용
- 실외 트랙 기반 자율주행 경진대회
- ROS 기반의 자율주행 알고리즘 경쟁
- 차선 주행 및 장애물 인식 등의 자율주행 미션
ROS란?
로봇 운영체제(ROS,Robot Operating System)는 로봇 응용 프로그램을 개발할 때 필요한 하드웨어 추상화, 하위 디바이스 제어, 일반적으로 사용되는 기능의 구현, 프로세스간의 메시지 패싱, 패키지 관리, 개발환경에 필요한 라이브러리와 다양한 개발 및 디버깅 도구를 제공한다. 요기를 참고
우리는 ROS를 사용한 RC차를 개조하여 만든 1/10스케일카를 사용해서 대회를 진행했다. 실제 스케일카를 본격적으로 사용하기전 MORAI Simulation Program을 사용해서 ROS 기반의 스케일카를 안전하게 실험해볼수 있었다. MORAI Simulation Program은 실제 센서 및 차량의 프로토콜과 동일하게 사용할 수 있고 custom으로 날씨를 설정해서 실험해볼 수 있었다. https://www.youtube.com/watch?v=gSVtlqNNpBU
오리도리 주행영상
https://www.youtube.com/watch?v=H4vQbUzjLGc&t=26s
자율주행이란?
자율주행의 3단계 핵심기술은 인지 > 판단 > 제어이다.
- 인지 - 복합적인 센서 기술로 근거리 및 원거리 물체들을 정밀하게 파악
- 자율주행 차량은 차량에 장착된 레이더, 라이다, 카메라, GPS 및 초음파 센서 등 다양한 종류의 센서들을 통해 주변 환경을 인식한다.
- 판단 - 인간 수준의 주변 환경 파악 및 운전 방법 학습으로 완성도 높은 자율주행 구현
- . 머신러닝 또는 딥러닝 인공지능을 사용하여 자율주행 차량이 인식한 대상의 종류와 의미를 정확하게 파악한다.
- 제어 - 인식 및 판단 결과에 따른 자율주행 시스템의 작동
- 자율주행 기술의 마지막 단계는 자율주행 시스템이 인식하고 판단한 대로 차량을 움직이게 만드는 것이다. 자율주행 시스템의 제어 영역은 다른 영역과 실시간으로 통신하면서 차속 조절, 조향, 제동, 운전자 알림 등에 대해 명령 받은 대로 작동한다.
주요 센서
자율주행자동차는 사람의 눈을 대신해서 다양한 센서를 사용한다. lidar, 레이더, 카메라, 초음파 센서, GPS이다. 각도와 거리에 따라 센ㄴ서의 장착위치와 역할이 달라진다. 이 센서들은 연구 기관에 따라 각각 다양하게 조합돼 장착된다.
- Lidar
- Lidar 센서는 레이저 빔을 방출하여 거리를 측정하고 주변의 상세한 3차원 지도를 만든다. 이는 객체 감지, 위치 파악 및 매핑에 중요하다.
- 레이더(무선 탐지 및 거리 측정)
- 레이더 시스템은 전파를 사용하여 물체의 존재, 거리 및 속도를 감지한다. 다양한 기상 조건에서 효과적이며 장거리 탐지에 자주 사용된다.
- 카메라
- 카메라를 활용한 비전 기반 시스템은 시각 환경을 인식하고 이해하는 데 필수적이다. 카메라는 차선 감지, 객체 인식, 교통 표지판 인식, 보행자 감지 등의 작업에 사용된다.
- 초음파 센서:
- 초음파 센서는 음파를 사용하여 차량 가까이에 있는 물체를 감지한다. 일반적으로 주차 지원 및 저속 기동에 사용된다.
- GPS(Global Positioning System)
- GPS 수신기는 정확한 위치 정보를 제공하여 탐색 및 위치 파악에 도움을 준다.
실전 대회내용
주요 코드 https://github.com/Ori-dori/scale-car
메인(판단) - main_class_hsv.py
차선 인식 - slidewindow.py
표지판 인식 - child_sign.py
장애물 인식 - detect_clust_obs.py
라바콘 주행 - rabacon_drive.py
lidar clustering - https://github.com/tysik/obstacle_detector
master branch - 실험 코드
대회 미션
- 도로 주행
- 어린이 보호구역
- 동적장애물
- 라바콘 미션
- 정적장애물
➞ 우리가 사용한 센서 : 카메라, 라이다, 레이더
1. 도로주행 코드
자율주행 자동차의 가장 기본인 차선인식과 도로주행은 slidewindow를 사용하여 진행하였다.
https://www.youtube.com/watch?v=o_7yGlyF0wI
- 차선인식 방법
- window의 사이즈를 정해준다(높이 , 넓이)
- 이미지에서 픽셀값이 0이 아닌 부분의 좌표를 찾는다. img.nonzero()
- 왼쪽과 오른쪽 차선을 모두 인식하여 잘 인식한 것을 저장한다.
- 만약 현재 왼쪽 차선을 더 잘 인식하고 있다면 차량이 도로의 왼쪽에서 주행 중 , 오른쪽 차선을 더 잘 인식하고 있다면 차량이 도로의 오른쪽에서 주행 중이라고 표시
- window안의 픽셀값들 중 0과 1 둘중에 어떤것이 더 많이 들어있는지 파악하면서 x,y좌표의 평균을 귀해 차선의 중심을 인식
- 위 과정을 반복
2. 어린이 보호구역 코드
어린이 보호구역은 비교적 쉽게 처리할 수 있었다. 표지판을 보고 차량이 어린이 보호구역을 인식하여 특정구간 동안 차량의 속도를 느리게 제어하는 것이였다. 이번 대회에서는 실제 표지판과 달리 쉽게 인식할 수 있는 QR코드 형태의 표지판이 제공되었기 때문에 해단 코드를 인식하면 main_class_hsv.py 에서 차량의 속도를 제어해주었다.
3. 동적장애물 코드
lidar clustering을 사용하여 동적 장애물을 인식하였다.
- 동적 장애물 인식
- 동적 장애물의 왼쪽 기둥을 인식
- 라이더 cluster결과값을 사용해 cluster된 것의 x값의 중심이 -1.3에서 0사이라면 장애물이 있는것으로 판단하여 self.point_cnt값을 늘려줌
- WARNING_CNT 값이 일정 수준 이상올라가면 동적 장애물이 있는 것으로 판단
4. 라바콘 코드
라바콘 미션에서는 솔직히 우연이 많이 따랐다. 먼저 라바콘이 스케일카 앞에 등장하면 스케일카는 해당 라바콘을 정적 장애물로 인식하고 반대 방향으로 주행차선을 바꾼다.(여기서 반대 방향이란 왼쪽에서 주행중이면 오른쪽으로, 오른쪽에서 주행중이면 왼쪽을 의미) 그 이후 차선을 변경하면서 주변에 있는 라바콘을 lidar clustering을 통해 들어온 값으로 인식하기 시작한다.
- 라바콘 인식
- left_rabacon과 right_rabacon List를 만든다.
- center.y가 0~1사이이면 left_rabacon에 값을 추가, center.y가 -1~0사이이면 right_rabacon에 값을 추가하여 오른 쪽 왼쪽 rabacon을 분리한다.
- left_rabacon과 right_rabacon의 값이 1 이상이 되면 입력된 값을 오름차순 정렬여 가장 가까이에 있는 라바콘이 무엇인지 파악한다.
- 가장 가까이에 있는 rabacon의 y좌표의 중심값을 전달해 스케일카가 이동하게한다.
5. 정적 장애물
- 정적 장애물 인식
- lidar cluster을 통해 수집한 정보로 스케일카 앞에 물체가 몇초 이상 있으면 정적 장애물이 있는 것으로 판단
- 장애물을 인식했다면 현재 주행차선과 반대방으로 차선을 변경 (여기서 반대 방향이란 왼쪽에서 주행중이면 오른쪽으로, 오른쪽에서 주행중이면 왼쪽을 의미)
6. lidar clustering
github의 코드를 참고하였다. lidar의 들어온 값을 바탕으로 가까이에 있는 circle들을 묶어서 하나의 큰 circle로 만들었다.
https://www.youtube.com/watch?v=VGmjyVfuGVA
회고
좋았던 점
자율주행 자동차를 약식으로 경험해 볼수 있어서 좋았고 직접 카메라와 라이더 센서를 사용하여 다양한 현실세계의 문제들을 해결해 볼수 있는 점이 좋았다.
ROS를 사용해서 로봇기반의 하드웨어를 경험할 수 있는 것이 값졌다.
실제 야외환경에서 직접 실험해본 결과 날씨에 따라 햇빛의 양이 달라지기 때문에 카메라 센서에 들어오는 정보의 값이 달라졌다. 이런 현실의 문제에대한 정보를 얻을 수 있어서 좋았다.
아쉬운 점
팀원들중에 git을 제대로 사용할 수 있는 사람이 없어서 git을 사용하지 않고 계속 로컬에 파일을 저장하는 방식으로 프로젝트를 진행했는데 확실히 버전 관리가 어려웠다. 그래서 실제 프로젝트를 진행할 때 같은 내용의 파일인데도 버전에 따라 다 따로 관리를 하는 바람에 정작 어떤것이 최종본인지 알기 어려웠다. 어느 부분을 수정했는지도 명확히 알 수 없었다. 또한 한번 스케일카의 라즈베리파이가 불안정하여 파일이 날라 갔었는데 그때는 진짜 복구 못하는 줄 알았다. git의 중요성을 다시 한번 깨달았던 순간이다.
사실 위에 설명에서도 알수 있겠지만 우리가 작성한 코드는 이 대회에 초점을 맞혀져 있는 상당한 하드코딩이다. 동적 장애물 문제도 갑자기 튀어나오는 장애물에 초점을 맞춘것이 아닌 기동 장치를 인식하여 처리되는 부분이였고 정적 장애물 미션도 차선이 2가지인 상황에 맞춰서 오른쪽 왼쪽으로만 구분되어 있다. 그래서 좋은 성적은 얻을 수 있었지만 만약 주행 환경이 변화했다면 잘 작동하지 않을 것이다.
팀프로젝트로 진행되는 만큼 5명의 인원이 함께 진행했다. 우리는 스케일카에 연결된 컴퓨터로만 실제 실습이 가능했기 때문에 노트북 한대로 코드를 실행해 볼수 있는 환경이였다. 만약 git을 사용했다면 다른 컴퓨터에서 다른 코드를 작성하고 실습은 메인 컴퓨커로 진행하는 등 효율적인 시간관리가 가능 했을 텐데 그 점이 아쉽다.
'프로젝트' 카테고리의 다른 글
AIFFELthon(1) 미니 DS분석 춘천 (0) | 2023.11.23 |
---|