Just for fun! - 사이드 프로젝트/드론 제어

태초부터 인간은 하늘을 동경해왔다 - 드론 제어 프로젝트 개시!

포리셔 2024. 1. 23. 01:50

저는 비행기와 항공기를 좋아합니다. 그것도 아주 좋아합니다. 학부 시절 공부도 기계공학부에서 항공우주공학을 전공했습니다. 더 공부를 해 보고 싶어서 잠시 대학원에 입학해 연구실에 있었던 적도 있었죠. 심지어 공군에 입대해 항공기 관제와 관련된 특기를 받아 복무하기도 했습니다. 그 정도로 하늘을 나는 항공기 그 자체는 물론 항공산업에 대한 애정이 아직도 큽니다. 제 블로그와 깃허브 프사도 KF-21 전투기입니ㄷ...


지금은 비록 연구실에서 했던 연구의 연장선으로서 데이터 직무와 개발에 관련된 공부를 하고 있습니다. 하지만 세상 모든 일의 원천은 덕질과 덕심이라고 생각하는 저는 이 코딩 스킬을 덕질에 써먹을 수는 없을까?라는 생각을 늘 가져왔습니다.
그리고 마침 비슷한 뜻을 품은 친구들과 1년을 씨름한 끝에 드디어 지난 주부터 이 원대한 덕질이 본격적으로 시작되었습니다...!

너 내 동료가 돼라 - 사건의 발단

때는 지금으로부터 약 1년 전. 당시 연구실에서 저와 함께 하던 동기 J는 저보다도 더한 항덕(항공 덕후)이었습니다. 코딩에 대한 지식은 적지만, 반대급부로 하드웨어 쪽 지식이 풍부했죠. 집에 커스텀용 드론 부품을 쟁여놓고, 드론 조종 자격증까지 딸 정도로 진심인 친구였습니다. "나의 부품과 너의 코딩 지식을 합해서 드론 하나 만들어보자!" 그게 그 친구의 계획이었습니다. 덕질 DNA가 동한 저는 흔쾌히 수락했죠. 여기에 또다른 동기 D를 추가로 포섭하고, J의 학부 동기 Y를 제어 파트 요원으로 추가 영입하면서 4인 스쿼드가 완성되었습니다.


저와 J는 같은 학부 출신이지만, 대학원에서 처음 만났습니다. J와 Y는 학부 때부터 알고 지내던 절친한 사이였죠. 그래서 저희 셋이 같은 학부라는 사실은 첫 미팅 당일날에서야 알게 되었습니다. 심지어 저희 세 명 다 공군 출신이고, 그 중 Y는 저와 군대 동기이기까지 하더군요(공군 병 781기). 이렇게 순식간에 아이스 브레이킹이 되었고, 일은 순탄하게 진행될 것만 같았습니다.


그런데... 막상 시작해보니 시험이니 교육이니 이직이니 해서 다들 바쁘다는 게 함정이었습니다. 서로 사는 곳도 꽤 멀어서 중간 지점까지 모이는 것도 2주 ~ 1달 텀으로 만났고 조금씩 루즈해졌습니다. 그러다 보니 처음 1년은 서로 드론 영상과 매뉴얼만 뒤적이면서 시간이 지나갔습니다. 도메인 지식이 늘었다는 사실과 아이디어 수집 말고는 좀처럼 진척되지 않았죠. 하반기부터는 줌(Zoom)으로라도 만나자! 해서 그나마 루즈한 분위기가 조금씩 잡히기 시작했습니다. 그리고 하반기에 접어들면서부터 이제 진짜 뭐 하나 만들어보자!는 의견으로 귀결되었죠. 그리고 장교 출신이었던 D가 거시적인 계획부터 세워보자고 건의하며 본격적으로 프로젝트에 시동이 걸렸습니다.

누구나 그럴싸한 계획을 가지고 있...다? - 빡빡한 일정

상반기에는 실질적으로 취업과 이직, 졸업으로 5, 6월에는 미팅과 작업이 어려울 것을 감안해 2월에서 4월 중으로만 만나기로 했습니다. 그 중에서 실제 제작보다는 제어 쪽에 비중을 크게 두기로 했죠. 특히 실 드론을 가지고 있지 않은 팀원들이 있는 관계로, 시뮬레이션으로 드론 제어를 실습할 수 있는 툴을 알아오는 것이 사전 과제 중 하나였습니다. 총 2가지 툴을 선정했는데, 이 툴들에 대한 자세한 이야기는 아래에서 다루기로 하죠.


그런데 러프하게 일정을 짜 보니... 선정된 프로그램 숙달에 두 달이 걸리고, 두 프로그램을 시뮬레이션 툴이나 실제 드론에 적용시키는 데 두 달 정도걸린다는 계산이 나왔습니다. 이미 4월을 넘어가더라고요! 그래서 실질적으로 소프트웨어 쪽에 비중을 두는 것이 현실적이라는 판단이 나왔습니다. 또한 실물 드론 부품이 있다 하더라도 그걸 만드는 데 시간이 더 들어가기 때문에, 상반기 동안은 드론 자율 비행을 테스트할 수 있는 시뮬레이션 툴을 이용하기로 갈피를 잡았습니다.

Simulink & Ardupilot - 근데 더 필요하다고??

각자가 익숙한 프로그램과 언어, 툴을 종합적으로 고려해 투 트랙으로 나아가기로 결정했습니다. 하나는 MATLAB의 툴박스인 시뮬링크(Simulink)를 이용하는 쪽이고, 다른 하나는 아두이노(Arduino)에서 파생된 아두파일럿(ArduPilot)을 사용하는 방안이었습니다.

  • 시뮬링크: MATLAB에 포함되어 있는 또다른 프로그램 내지는 툴박스입니다. 그래픽 기반, 정확히는 블록 다이어그램 환경으로 구성된 모델 기반 설계 도구입니다.
  • 아두파일럿: 드론과 같은 무인기를 소프트웨어적으로 조작하기 위한 오픈소스 프로그램입니다. 쿼드콥터(모터와 프로펠러가 4개 달려 있는 드론) 기반의 드론 외에도 고정익 RC 항공기(흔히 생각하는 날개 달린 비행기), RC카, 심지어 무선 잠수함을 위한 프로그램도 지원합니다. PX4로 알려진 픽스호크 등 다양한 마이크로컨트롤러와 호환이 가능하며, 실물 드론 없이 시뮬레이션 하는 툴도 제공합니다.

NOTE_
멀티콥터란 여러 개의 모터와 프로펠러를 이용해 추진하는 드론으로, 그 개수에 따라 쿼드콥터(4개), 옥타콥터(8개) 등으로 이름이 바뀝니다.

 

저희는 이번 프로젝트에서 사용할 기체를 멀티콥터 기반으로 가정했습니다. 따라서 아두파일럿에 있는 여러 가지 툴 중 아두콥터(ArduCopter)를 사용하기로 했습니다. 거기에 네 명 다 공대 출신이라 MATLAB에도 어느 정도 익숙하니 시뮬링크를 이용한 제어 방식도 조금 더 공부해보기로 했습니다.


그런데 막상 시연을 해보니 문제점이 여기저기 퍼져 있더군요. 세팅 자체부터가 난항을 겪기도 했고, 세팅은 쉬운데 거기서 추가로 뭘 더 깔아야 프로젝트 목적에 부합하는 것이 있었습니다.

ArduPilot의 경우 - 통곡의 벽, 우분투

다른 팀원들이 시뮬링크를 다루는 동안 저는 아두파일럿을 만져보기로 했습니다. 사유인 즉, 우리 중 우분투와 리눅스를 그나마 잘 다룰 줄 안다는 이유로...어라, 이거 완전 군대...

 

아두파일럿을 처음 다루기 위해 유튜브 영상 목록을 참고하여 시연을 해봤습니다. 다행히도 개인 노트북에 우분투 20.04 버전을 듀얼부팅으로 깔아놨기 때문에 우분투 설치에 드는 수고는 없었습니다.


그런데 이 영상... 우분투 18 버전을 쓰네요? 거기다 아두콥터 버전은 3.5다? 여기서부터 쎄한 느낌이 드는 건 기분 탓이 아니었더군요...

불길한 예감은 항상 맞아떨어지더라.

글을 쓰고 있는 현재 기준 4.4까지 릴리스되어 있습니다. 저는 이 릴리스 버전에 해당하는 깃허브 브랜치만 클론해서 테스트를 해봤습니다.

 

영상을 따라서 설치와 세팅을 마치고 기본 세팅 실행을 하기 위해 터미널에 명령어를 입력했습니다. 여기서부터 시작된 연쇄적인 에러는 이후 미팅 전날까지 무려 2주 동안이나 저를 괴롭혔습니다. 대충 큰 틀에서만 정리해보자면...

  • 서브모듈 설치 불가: 컴퓨터 또는 네트워크의 방화벽이 서브모듈의 다운로드를 막고 있어서 발생한 문제입니다. 아두파일럿 도큐먼트를 참고했습니다.
  • 시뮬레이션 컴파일은 끝났는데 실행 불가: 이 정도면 다 됐겠지 싶어서 실행했는데, 막상 실행에 필요한 패키지를 추가로 설치해야 합니다. 터미널에서 ardupilot 디렉터리로 이동한 후, 아래 명령어를 입력해 추가 설치를 해야 실행이 되었습니다. 덤으로 컴파일도 다시 해야 하는 것은 안 비밀.
    ./Tools/environment_install/install-prereqs-ubuntu.sh -y

갖은 고초를 겪고, 근 2주 만에 실행되는 것만 간신히 확인했습니다...

시연 성공 직후의 모습. 영광의 상처.

Simulink의 경우 - 뭘 얼마나 더 깔아야 된다고요???

시뮬링크를 시연한 Y의 경우는 테스트 자체가 크게 어렵지는 않았다고 합니다. 애초에 시뮬링크는 MATLAB을 유통하는 MathWorks 사에서 판매하는 제품이기 때문에, 실행부터 유지/관리까지 모두 신경을 써 주기 때문이죠. 실행이라도 안 되는 날엔 바로 본사나 한국 지사에 문의 때리면 됩니다 그래서 이 부분은 다들 시뮬링크를 한 번도 안 써봤거나, 워낙 오래 전에 써서 가물가물하니 예제 한 두개 쯤 풀어보면 되겠다 싶었습니다. 그런데 이쯤에서 날아오는 Y의 제보.

이거 jMAVSim이랑 Gazebo라는 거 깔아야 된다는데?

....으읭?


사유인 즉, 실제 드론 제어에서 시뮬링크를 쓸 때는 저 jMAVSim과 Gazebo라는 툴을 추가로 설치해서 연동시키기도 한다는 군요. 심지어 그 중 Gazebo는 윈도우에서는 아예 이용이 불가능합니다. 무조건 맥이나 우분투에서 돌려야 한대요. 그것도 22.04 이상의 버전에서. 프로그램 주제에 뭐 이리 까다롭게 굴어


종합하자면, 간단한 시연에도 시간이 너무 오래 걸려서 추가적인 기능을 파악해지 못했다는 것이 첫 번째 난관이었습니다. 그리고 제대로 (실물 드론 없이 시뮬레이션으로라도) 써먹으려면 뭘 더 깔아야 되나 보다 라는 것이 두 번째 난관이었습니다. 추가로 학교를 졸업하는 순간에 MATLAB 라이센스를 더 이상 이용할 수 없기 때문에 툴 사용법을 익히려면 일단 무료로 쓸 수 있을 때 최대한 익혀놔야 했습니다. 나중에 돈 주고 사는 한이 있더라도...


이쯤에서 우리의 계획은 투 트랙으로 분할해서 진행하는 것으로 갈피를 잡았습니다. 먼저 진입장벽이 낮은 시뮬링크 실습으로 툴 자체에 익숙해집니다. 그 동안 시뮬링크를 가장 많이 만져본 Y가 jMAVSim과 Gazebo를 이용하는 것을 알아보고, 동시에 저는 우분투 환경에서 아두파일럿을 사용하는 추가적인 절차를 알아놓기로 했습니다. 덤으로, 프로그래밍에 익숙치 않은 중생동료들을 구하기 위해 깃허브 계정을 만들라고 영업권유했습니다.

총 회고 - 간단요약

  • Keep
    • Simulink: 아직 학교에 있는 친구들은 MATLAB 라이센스가 살아있으니 시뮬링크의 사용법을 미리 익히면 좋을 것.
    • Ardupilot: PX4(픽스호크) 등 다양한 마이크로컨트롤러와 시뮬레이션 툴을 지원해 범용성이 높음.
  • Problem
    • 학교를 졸업하는 순간 학생용 라이센스가 만료되는 MATLAB은 개인 사용자용 라이센스를 구매해야 함.
      • 심지어 시뮬링크와 같은 툴박스(Toolbox)는 라이센스와 별도로 파는 경우도 있음.
    • Gazebo는 우분투 22.04 이상에서만 돌아간다. → 우분투 설치 시 참고해야 함.
  • Try
    • 시뮬링크 예제 한 두개 씩 풀어보기
    • 깃허브 계정 없는 사람들은 깃과 깃허브 사용에 익숙해지기
    • 아두파일럿의 추가 기능과 절차(Ground control station 등) 시현해 보기

마치며

부트캠프 때도 그렇고, 항상 하루/1주일/2주일 간의 일을 돌아보면 "아... 내가 뭘 한 거지?" 싶을 때가 많습니다. 반대로 회고를 정리하다 보면 머릿속의 생각이 정리되면서 쓸 거리가 많다는 생각이 듭니다. 분량 조절 실패 그리고 다시 레퍼런스 조사를 하러 구글링을 하면서 나의 배움이 모자람을 한탄하며 절망(...?)하는 악순환이 이어집니다. 할 수 있는 거부터 하나하나 해 보렵니다. 지금까지 그래왔듯이.