늦게나마 써보는 드론 제어시스템 개발 후기

by Taylor
2 comments

[본 글은 드론 파일럿 커뮤니티 서비스 종료로 이관된 글 입니다]

[작성일 : 2015.01.28 19:30]

아래의 개발후기는 제가 2013부터 약 1년동안 개발을 진행했던 프로젝트에 관한 후기입니다.

처음에 미래창조과학부의 지원을 받아 프로젝트를 시작하게 되었습니다.

프로젝트 기간은 약 6개월으로 짧은편이었습니다.

처음엔 간략하게 리눅스 우분투로 구동되어 자동비행이 가능한 무인기를 목표로 잡았습니다.

그리고 기획을 거쳐 기종은 DJI F450 쿼드콥터로 결정하게 되었고 일단 셋트로 컨트롤러와 조종기셋트로 구매하게 되었습니다.

전에 일반 RC비행기는 날려본적이 있었지만 쿼드콥터나 헬기를 날려본적은 없었기에 구조에 대해 알아보려 집 근처 공터에서 몇번 날려보았습니다.

주로 헬리콥터 RC의 경우 날리기가 힘들다고 많이 들어서 쿼드콥터도 비슷하지 않을까 내심 긴장을 했었는데 실제로 조종해보니 생각보다 많이 쉬웠습니다.

자체 컨트롤러가 수평을 잡아주고 또 GPS키트를 구매했기 때문에 조종간에서 손을 놓으면 알아서 정지후 해당 위치와 고도에 정지하고 있었습니다.

사실 쿼드콥터를 구매하고 날려보기전 까지 수평잡는것과 위치고정 그리고 이동하는걸 어떻게 컨트롤 하면 좋을지 굉장히 많이 고민 했었는데 그 부분이 한번에 날아가는 느낌이었습니다.

프로젝트 기간이 짧았기 때문에 가장 기본적인 수평잡기, 위치고정등의 기능을 컨트롤러가 해준다는것을 보고 생각보다 많이 개발할 수 있을것 같았습니다.

개발을 시작하고 가장 첫번째로 이 쿼드콥터를 어떻게 조종할 것 인지 고민하기 시작하였습니다.

드론개발 정보 게시판에 썼던 [DJI F450  조종 신호 분석] 글에 나와있는것 처럼

1. 쿼드콥터 로터들을 직접 제어하는 방식

2. 기존 쿼드콥터 컨트롤러를 사용하면서 조종하는 방식

이 두가지가 있었습니다.

1번의 경우는 기존 쿼드콥터 컨트롤러를 제거하고 그 컨트롤러가 하는 일(수평제어, 위치고정)을 직접 하는 방식입니다.

2번의 경우는 기존 쿼드콥터의 컨트롤러를 사용하면서 사람이 조종기를 통해 조종하듯이 우분투 시스템이 쿼드콥터를 조종하는 방식입니다.

확실히 1번의 경우가 시간이 더 많이 들었기 때문에 저희는 2번의 방법을 선택하여 개발하기로 하였습니다.

2번의 경우는 일반 조종기 수신기의 인터페이스를 그대로 사용하기 때문에 쿼드콥터 뿐 만 아니라 멀티콥터, 헬리콥터, 비행기 등 다양한 무인기에도 적용할 수 있는점도 선택의 이유중 하나가 되었습니다.

그렇게 조종 방식을 결정하고 바로 인터페이스 분석을 진행하여 프로토타입 조종시스템을 만들었습니다.

가장 처음엔 오드로이드 보드를 통해 쿼드콥터로 조종신호를 전송하려 하였지만 위 글에 나와있는 여러 이유로 인해 아두이노를 통해 조종신호를 전송하게끔 구현하였습니다. 

임베디드는 처음이었기 때문에 여기까지 한 3달 걸린것 같습니다.

간단하게 

쿼드콥터 – 아두이노 – ODROID X2 (Ubuntu 12.04) — 내부망 WiFi — PC 

이렇게 테스트를 진행하여 잘 작동하는걸 확인하였습니다.

우분투 보드는 x86 아키텍쳐를 쓰는건 여러모로 비효율적이기 때문에 ARM 아키텍쳐를 사용하는 보드로 사용하기로 하였습니다.

그 중 삼성 엑시노스 쿼드코어를 사용하는 ODROID-X2 가 가장 괜찮았습니다.

총 2개를 구매를 했었는데 그 중 하나는 테스트 중 전압 5V를 넣는다는걸 12V를 넣는 바람에 64GB SD카드(비싼거..)와 함께 사망하였습니다..

쿼드코어 프로세서가 달린 보드로 결정한 이유중 하나는 HD급의 비디오를 PC로 전송을 하기 위함이었습니다.

자동비행도 좋지만 현재 상황을 관제자에게 전달하는것 역시 중요하였기 때문이었습니다.

비디오 전송은 여러가지를 사용해보다 결국 MJPEG를 사용하기로 하였습니다.

별도 스트리밍 서버를 구축할 필요도 없고 가장 가벼운게 MJPEG 였습니다.

아무리 쿼드코어라도 CPU에 너무 부담을 주게 되면 전력소모도 심하고 다른 서비스에 영향을 줄 수도 있었기 때문입니다.


위 사진이 개발에 사용된 ODROID-X2 보드입니다.


여기까지 되어서 나온 PC에서의 조종 프로그램입니다.

Control Status 는 PC에 연결된 조이스틱의 상태를 보여주고

MODE는 현재 비행모드

MODE 오른쪽의 버튼은 모드선택

그리고 Network Statics 의 IP는 ODROID의 IP

MODE는 Connect Status (연결상태)인데 잘못 적혀있습니다.

그리고 Wireless Signal 은 WiFi의 신호세기를 말합니다.

비행모드 설명:

GPS 모드 – 자동으로 고도,위치 고정 / 자동으로 수평유지

Attitude 모드 – 자동으로 고도 고정 / 자동으로 수평유지

Manual 모드 – 수동모드 / 수평유지 안함


왼쪽편에 나오는 영상은 HD급은 아니지만 현재 비행상태를 충분히 확인할수 있을 정도의 화질이었습니다.

여기까지 개발이 된 후 첫번째로 테스트 비행을 해보았습니다.

테스트비행은 주말에 아무도 없는 학교 운동장에서 허가를 받고 진행하였습니다.

원래는 노트북을 보며 조종을 해야 했는데 햇빛이 너무 강해 노트북 화면이 제대로 보이지 않았고 

카메라가 심하게 떨려 전송되는 화면을 통해서는 조종할 수 없는 정도였습니다..

일단 좌우로 움직이고 앞뒤 위아래 등 다양한 동작에서 적은 딜레이로 날렵한 움직임을 보여주었습니다.

물론 전혀 문제도 없었습니다.

다만 테스트중 와이파이 신호가 끊기면 어떻게 되는지 궁금해서 쿼드콥터를 멀리 보내보았습니다.

결과는 쿼드콥터가 연결이 끊기기 바로 전 상태 그대로 앞으로 돌진을 하더군요….

예외처리를 하긴 했었는데 무언가 부족한 부분이 있었나봅니다..

팀원들이 완전 사색이 되어서 와이파이를 들고 다시 연결시키려 뛰어가는데 이번엔 PC 클라이언트가 에러를 일으키며 멈추었습니다.

다행히 쿼드콥터는 운동장을 벗어나지 않고 운동장을 구분하는 나무에 걸렸습니다.

그런데 어딘가 선이 빠진 모양인지 와이파이도 자동으로 잡지 못하고 연결이 안되더군요..

결국 배터리가 다 되어 멈추기를 기다렸고 10분쯤 뒤에 모터가 멈춘 뒤 나무를 타고 올라가 꺼내왔었습니다.

지금 다시 생각해도 소름이 끼치게 무섭습니다..

이 경험을 토대로 예외처리는 확실히 하게 되었습니다..

테스트에 사용했던 완벽한 무선랜입니다.

전원도 배터리를 사용해 완벽한 무선입니다.

외부에 연결될 필요 없어 내부망만 있으면 되었기 때문에 이렇게 구성하였습니다.

이렇게 한번 추락시키고 나니 그 다음에는 외부에서 테스트하기가 겁나더군요..

그래서 여러 부분을 수정하고 최적화 해서 이번엔 실내에서 시험비행을 하였습니다.

실내비행에 앞서 쿼드콥터의 프로펠러가 굉장히 위험하기 때문에 스티로폼을 잘라 가이드를 만들었습니다.

이렇게 가이드를 만든 뒤 회사 소강당에서 테스트 비행을 시도해보았습니다.

비행에 앞서 비싼 프로젝터도 혹시나 다치지 않게 꽁꽁 싸맸습니다.

바로 위의 형광등도 이불을 덮어주고 쿼드콥터를 셋팅하였습니다.

와이파이를 켜고 노트북으로 쿼드콥터에 연결한 후 테스트로 시동도 걸어보고 비행을 시작하였습니다.

결과는 부드럽게 잘 비행하였습니다.

배터리가 부족해서 출력이 부족하긴 했지만 생각보다 부드럽게 잘 비행해주었습니다.

여기까지가 아마 5개월째 였던것 같습니다.

원래는 자동조종까지 기획을 하고 있었지만 그 부분은 차후 프로젝트로 미루기로 하였고 가장 기본적인 수동조종을 충실히 하는쪽으로 개발을 진행하였습니다.

ODROID에 올라간 서버는 Python 으로 제작하였고 PC와는 내부와이파이를 통해 Socket통신을 하였습니다.

PC는 C#으로 개발하였고 조이스틱 라이브러리를 통해 Logitech 의 비행게임용 조이스틱을 지원하였습니다.

미국 공군이 사용하는 XBox 조이스틱도 지원이 가능한것 처럼 보였지만 가지고있지 않아 테스트는 할 수 없었습니다.

ODROID는 어디에 붙이면 좋을까 고민하다가 결국엔 쿼드콥터 바닥에 거꾸로 붙이게 되었습니다.

Scotch 에서 만든 Dual Lock 이라는 찍찍이로 붙이니 튼튼하게 고정되었습니다.

왼쪽 다리에는 아두이노를 붙였습니다.

사실 쿼드콥터는 균형을 잘 맞추어야 하는데 따로 붙일곳이 마땅치 않아 무게도 얼마 나가지 않기 때문에 왼쪽다리에 살짝 붙였습니다.

그리고 이 사진에는 안나와있지만 최종적으로는 전선들의 합선을 막기위해서와 선이 빠지지 않게 하기위해 글루건으로 마감처리를 해주었습니다.

Netgear 의 무선랜카드를 사용하였습니다.

ARM보드에서 지원되는 무선랜카드가 많지 않다고 가장 호환성이 좋은 이 모델로 구매했는데 알고보니 많은 무선랜카드들이 ARM보드에서 지원이 되더군요..

덕분이 이 무선랜카드는 무려 영국에서 직수입해왔습니다.

그리고 실내에서 개발 할 때는 이렇게 유선랜을 연결하여 개발하였습니다.

나중에는 쿼드콥터를 실외에서 테스트 할 때 도망가지 못하게 하기 위해 아예 랜선을 연결하고 쿼드콥터에 칭칭감아서 고정시킨 후 강아지 목줄처럼 사용하자는 의견도 나왔었지만 실내테스트를 마지막으로 테스트는 하지 못하였습니다.

마지막으로 제 개발환경입니다.

저는 자리가 여러개 있어서 쿼드콥터 개발하는 자리, 납땜하는 자리, 소프트웨어 개발하는 자리 이렇게 있었는데 

그 중 쿼드콥터를 가장 많이 만졌던 자리의 사진을 올려보았습니다.

사실 굉장히 더러웠었는데 사진찍기전 많이 치웠습니다^^

마무리를 지으면서

프로젝트 기간은 많이 짧았는데 지금 생각해보면 굉장히 긴것 같았고 재밌었던 시간이었습니다.

지금은 그 회사에서도 나왔고 팀원도 다 흩어진 상태지만 나중에 여유가 되게 된다면 다시 이어서 진행해보고 싶은 프로젝트 입니다.

이 때 개발했던 쿼드콥터는 제가 집으로 가져와 지금 책장 위에 먼지만 쌓이고 있네요

요즘은 다시 먼지를 털고 항공촬영용 Gimbal을 달아 다시한번 날려볼까 합니다.

언젠간 제가 만든 드론 제어 시스템으로 집에 앉아서 외국을 돌아다녀 볼 수도 있었으면 좋겠네요^^

2 comments

우철민 2018-04-02 - 10:55

안녕하세요 드론에대해서 검색하던중에 이 글을 보게되었습니다.
저도 현재 드론을 제작하는 중인데 몇가지 물어봐도 괜찮을까요..?

Reply
DEWI PERMATASARI 2019-03-24 - 04:02

thank you for sharing. what kind of drone that you recommend for beginners ?

Reply

Leave a Comment