안녕하세요, 코딩하는너굴맨 입니다.
4학년에 진행하던 자율주행 프로젝트가 끝났습니다.
이전에 포스팅을 하던 자율주행 차량은 진행하는 프로젝트와 맞지 않아,
자율주행에 대한 지식을 참고로 하고 새로운 방식으로 시작을 했습니다.
이 포스팅은 그에 대한 정리본이라고 생각하시면 됩니다.
목표
전체적인 목표는 자율주행 차량의 구현 입니다.
우선순위로는
1. 주행의 자율주행
2. 장애물에 따른 제어
3. 신호의 인식에 따른 제어
해당 순서에 따라서 과제를 진행했습니다.
1. 하드웨어
1. 자동차 하드웨어
자동차의 하드웨어는 waveshare사의 JetRacer를 사용했습니다.
자동차 자체를 3D프린터로 제작을 하려고 생각이 나왔으나..기각 되었습니다...
이전 포스팅에서 썼던 차량의 경우는, 앞바퀴에 서보모터, 즉 좌회전 우회전의 기능을 하는 모터가 없었기에,
커브길에서 자동차가 삐걱삐걱대면서 움직이는 문제가 있었습니다.
그래서 앞바퀴에 서보모터가 달리고, DC모터의 힘이 좋아보이는 RC차량으로 이 제품을 선택했습니다.
2. 라이다(Lidar)센서
라이다 센서로는 RPLIDAR A18M이라는 제품을 사용했습니다.
라이다 센서로 전방의 물체를 감지해서 장애물들이나 사람을 감지하는 기능을 추가했습니다.
해당 제품은 360도 전방위의 물체를 감지합니다.
3. 보드(Rasperry Pi)
보드로는 라즈베리파이 3B+를 사용했습니다.
Jetson Nano로 도전하고 싶었지만, 라즈베리파이를 사용한 적이 많아서 환경설정이 익숙하기도하고..
사실은 Jetson Nano로 기본 소프트웨어나 환경구축을 하는데 너무 오류가 많이 생겼고,
수집할 수 있는 정보의 양이 많이 부족해서 라즈베리파이를 선택하게 되었습니다.
4. 카메라(Rasperry Pi Cam)
카메라로는 일반적인 라즈베리파이의 파이캠을 사용했습니다.
고성능의 광각 웹캠을 추가해서 인식 성능을 높혀볼까 라는 생각을 했었는데, 라즈베리파이의 라즈비안 내에서 적용하는 것도 어려운 부분이 있었고, 실시간으로 처리해야하는 자율주행의 처리속도가 지연될 것이라 생각해 제외했습니다.
2. 자율주행 기능
1. 하드웨어 조립
차량의 대략적인 모습은 이렇습니다.
차량자체에 구조물을 올릴 수 있는공간이 없었기에, 3D프린터로 LiDAR 센서를 올릴 구조물을 만들었습니다.
이에 무게가 늘어나기에 차량의 속도(DC motor)도 추가적으로 조절했습니다.
2. 소프트웨어 작동
전체적인 소프트웨어적 움직임은 이렇습니다.
※TMI
waveshare사의 JetRacer(RC car)의 경우 donkeycar라는 완성된 자율주행 기능을 사용할 수 있지만,
자율주행 기능 자체를 만들어 보고 싶었고, 사용하지는 않았습니다.
3. 자율주행 시도
1차로 트랙을 만들어서 시도했습니다.
트랙밖으로 나가버리는데..
※원인
여러번 시도한결과 학습량이 부족했던거 같습니다.
3~4바퀴를 돌면서 트랙이미지를 촬영해서 모델을 만들었는데, 이게 3~4000장 정도 됩니다.
근데, 이후 10바퀴 정도 돌아서 12000장 정도의 이미지로 주행 모델을 만들었더니
완주를 잘했습니다 :)
3-1. 추가된 일정
교수님의 주도하에 갑자기 전시회에 나가게 되었습니다.
남은 시간은 2~3달 남짓, 빠르게 빠르게 해야되는 상황이 주어졌습니다.
해놓은 건 없는데, 시간은 흐르고 있었습니다.
3-2. 자율주행 시도2
전시회에 맞춰 트랙을 2.2m x 2.2m 정도로 밖에 지정을 못했기에, 트랙은 정사각형이 될 수 밖에 없었습니다.
이번에는 틀과 라이다 센서를 달고 자율주행을 시도했습니다.
이번에는 잘되는 느낌입니다.
살짝씩 나가는건 앞으로의 자율주행 모델을 학습량을 늘려 더 정교하게 고치면 될 것 같습니다.
3-3. 물체감지(Ridar 센서)
이제 라이다 센서로 전방의 물체를 감지하는기능을 추가했습니다.
그대로 물체를 쳐버리게 되었습니다....
※원인 및 보수
자동차의 커브길 진행속도가 조금 빠른 것을 고치고
라이다 센서의 감지 범위를 딱 전방으로만 했는데, 범위를 부채꼴 형식으로 양 사이드를 보도록 넓혔습니다.
라이다 센서의 범위를 넓히니까 우측에 있는 장애물을 보고도 멈추게 되었습니다.
이제 전방에 있는 물체도 감지할 수 있게 되었는데, 너무 앞에서 멈추는 현상이 발생해서
라이다의 감지 거리도 조금 줄여서 고치게 되었습니다.
3-4. 종합
이제 트랙에 장애물을 3D프린터와 아두이노로 만들어서 무선조종으로 제어하도록 만들었습니다.
(사진은 수리남의 목사님, 하고 하나는 승용차 모양으로 만들었습니다.)
신호등은 일단 간단하게 태블릿으로 일단 색을 주기적으로 바꿔 물체인식 > 색인식(신호인식)으로 진행했습니다.
※문제 및 해결
추가적으로 현재 쓰는 차량이 배터리가 30분이면 달아버리는 문제가 생겼습니다.
DC모터, 서보모터, 라즈베리파이, 카메라, 라이다 센서(제일 전기 많이먹음) 등등 전기를 많이 먹어서 그런 것 같았습니다.
그래서 차량의 보드에 붙어있는 리튬 건전지를 분리한 다음, 굵은 전선으로 탈착식으로 만들었습니다.
이후 배터리를 다 쓰면, 배터리를 교체하는 식으로 만들 수 있었습니다.
이것때문에 보드 2개인가 날려먹었습니다 ㅋㅋㅋ
아쉬운점
1. 보드의 기능
처음 계획으로는 OpenCV Dnn을 이용해서 사람, 자동차, 사물, 동물 등을 인식하는 기능을 추가하기로 했었고, 적용하는데는 성공했으나, 라이다센서, 자율주행, OpenCV Dnn 이 세개를 동시에 쓰레드로 실시간으로 돌리다보니, 라즈베리파이가 견디기에는... 힘든 상황이었는지, 자율주행이 2초가량 뒤로밀리는 상황이 생겼습니다. 코너를 인식하고, 2초뒤에 꺾는 바람에, 자율주행 자체에 문제가 생겼습니다. 그래서 전시회에 나갈 때는, OpenCV Dnn을 빼게 되었습니다.
Jetson Nano나 더 좋은 보드로 하면 더 잘될 것 같긴 합니다.
2. 자동차의 외관
자동차의 외관도 더 멋있게 만들고 싶었는데 나중에 보니 아쉬움이 남습니다.
3. 라이다센서 오버스펙
추가로 라이다 센서는 RPLIDAR A18M을 사용했었는데, 전방만을 인식하는 라이다 기능을 구현을 하는데, 360도 실시간으로 인식하는 센서를 이용하다보니 크기와 무게도 더 크고 전기를 더 먹었던 점이 있었던 것 같습니다. 라이다 센서는 좀 더 작고 낮은 스펙이었어도 될 것 같습니다.
4. 신호등인식
신호등인식하는 기능을 구현하기 위해 물체 인식과 딥러닝에 대해 구글링을 하면서 열심히 공부했습니다.
외국에 다양한 능력자분들이 만드신 깃허브를 들어가고 공부를 하고 공부해서 구현을 해냈습니다.
하지만 라즈베리파이에 적용한 사례가 없다보니 아는게 없어 적용하기 힘들었습니다.
그래서 아예 처음부터 물체인식 모델을 만들기 위해서 MIT에 있는 신호등 Data Set 즉, 수천장의 신호등 사진 데이터를 이용해서 코랩(colab)으로 신호등을 인식하는 모델을 만들었습니다.
하지만.. 여기서 또 문제가..
신호등을 인식> 신호등을 인식한 영역 내에서 색을 인식 > 신호 인식 |
이러한 프로세스로 진행했습니다.
하지만, 신호등을 인식하는 파일과 색을 인식하는 파일을 합치는 부분을 완성하지 못했습니다.
그래서 신호등 인식 기능은 비교적 간단하게 구현하게 되었습니다.
결론
처음으로 팀원들과 하는 프로젝트 였고, 빠듯한 시간에도 허접하지만 뭔가를 해냈다는 성취감이 있었습니다.
학교에서 밤까지 계속 있기도하고, Colab, 파이썬, 라즈베리파이 등에서 알수 없는 오류가 생기면,
Stackoverflow든, Google이든 Github든 한글로, 한글로 안되면 영어로, 미친듯이 해결법을 찾았던 경험으로, 문제를 끈덕지게 해결하려는 습관을 가지게 된 것 같습니다. 이 때 검색하면서 만든 북마크만 200개가 넘는 것 같습니다.
그리고 같이 프로젝트 진행한 동생들과 동기들에게도 감사한 마음이 듭니다.
이전부터 존재했던 유서깊은 동아리가 아니라 2022년 작년 처음으로 급작스럽게 만들게된 팀이라서 모든게 처음이라 간단한 일이어도 맨땅에 헤딩 하듯 보름, 한달을 씨름하면서 문제를 해결했습니다.
이제는 백엔드 개발자가 되기 위해서 열심히 공부 중이지만, 이 시간은 잊지 못할 것 같습니다.
앞으로도 개인적인 흥미로, OpenCV나 딥러닝에 대해서는 건드려볼 생각이지만, 자율주행에 대한 포스팅은 이걸로 끝일 것 같습니다. 이상입니다.
'AutoDriving > AutoDriving RC_Car' 카테고리의 다른 글
라즈베리파이 자율주행 자동차 - (7) OpenCV를 이용한 카메라 사용 2 [이미지처리] (0) | 2022.05.18 |
---|---|
라즈베리파이 자율주행 자동차 - (6) OpenCV를 이용한 카메라 사용 1 (0) | 2022.04.30 |
라즈베리파이 자율주행 자동차 - (5) 블루투스를 사용해보자! (0) | 2022.04.22 |
라즈베리파이 자율주행 자동차 - (4) 부저와 모터를 움직여보자! (0) | 2022.03.08 |
라즈베리파이 자율주행 자동차 - (3) LED, 버튼 테스트 (0) | 2022.03.06 |