[Python] OpenCV로 자율주행을 끝내며 - 회고록
자율주행을 마치며
약 6개월 동안 자율주행을 개발하기 위해 달려왔다. 가장 먼저 고민한 것은 역시 정확도를 올리기 위해 딥러닝을 사용할 것인가, 더 빠르게 인식하고 최적화를 위해 OpenCV를 사용할 것인가였다. 여기에서 모노 카메라와 CPU만을 사용해서 자율주행을 구현해야 한다는 점이 마음에 걸렸다. 그래서 OpenCV를 채택하게 되었다.
OpenCV로 콘을 인식하기란 어려운 일이었다. 특히 전처리 과정이 어려웠는데, 콘과 색상이 비슷한 배경이 너무 많았다. 노란색은 풀, 꽃 등의 색들이 같이 인식되어 노이즈가 발생했고, 파란색은 너무 어두웠다. 빨간색은 그나마 괜찮았다. 이러한 시행착오들을 해결하기 위해 많은 노력을 기울였다. 항상 인터넷을 보고 이럴 때는 어떻게 대처해야 하는지 알아보곤 했었는데, 이 문제들에는 해결책이 존재하지 않았다. 즉, 내가 스스로 알고리즘을 만들어야 했다. 나는 현재 이 코드를 완성하기 위해 2번의 갈아엎음과 12번의 대대적인 수정을 거쳤다.
이렇게 수정을 거친 코드들로 교통안전공단과 자동차 안전연구원에서 주최하는 2022 국제 대학생 창작자동차 경진대회에 참여하였다.
자율주행 코드는 다음 포스팅에 자세한 설명과 함께 작성하도록 하겠다.
# 아쉬운 점
우리는 소위 열악한 환경에서 코딩을 진행해야 했다. 이번 자율주행 대회가 처음이어서 거기에 대한 지침을 만들고, 토대를 닦으면서 앞으로 나아가야 했다. 부품들도 해외배송이었는데, 부품들을 결정하고 배송을 시키고, 그것들이 또 도착하는 데에 한 달 반 정도가 낭비되었다.
그리고 기계공학과 동아리 분들도 그렇고, 자율주행 팀원들도 그렇고 초반에는 어수선했다. 하지만 시간이 지나면서 점차 대화도 하고 그랬었는데, 오히려 편한 분위기가 더 독이 되었던 것 같다. 대회 직전, 마무리 단계는 가장 중요한 시기이고 그동안 빠르게 버그를 잡고, 개선할 부분도 수정했어야 했는데 그러지 않았다. 팀장님 죄송합니다.
또한, 분업이 중요하다는 것을 알아서 각자 프로그래밍하는 부분을 나누어서 작업했다. 빠르게 작업이 진행된다는 장점이 있었지만 각자가 맡은 바가 있듯 다른 사람은 그 사람의 코드가 어떻게 동작하는지 몰랐다. 더 많이 토의하고 질문하면서 전체는 아니지만 그 코드가 어떻게 작동하는지 일부는 알았어야 했다. 토의가 적절하게 이루어지지 않은 탓인지 코드를 담당하는 사람이 없는 도중 에러가 난다면 수습할 수가 없었다. 그래도 '대회 때 자율주행 차가 굴러가야 한다'라는 목표 하나만으로 우리 전체는 힘을 냈고, 차를 완성할 수 있었다.
그러나 대회에서 문제가 터졌다. 자율주행이 올바르게 작동하지 않았다. 이것을 해결하려고 애를 썼지만 결국 못했다.. 테스트를 더 많이 해보아야 했다. 배선도 더 깔끔하고 합선이 나지 않도록 했어야 했다. 이렇듯 우리의 차에는 아직 고쳐야 할 문제들이 산더미같이 있었다. 어찌 보면 당연한 결과로 볼 수도 있다. 우리 동아리의 부스에 도착해서 차를 뜯어서 수리를 했다. 하지만.. 테스트 장소에 도착해서 주행 버튼을 누르는 순간, 차는 앞으로 가지 않았다. 그렇게 우리가 쏟은 노력을 비웃듯 허무하게 대회는 끝났다.
# 우리 차에 발생한 문제점
- 전선들이 아두이노에 꼽는 방식으로 연결되어 있어서 살짝 건드리면 빠졌다.
- 전류의 양을 계산하지 않아서 과전류가 흐르곤 했다.
- 서보모터가 3번 죽었다.
- Intel NUC가 대회 1주일 전 죽었다.
- 차체의 진동 때문에 카메라에 잔상이 생겼다.
- 원격 데스크톱이 이상한 적이 많았다.
# 발전한 점
이로 인해 발전한 점도 있다.
가장 먼저 나의 코딩 실력이 비약적으로 상승하였다. 비슷한 예시를 찾아보기 위해 구글을 뒤지던 중 논문을 발견했다. 지금껏 논문을 보고 코딩한 적은 없었는데, 처음으로 성공하였다. 그리고 스스로 알고리즘을 짜서 자율주행 알고리즘을 완성하였다. 정확도도 매우 높았다. 여기에 더해 OpenCV의 이해도가 상승하였다. 지금이라면 어떤 알고리즘이던 계획한 후 OpenCV로 구현할 수 있을 것 같다. 또한 소프트웨어만 다루며 소프트웨어와 하드웨어를 어떻게 엮고 상호작용할 수 있는지 몰랐는데, 이번에 자율주행차에 센싱을 해보며 미들웨어로 값을 넘겨주고 받을 수 있다는 점을 깨달았다. 그리고 그러한 점이 매우 신기했다. 그리고 자동차에 관심은 많아도 안의 부품들은 몰랐는데, 자동차가 만들어지는 과정을 직접 보고, 모르는 점을 질문도 하면서 왜 이 부품이 들어가고 어떤 역할을 하는지도 알 수 있었다.
그리고 무엇보다 협업을 하는 능력이 증가했다. 어느 날 동료가 물었다 내가 작성한 python 코드에서 p_l_m이 무엇이냐고. 나는 내가 코드를 적었기에 쉽게 대답했다. p는 past를 뜻하고, l은 left, m은 mx+n에서 기울기 m을 나타낸다고. 그러나 그는 이제야 알겠다고 했다 ㅋㅋㅋ. 그 생각을 미처 하지 못했었다. 나는 위에서 언급했듯 코딩하는 파트가 달라서 변수 길이가 짧게 요약해서 편하게 쓰려고 했었고, 여러 번 수정해서 코드가 스파게티 면처럼 꼬여있었다. 내 코드를 이해할 수 있게 짰어야 했다. 그래서 코드를 완성한 다음 만약 코드의 변수 이름이 이해하기 어렵다면 쉽게 변환해주는 작업과 함수 단위로 쪼개서 쉽게 사용할 수 있도록 모듈화를 해주었다. 다음부터는 작업을 두 번 하지 않도록 미리 설계도를 그려놓고 프로그래밍해야겠다는 생각을 했다.
# 그 당시 나의 감정
테스트 당시 차가 앞으로 나가지 않았을 때는 슬픔과 화남이 같이 공존했다. 하지만 나뿐만 아니라 동아리 구성원들이 누구 하나 빠짐없이 모두 최선을 다했음을 알기에 금방 사그라들었다. 먼저 우리 차에 결함이 있었음을 인정하고 싶진 않았지만 인정했다. 그리고, 대회에는 무슨 일이 있을지 모르기 때문에 100%로 준비를 해서 갔어야 했는데 그러지 못했음을 알고 있었다. 그리고 무엇보다 이 대회를 하면서 상을 못 받을지언정 많은 것을 배웠기에 후회는 하지 않는다고 생각이 들었다.
그리고 그 후, 놀랍게도 특별상을 탔다.
우리가 다져놓은 토대를 바탕으로 baqu4 동아리는 자율주행 부문을 발전시켜 나갈 수 있을 것 같다. 부품 선정 문제와 서보모터 채결 방식(특히 기어비를 무조건 넣어야 된다) 등의 값진 경험치들과 지침을 그대로 다음 자율주행 개발자에게 물려줄 수 있을 것이다. 내가 많은 것을 배워가는 만큼, baqu4도 많은 경험들을 가지고 기틀을 잡을 수 있길 바라는 것은 나의 개인적인 바람이다.
이상 회고록 작성을 마치겠다.
22년 11월 1일 <11월에 들어서며>