"스콜라/드론 매뉴얼"의 두 판 사이의 차이

통진고위키
 
(사용자 2명의 중간 판 4개는 보이지 않습니다)
1번째 줄: 1번째 줄:
''본 문서는 융합탐구동아리 [[스콜라]] 부원들을 위한 드론에 관한 전반적인 매뉴얼입니다. 스콜라 1기 멤버 [[안중원]]이 처음 작성했으며, 이후 추가 및 개선할 내용이 있다면 통진고 재학생 여러분이 지속적으로 반영해주시기 바랍니다.''
''본 문서는 융합탐구동아리 [[스콜라]] 부원들을 위한 드론에 관한 전반적인 매뉴얼입니다. 스콜라 1기 멤버 [[안중원]]이 처음 작성했으며, 이후 추가 및 개선할 내용이 있다면 통진고 재학생 여러분이 지속적으로 반영해주시기 바랍니다.''
스콜라 부원이 이 매뉴얼을 사용하고 있다면 소식을 들려주세요...
2020학년도에는 1학년들이 드론을 한번도 적하지 못한 상황에서 당시 2학년들의 설명에만 의존해서 활동을 조금만 할 수 있었지만 2021학년도에는 보다 구체화된 이 메뉴얼을 통하여 문제가 생겨도 잘 해결할 수 있을 듯하다.(by 스콜라 부원)


==개요==
==개요==
6번째 줄: 10번째 줄:
이하에 서술하는 모든 드론 조종 및 코딩에 앞서, 처음 비행을 시작할 때는 활성화(activation) 과정이 필요하다. 활성화 방법은 [[스콜라/드론 매뉴얼#스마트폰 조종|스마트폰 조종]] 문단에 상술한다.
이하에 서술하는 모든 드론 조종 및 코딩에 앞서, 처음 비행을 시작할 때는 활성화(activation) 과정이 필요하다. 활성화 방법은 [[스콜라/드론 매뉴얼#스마트폰 조종|스마트폰 조종]] 문단에 상술한다.


== 스마트폰 조종 ==
==스마트폰 조종==
Tello 및 Tello EDU 드론을 조종하기 위한 '''TELLO''' 앱은 [https://apps.apple.com/us/app/tello/id1330559633 앱스토어]와 [https://play.google.com/store/apps/details?id=com.ryzerobotics.tello&hl=ko 플레이스토어]를 통해 내려받을 수 있다. 앱을 실행하면 드론에 연결하라는 메시지와 함께 연결하는 방법이 나온다. 이 방법에 따라서 드론을 켜고, 스마트폰 와이파이를 드론에 연결하면 드론의 카메라 화면이 나온다. 아직 드론을 비행해보기 전이라면 활성화(activation)를 하라는 메시지가 나오는데, 이때 "Activate" 버튼을 누르면 조종 또는 코딩으로 그 드론을 비행시킬 수 있게 된다.
Tello 및 Tello EDU 드론을 조종하기 위한 '''TELLO''' 앱은 [https://apps.apple.com/us/app/tello/id1330559633 앱스토어]와 [https://play.google.com/store/apps/details?id=com.ryzerobotics.tello&hl=ko 플레이스토어]를 통해 내려받을 수 있다. 앱을 실행하면 드론에 연결하라는 메시지와 함께 연결하는 방법이 나온다. 이 방법에 따라서 드론을 켜고, 스마트폰 와이파이를 드론에 연결하면 드론의 카메라 화면이 나온다. 아직 드론을 비행해보기 전이라면 활성화(activation)를 하라는 메시지가 나오는데, 이때 "Activate" 버튼을 누르면 조종 또는 코딩으로 그 드론을 비행시킬 수 있게 된다.


42번째 줄: 46번째 줄:
#Tello.js 파일이 저장된 폴더(일반적으로 압축해제된 폴더)를 열고 shift 키를 누른 채로 마우스 오른쪽 버튼을 누른다.
#Tello.js 파일이 저장된 폴더(일반적으로 압축해제된 폴더)를 열고 shift 키를 누른 채로 마우스 오른쪽 버튼을 누른다.
#메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 누르면 콘솔 창이 뜬다.
#메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 누르면 콘솔 창이 뜬다.
#콘솔에서 다음 명령어를 입력하고 엔터를 누르면 Tello 확장기능 서버가 실행된다.<syntaxhighlight line="1">
#콘솔에서 다음 명령어를 입력하고 엔터를 누르면 Tello 확장기능 서버가 실행된다.<syntaxhighlight lang="bat">
node Tello.js
node Tello.js
</syntaxhighlight>
</syntaxhighlight>
224번째 줄: 228번째 줄:


#Multi-Tello-Formation 폴더에서 Shift를 누른 채 마우스 오른쪽 버튼을 눌러서 나온 메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 눌러 콘솔창을 실행한다.
#Multi-Tello-Formation 폴더에서 Shift를 누른 채 마우스 오른쪽 버튼을 눌러서 나온 메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 눌러 콘솔창을 실행한다.
#다음 명령어로 pip와 netifaces, netaddr 패키지를 설치한다.<syntaxhighlight line="1">
#다음 명령어로 pip와 netifaces, netaddr 패키지를 설치한다.<syntaxhighlight lang="bat">
C:\Python27\python get-pip.py
C:\Python27\python get-pip.py
C:\Python27\python -m pip install netifaces netaddr
C:\Python27\python -m pip install netifaces netaddr
232번째 줄: 236번째 줄:
다음 순서에 따라 드론을 군집비행에 맞게 준비한다. Multi-Tello-Formation 폴더에 콘솔은 미리 켜 놓는다.
다음 순서에 따라 드론을 군집비행에 맞게 준비한다. Multi-Tello-Formation 폴더에 콘솔은 미리 켜 놓는다.


#Multi-Tello-Formation 폴더의 formation_setup.py의 26번째 줄을 다음과 같이 수정한다. 이때 와이파이의 이름(SSID)과 비밀번호에는 공백문자(' ')나 언더바('_')가 있으면 안 된다. 과학실 및 학교 와이파이 이름에는 대부분 언더바가 들어가므로, 스마트폰 핫스팟을 켜고 핫스팟의 이름과 비밀번호를 입력하는 것이 좋다. 핫스팟은 군집 비행을 준비하고 실행하는 동안 계속 켜놓는다.<syntaxhighlight lang="python" line="1" start="26">
#Multi-Tello-Formation 폴더의 formation_setup.py의 26번째 줄을 다음과 같이 수정한다. 이때 와이파이의 이름(SSID)과 비밀번호에는 공백문자(' ')나 언더바('_')가 있으면 안 된다. 과학실 및 학교 와이파이 이름에는 대부분 언더바가 들어가므로, 스마트폰 핫스팟을 켜고 핫스팟의 이름과 비밀번호를 입력하는 것이 좋다. 핫스팟은 군집 비행을 준비하고 실행하는 동안 계속 켜놓는다.<syntaxhighlight lang="python2" line="1" start="26">
set_ap('Wifi이름', 'Wifi비밀번호')
set_ap('Wifi이름', 'Wifi비밀번호')
</syntaxhighlight>
</syntaxhighlight>
#노트북 와이파이를 코딩하려는 드론에 연결한다.
#노트북 와이파이를 코딩하려는 드론에 연결한다.
##전원 버튼을 눌러 드론을 켠다. 드론이 무지개빛으로 반짝이다가 노란불이 빠르게 깜빡이는 상태가 되면 와이파이를 연결할 수 있다.
##전원 버튼을 눌러 드론을 켠다. 드론이 무지개빛으로 반짝이다가 노란불이 빠르게 깜빡이는 상태가 되면 와이파이를 연결할 수 있다.
##노트북 와이파이를 드론에 연결한다. 와이파이 이름은 드론의 배터리 넣는 칸 안에 적혀있다. 현재 과학실의 Tello EDU 드론은 와이파이 이름(SSID)과 시리얼 ID가 라벨링되어있지 않은데, 라벨링하여 사용하길 추천한다.
##노트북 와이파이를 드론에 연결한다. 와이파이 이름은 드론의 배터리 넣는 칸 안에 적혀있다. 현재 과학실의 Tello EDU 드론은 와이파이 이름(SSID)과 시리얼 ID가 라벨링되어있지 않은데, 라벨링하여 사용하길 추천한다.
#다음 명령어를 통해 formation_setup.py를 실행한다.<syntaxhighlight>
#다음 명령어를 통해 formation_setup.py를 실행한다.<syntaxhighlight lang="bat">
C:\Python27\python formation_setup.py
C:\Python27\python formation_setup.py
</syntaxhighlight>성공적으로 실행됐다면 콘솔에 다음 메시지가 뜬다. 동시에 드론 3초 뒤 재부팅돼서 처음 켤 때처럼 노란불이 깜빡이는 상태가 된다.<syntaxhighlight>
</syntaxhighlight>성공적으로 실행됐다면 콘솔에 다음 메시지가 뜬다. 동시에 드론 3초 뒤 재부팅돼서 처음 켤 때처럼 노란불이 깜빡이는 상태가 된다.<syntaxhighlight lang="text">
sending command command
sending command command
from ('192.168.10.1', 8889): ok
from ('192.168.10.1', 8889): ok
249번째 줄: 252번째 줄:
#2~3번 과정을 모든 군집비행 드론에 대해 반복한다.
#2~3번 과정을 모든 군집비행 드론에 대해 반복한다.
#드론들을 연결시킨 와이파이(또는 스마트폰 핫스팟)에 노트북도 연결한다.
#드론들을 연결시킨 와이파이(또는 스마트폰 핫스팟)에 노트북도 연결한다.
#ip.txt의 내용을 다음과 같이 변경한다.<syntaxhighlight>
#ip.txt의 내용을 다음과 같이 변경한다.<syntaxhighlight lang="text">
scan [드론 개수]
scan [드론 개수]
</syntaxhighlight>
</syntaxhighlight>
#다음 명령어로 준비한 드론이 모두 연결되었는지 확인한다.<syntaxhighlight>
#다음 명령어로 준비한 드론이 모두 연결되었는지 확인한다.<syntaxhighlight lang="bat">
C:\Python27\python multi_tello_test.py ip.txt
C:\Python27\python multi_tello_test.py ip.txt
</syntaxhighlight>
</syntaxhighlight>


===실행===
===실행===
메모장으로 코딩을 완료한 뒤 Multi-Tello-Formation 폴더에 저장했다면 다음 명령어로 군집비행을 실행할 수 있다.<syntaxhighlight>
메모장으로 코딩을 완료한 뒤 Multi-Tello-Formation 폴더에 저장했다면 다음 명령어로 군집비행을 실행할 수 있다.<syntaxhighlight lang="bat">
C:\Python27\python multi_tello_test.py [코드파일이름]
C:\Python27\python multi_tello_test.py [코드파일이름]
</syntaxhighlight>
</syntaxhighlight>
318번째 줄: 321번째 줄:
|-
|-
|<code>[N]>Re [명령어]</code>
|<code>[N]>Re [명령어]</code>
|<code>[N]>[명령어]</code>와 동작은 같지만 패킷 손실을 위한 내부 처리가 추가로 이루어진다.
|<code>[N]>[명령어]</code>와 동작은 같지만 패킷 손실을 방지하기 위한 내부 처리가 추가로 이루어진다.
|<code>2>cw 180</code>
|<code>2>cw 180</code>
|-
|-
454번째 줄: 457번째 줄:
|}
|}


== Tello 와이파이 초기화 ==
==Tello 와이파이 초기화==
드론의 전원을 켠 뒤, 전원 버튼을 5초간 누른다. 지시등이 꺼졌다가 다시 켜져 노란불이 깜빡이면 초기화된 것이다. 이때 드론의 와이파이와 비밀번호가 초기화되는 것은 물론, 군집비행이나 ap 명령어로 설정한 핫스팟 연결도 해제된다.
드론의 전원을 켠 뒤, 전원 버튼을 5초간 누른다. 지시등이 꺼졌다가 다시 켜져 노란불이 깜빡이면 초기화된 것이다. 이때 드론의 와이파이와 비밀번호가 초기화되는 것은 물론, 군집비행이나 ap 명령어로 설정한 핫스팟 연결도 해제된다.


== Tello 지시등 ==
==Tello 지시등==
Tello 지시등의 색깔은 Tello의 다양한 상태를 나타낸다.
Tello 지시등의 색깔은 Tello의 다양한 상태를 나타낸다.


* 알록달록하게 깜빡임: 전원을 켜고 자가진단 실행 중.
*알록달록하게 깜빡임: 전원을 켜고 자가진단 실행 중.
* 녹색으로 두번씩 깜빡임: [[스콜라/드론 매뉴얼#VPS|VPS]] 작동중.
*녹색으로 두번씩 깜빡임: [[스콜라/드론 매뉴얼#VPS|VPS]] 작동중.
* 노란색으로 천천히 깜빡임: VPS 사용 불가.
*노란색으로 천천히 깜빡임: VPS 사용 불가.
* 노란색으로 빨리 깜빡임: 와이파이 연결 신호 끊어짐.
*노란색으로 빨리 깜빡임: 와이파이 연결 신호 끊어짐.
* 빨간색으로 천천히 깜빡임: 배터리 부족.
*빨간색으로 천천히 깜빡임: 배터리 부족.
* 빨간색으로 빨리 깜빡임: 배터리 매우 부족.
*빨간색으로 빨리 깜빡임: 배터리 매우 부족.
* 일정한 빨간색: 심각한 오류.
*일정한 빨간색: 심각한 오류.


== VPS ==
==VPS==
Vision Positioning System의 약자로, 카메라에 찍힌 영상을 통해 기체의 위치를 조정하는 모드이다. VPS 모드가 비활성화되는 조건 추가예정.
Vision Positioning System의 약자로, 카메라에 찍힌 영상을 통해 기체의 위치를 조정하는 모드이다. VPS 모드가 비활성화되는 조건 추가예정.

2021년 1월 31일 (일) 00:54 기준 최신판

본 문서는 융합탐구동아리 스콜라 부원들을 위한 드론에 관한 전반적인 매뉴얼입니다. 스콜라 1기 멤버 안중원이 처음 작성했으며, 이후 추가 및 개선할 내용이 있다면 통진고 재학생 여러분이 지속적으로 반영해주시기 바랍니다.

스콜라 부원이 이 매뉴얼을 사용하고 있다면 소식을 들려주세요...

2020학년도에는 1학년들이 드론을 한번도 적하지 못한 상황에서 당시 2학년들의 설명에만 의존해서 활동을 조금만 할 수 있었지만 2021학년도에는 보다 구체화된 이 메뉴얼을 통하여 문제가 생겨도 잘 해결할 수 있을 듯하다.(by 스콜라 부원)

개요

2020년 12월 현재 과학실 교무실에 구비된 드론은 중국의 드론 스타트업 기업 RyzeTelloTello EDU이다. Tello와 Tello EDU는 모두 프로그래밍이 가능하지만 Tello EDU에는 미션패드, 군집비행, SDK 2.0 등의 기능이 추가/개선되었다.

이하에 서술하는 모든 드론 조종 및 코딩에 앞서, 처음 비행을 시작할 때는 활성화(activation) 과정이 필요하다. 활성화 방법은 스마트폰 조종 문단에 상술한다.

스마트폰 조종

Tello 및 Tello EDU 드론을 조종하기 위한 TELLO 앱은 앱스토어플레이스토어를 통해 내려받을 수 있다. 앱을 실행하면 드론에 연결하라는 메시지와 함께 연결하는 방법이 나온다. 이 방법에 따라서 드론을 켜고, 스마트폰 와이파이를 드론에 연결하면 드론의 카메라 화면이 나온다. 아직 드론을 비행해보기 전이라면 활성화(activation)를 하라는 메시지가 나오는데, 이때 "Activate" 버튼을 누르면 조종 또는 코딩으로 그 드론을 비행시킬 수 있게 된다.

자세한 조종방법 추가예정.

스크래치 코딩

  • 본 문단에서는 Windows 운영체제에서 Tello 및 Tello EDU 드론의 기본적인 비행동작(이륙, 착륙, 이동, 뒤집기 등)을 스크래치로 프로그래밍하는 방법을 설명합니다.
  • Ryze에서 제공하는 최신 버전의 설명서는 Tello EDU 다운로드 페이지Scratch README 문서를 참조하십시오.
  • 군집비행, 미션패드 등을 활용한 코딩은 해당 문단을 참조하십시오.
  • Python 등 다른 언어로 프로그래밍하는 방법은 Tello SDK 문단을 참조하십시오.

설치

Tello 및 Tello EDU 드론의 비행 동작을 스크래치로 코딩하려면 스크래치와 Node.js, Tello 스크래치 확장기능을 설치해야 한다. 이를 위해 다음 항목들을 내려받는다.

  • 스크래치 2.0 오프라인 에디터: 블록 코딩 기반의 교육용 프로그래밍 언어 '스크래치'를 사용하기 위한 프로그램이다.
  • 어도비 에어: 스크래치를 실행하기 위해 필요한 프로그램이다.
  • Node.js: 스크래치 추가기능을 사용하기 위해 필요한 프로그램이다. 다운로드 버튼이 2개가 나타나는데, 그중 LTS 버전 설치를 권장한다.
  • Tello 스크래치 추가기능 압축파일: 최신 버전을 Tello 다운로드 페이지 또는 Tello EDU 다운로드 페이지Scratch README 문서의 링크에서 받을 수 있다. 사용하는 기종에 따라 적절한 압축파일을 받도록 한다.

어도비 에어, 스크래치, Node.js를 순서대로 설치하고 추가기능 압축파일을 압축해제한다. 압축해제한 폴더에는 Tello.js, Tello.s2e, TelloChs.s2e, run_Tellojs.bat 파일이 들어있다.

run_Tellojs.bat과 TelloChs.s2e 파일은 본 매뉴얼에서는 사용하지 않는다. 참고로 run_Tellojs.bat은 콘솔을 여는 과정 없이 바로 명령어를 실행하기 위한 배치 스크립트이지만 돌발상황에 대처할 때에는 사용이 불편하다. TelloChs.s2e는 Tello.s2e와 같이 스크래치 확장기능 파일이지만 중국어로 되어있다는 차이점이 있다.

준비

다음 사항들을 서술된 순서대로 준비한다.

  • 노트북 와이파이를 코딩하려는 드론에 연결한다.
  1. 전원 버튼을 눌러 드론을 켠다. 드론이 무지개빛으로 반짝이다가 노란불이 빠르게 깜빡이는 상태가 되면 와이파이를 연결할 수 있다.
  2. 노트북 와이파이를 드론에 연결한다. 와이파이 이름은 드론의 배터리 넣는 칸 안에 적혀있다. 현재 과학실의 모든 Tello 드론은 기체 상단에 와이파이 이름이 라벨링되어있다.
  • Tello.js를 실행한다. 가장 간단한 방법은 다음과 같다.
  1. Tello.js 파일이 저장된 폴더(일반적으로 압축해제된 폴더)를 열고 shift 키를 누른 채로 마우스 오른쪽 버튼을 누른다.
  2. 메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 누르면 콘솔 창이 뜬다.
  3. 콘솔에서 다음 명령어를 입력하고 엔터를 누르면 Tello 확장기능 서버가 실행된다.
    node Tello.js
    
  4. 이 콘솔 창을 그대로 켜놔야 스크래치에서 확장기능을 사용할 수 있다. Tello.js를 종료할 때에는 콘솔 창을 닫거나 콘솔에서 Ctrl+C를 누른다.
  • 스크래치(Scratch 2.0)를 실행해 확장기능을 불러온다.
  1. shift 키를 누른 채로 메뉴에서 "파일"(또는 "File")을 누르고 "Import Experimental HTTP Extension" 메뉴를 누른다.
  2. Tello.s2e 파일을 열어 확장기능을 불러온다.
  3. 성공적으로 불러왔다면 "추가 블록" 탭에 Tello Control이라는 메뉴와 그 아래 여러 블록들이 추가된다.
  4. 앞서 실행된 Tello.js가 문제없이 돌아가고 있다면 Tello Control이라는 글씨 옆에 초록불이 들어올 것이다. 빨간불이 들어온다면 Tello.js를 다시 실행해야 한다.

코딩 가이드

스크래치 드론 코딩을 시작하기 위한 몇 가지 안내 사항이다.

  • 코딩에 사용되는 명령 블록들은 다음과 같다:
블록 동작 SDK 명령어
takeoff 이륙 takeoff
land 착륙 land
fly up/down/left/right/forward/backward [N] cm 상/하/좌/우/전/후로 주어진 거리만큼 이동. up~backward
rotate [N] degrees clockwise/counter clockwise 주어진 각도만큼 시계방향/반시계방향 회전. cw/ccw
flip [f/b/l/r] 전/후/좌/우로 뒤집기 flip
set speed to [N] cm/s 속도 설정. speed
fly to ~ 현재 위치로부터 (x, y, z)만큼 주어진 속도로 이동. go
reset 아직 드론에 전송하지 않은 명령 모두 취소. 없음
fly a curve via ~ 현위치에서 (x1,y1,z1)를 지나 (x2,y2,z2)까지

호(arc) 궤도로 주어진 속도로 이동.

curve
emergency stop 프로펠러를 즉시 멈춘다. emergency
stop and hover 즉시 이동을 중단하고 제자리에 떠있는다. Tello EDU에서만 사용가능 stop
fly to MissionPad ~ 미션패드 문단에서 상술. Tello EDU에서만 사용가능 go
fly a curve in MissionPad via ~ curve
jump in MissionPad along ~ jump
  • 코딩에 사용되는 읽기 전용 블록들은 다음과 같다:
블록 SDK 변수명
height 출발지점을 원점(0)으로 한 높이 h
barometer 대기압. 단위는 cmHg baro
tof distance 현재 지면으로부터의 높이 tof
min/max temperature 기온. 측정 오차에 의한 최솟값/최댓값이 따로 저장된다. templ/temph
attitude pitch/roll/yaw 드론 방향 pitch/roll/yaw
acceleration x/y/z 가속도. 단위는 0.001g(중력가속도의 1000분의 1) agx/agy/agz
speed x/y/z 속도 vgx/vgy/vgz
battery 배터리 잔량 bat
MissionPad 미션패드 문단에서 상술. Tello EDU에서만 사용 가능 mid
Mx/y/z x/y/z
command response 드론 응답 메시지. ok 또는 오류메시지 등이 저장된다.

Tello EDU에서만 사용 가능

없음
  • 코드 시작점은 "Events" 또는 "이벤트" 탭의 한 블록을 사용한다.
  • 드론 비행 코드는 "takeoff"로 시작해서 "land"로 끝내는 것을 권장한다.
  • 비상시를 대비해 특정 키를 눌렀을 때 "emergency stop"이 실행되도록 코딩해놓는 것이 좋다.
  • 미션패드 관련 명령어와 "stop and hover", "command response" 명령어는 Tello 드론에서는 사용할 수 없으며 Tello EDU에서만 사용할 수 있으니 유의한다.
  • (x, y, z) 좌표와 이동거리는 모두 ±20~500cm로 제한된다. 특정 축만 이동하지 않는 경우 (50,0,0)과 같이 좌표에 0을 사용할 수 있지만, (0, 0, 0)은 사용할 수 없다.
  • 속도는 10~100cm/s로 제한된다.
  • 각도는 1~360°로 제한된다.
  • fly a curve ~ 명령어에서 호의 반지름은 0.5~10m로 제한된다.
  • 명령어 간에 시간 간격을 두지 않아도 비행 자체에는 문제가 없지만, 명령어 전송과 명령어 실행 간에 시간차가 생기게 된다. 실제 명령 실행하는 데 걸리는 예상 시간 정도의 시간 간격을 두는 것을 권장한다. "제어" 탭의 "~초 기다리기" 또는 "Control" 탭의 "wait ~ seconds" 명령어를 통해 시간 간격을 둘 수 있다.

기타

아래 사항들은 Tello 스크래치 확장기능의 구조를 분석한 것으로, 확장기능 코드에 오류가 발생해 원인을 분석해야 하거나 확장기능 블록을 번역/추가하려고 할 때 활용할 수 있을 것이다. 아마 볼 사람은 없을 것 같지만 그냥 가 궁금해서 분석해봤다....

  • Tello.js: Tello 확장기능 스크립트인 Tello.js는 스크래치가 연결가능한 HTTP 서버와 드론과 통신하는 UDP 소켓을 개설해 스크래치와 드론을 중계한다.
    • order 변수: 명령어 큐를 저장하는 배열. 명령어 큐에서 명령어가 사라지는 순간 명령어가 실행된다.
    • lock 변수: 명령어 연쇄가 실행중임을 나타내는 부울 변수.
    • osdData 변수: 드론 상태와 response 등 스크래치에 전송할 읽기전용 데이터를 저장한다.
    • sendMethod 함수: 직접 UDP 통신을 통해 메시지를 보낸다. 패킷 손실을 막기 위해 같은 메시지를 여러번 보낸다.
    • carryCMD 함수: order[0]에 해당하는 메시지를 sendMethod를 통해 전송한다.
    • sendCMD 함수: order에 명령어를 추가한 후, 명령어 연쇄가 실행중이지 않다면(즉 !lock이면) 명령어 연쇄를 시작한다. 단, 스크래치에서 멈춤 버튼을 눌렀을 때 전송되는 reset_all 명령어는 무시하고, emergency, rc, stop 명령어는 즉시 실행하고 명령어 큐(order)를 비운다.
    • client on "message": 드론으로부터 명령에 대한 응답을 받았을 때 실행된다. 실행된 명령을 큐(order)에서 지우고 carryCMD로 다음 명령을 실행한다.
    • server on "message": 드론으로부터 드론 상태 데이터를 받았을 때 실행된다. osdData에 데이터를 저장한다.
    • http: 스크래치에서 오는 요청을 처리한다.
      • poll: osdData에 저장된 데이터를 전송한다.
      • reset: 큐(order)를 비운다.
      • takeoff: command, mon, takeoff 명령어를 sendCMD를 통해 차례로 보내 드론을 초기화한다.
      • 그 외에는 sendCMD로 명령어를 그대로 보낸다.
    • process on 'SIGINT': Ctrl+C로 프로그램을 종료할 때 실행된다. 소켓을 닫고 안전하게 종료한다.
  • Tello.s2e: Tello 확장기능의 명령어 블록을 정의하는 JSON 형식 파일이다. 각 명령어가 [" "/"r", "블록 명령어", "서버에 전송할 명령어", "기본 인수"] 형식으로 정리되어 있다. 예를 들어 [" ", "fly to x %n cm y %n cm z %n cm with speed %n cm/s", "go", 50, 50, 0, 50]이라는 코드가 나타내는 것을 다음과 같이 정리할 수 있다.
    • " ": 실행 블록이다. "r"은 읽기전용 변수 블록.
    • "fly to x %n cm y %n cm z %n cm with speed %n cm/s": 스크래치에서 "fly to x [ 50 ] cm y [ 50 ] cm z [ 0 ] cm with speed [ 50 ] cm/s" 형태의 블록을 정의한다. [ ] 안에 직접 숫자를 입력할 수 있다. 특히 이 부분을 다음과 같이 한국어로 번역해 저장할 수 있는데, 이때 빈칸의 순서를 유지해야 한다: "(%n cm, %n cm, %n cm)까지 %n cm/s 속도로 이동"
    • "go": 이 블록이 실행되면 Tello.js http 서버에 "go/50/50/0/50"과 같은 형태로 전송된다.
    • 50, 50, 0, 50: 빈칸에 기본적으로 들어가는 숫자들이다.

미션패드

추가예정

군집비행 코딩

설치

Windows 운영체제에서 Tello EDU 군집비행을 코딩하기 위해선 Python2.7, Multi-Tello-Formation 등을 설치해야 한다. 그러려면 먼저 다음 항목들을 차례로 내려받는다.

  • Python2.7: 링크에 들어가서 "Latest Python 2 Release"로 시작하는 링크를 클릭한다. 다시 여러가지 내려받기 링크가 나오는데, 이중 자신의 컴퓨터에 맞는 것을 내려받는다. 과학실 노트북은 모두 64비트이므로, "Windows x86-64 MSI installer"를 내려받는다.설치 과정에서는 별다른 옵션 설정 없이 진행한다. 설치가 완료됐다면 명령 프롬프트나 PowerShell 등에서 C:\Python27\python --version 명령어를 실행했을 때 설치된 버전이 출력된다. python 최신 버전인 3.x 버전과 충돌할 수 있으므로 본 문서에서는 "python" 명령어 대신 "C:\Python27\python"이라는 절대경로 명령어를 사용한다.
  • vcpython27: Python2.7에서 일부 패키지를 내려받을 때 필요하다.
  • Multi-Tello-Formation: 코드 전체를 압축파일로 내려받는다. 내려받은 압축파일은 원하는 위치에 압축을 풀어놓는다.

모든 항목을 내려받았다면 다음 순서에 따라 설치한다.

  1. Multi-Tello-Formation 폴더에서 Shift를 누른 채 마우스 오른쪽 버튼을 눌러서 나온 메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 눌러 콘솔창을 실행한다.
  2. 다음 명령어로 pip와 netifaces, netaddr 패키지를 설치한다.
    C:\Python27\python get-pip.py
    C:\Python27\python -m pip install netifaces netaddr
    

준비

다음 순서에 따라 드론을 군집비행에 맞게 준비한다. Multi-Tello-Formation 폴더에 콘솔은 미리 켜 놓는다.

  1. Multi-Tello-Formation 폴더의 formation_setup.py의 26번째 줄을 다음과 같이 수정한다. 이때 와이파이의 이름(SSID)과 비밀번호에는 공백문자(' ')나 언더바('_')가 있으면 안 된다. 과학실 및 학교 와이파이 이름에는 대부분 언더바가 들어가므로, 스마트폰 핫스팟을 켜고 핫스팟의 이름과 비밀번호를 입력하는 것이 좋다. 핫스팟은 군집 비행을 준비하고 실행하는 동안 계속 켜놓는다.
    set_ap('Wifi이름', 'Wifi비밀번호')
    
  2. 노트북 와이파이를 코딩하려는 드론에 연결한다.
    1. 전원 버튼을 눌러 드론을 켠다. 드론이 무지개빛으로 반짝이다가 노란불이 빠르게 깜빡이는 상태가 되면 와이파이를 연결할 수 있다.
    2. 노트북 와이파이를 드론에 연결한다. 와이파이 이름은 드론의 배터리 넣는 칸 안에 적혀있다. 현재 과학실의 Tello EDU 드론은 와이파이 이름(SSID)과 시리얼 ID가 라벨링되어있지 않은데, 라벨링하여 사용하길 추천한다.
  3. 다음 명령어를 통해 formation_setup.py를 실행한다.
    C:\Python27\python formation_setup.py
    
    성공적으로 실행됐다면 콘솔에 다음 메시지가 뜬다. 동시에 드론 3초 뒤 재부팅돼서 처음 켤 때처럼 노란불이 깜빡이는 상태가 된다.
    sending command command
    from ('192.168.10.1', 8889): ok
    sending command ap [wifi이름] [wifi비밀번호]
    from ('192.168.10.1', 8889): OK,drone will reboot in 3s
    
  4. 2~3번 과정을 모든 군집비행 드론에 대해 반복한다.
  5. 드론들을 연결시킨 와이파이(또는 스마트폰 핫스팟)에 노트북도 연결한다.
  6. ip.txt의 내용을 다음과 같이 변경한다.
    scan [드론 개수]
    
  7. 다음 명령어로 준비한 드론이 모두 연결되었는지 확인한다.
    C:\Python27\python multi_tello_test.py ip.txt
    

실행

메모장으로 코딩을 완료한 뒤 Multi-Tello-Formation 폴더에 저장했다면 다음 명령어로 군집비행을 실행할 수 있다.
C:\Python27\python multi_tello_test.py [코드파일이름]

코딩 가이드

군집비행 코드는 일반적으로 다음의 구조를 이룬다:

코드 동작 예제
1 scan [N] 드론을 [N]개 찾는다. scan 2
2 battery_check [N] 배터리가 [N]% 미만이면 종료한다. battery_check 20
3 correct_ip

[N1]=[SN1]

[N2]=[SN2]

시리얼 번호가 [SN]인 드론의 번호를 [N]으로 정한다. correct_ip

1=ABCD1234ABCD12

2=EFGH5678EFGH56

4 [비행 명령어] 군집 비행 동작을 지정한다. *>takeoff

sync 10

1>cw 360

2>ccw 360

sync 10

*>land

비행 명령어의 종류는 다음과 같다:

코드 동작 예제
[N]>[명령어] [N]번 드론에 [명령어]를 보낸다. [N] 자리에 *이 들어가면 모든 드론에 [명령어]를 보낸다. 1>forward 100

*>land

[N]>Re [명령어] [N]>[명령어]와 동작은 같지만 패킷 손실을 방지하기 위한 내부 처리가 추가로 이루어진다. 2>cw 180
sync [SEC] 모든 드론의 이전 명령이 완료될 때까지 [SEC]초 동안 기다린다. sync 20
delay [SEC] [SEC]초 동안 아무 동작 없이 기다린다. delay 10

[명령어]에 들어가는 자세한 비행 명령은 Tello SDK 문단 참조.

Tello SDK

본 문단의 SDK 명령어 목록은 Tello EDU 다운로드 페이지의 SDK 2.0 User Guide를 참고했다. 아래의 일부 명령어는 Tello 드론에는 실행할 수 없다.

SDK 명령어 동작 비고
takeoff 이륙
land 착륙
streamon 영상 스트리밍 활성화 영상 스트리밍 문단에서 상술.
streamoff 영상 스트리밍 비활성화
emergency 프로펠러를 즉시 멈춘다.
up/down/left/right/forward/backward [x] 상/하/좌/우/앞/뒤로 [x]cm만큼 이동. 20 ≤ [x] ≤ 100
cw/ccw [x] [x]°만큼 시계방향/반시계방향 회전. 1 ≤ [x] ≤ 360
flip l/r/f/b 좌/우/앞/뒤로 뒤집기
go [x] [y] [z] [speed] 현재 위치로부터 ([x] cm, [y] cm, [z] cm)만큼

[speed]cm/s로 이동.

-500 ≤ [x]~[z] ≤ 500

10 ≤ [speed] ≤ 100

[x]~[z]가 동시에 -20~20일 수 없다.

stop 즉시 이동을 중단하고 제자리에 떠있는다.

Tello EDU에서만 사용가능

curve [x1] [y1] [z1] [x2] [y2] [z2] [speed] 현위치에서 ([x1]cm, [y1]cm, [z1]cm)를 지나

([x2]cm, [y2]cm, [z2]cm)까지

호(arc) 궤도로 [speed]cm/s로 이동.

-500 ≤ [x1]~[z2] ≤ 500

10 ≤ [speed] ≤ 100

x~z가 동시에 -20~20일 수 없다.

go [x] [y] [z] [speed] [mid] 미션패드 문단에서 상술. Tello EDU에서만 사용가능
curve [x1] [y1] [z1] [x2] [y2] [z2] [speed] [mid]
jump [x] [y] [z] [yaw] [speed] [mid1] [mid2]
speed [x] 속도를 [x]cm/s로 설정. 10 ≤ [x] ≤ 100
rc [a] [b] [c] [d] 게임패드 입력을 재현.

[a]=좌우, [b]=앞뒤, [c]=상하, [d]=각도(yaw)

-100 ≤ [a]~[d] ≤ 100
wifi [ssid] [pass] 드론의 와이파이 이름을 [ssid], 비밀번호를 [pass]로 설정.
mon 미션패드 감지 활성화
moff 미션패드 감지 비활성화
mdirection 0/1/2 미션패드 감지 모드 설정. 0=아래, 1=앞, 2=아래+앞
ap [ssid] [pass] 군집비행에서 연결할 와이파이 이름을 [ssid],

비밀번호를 [pass]로 설정.

speed? 현재 속도(cm/s) 출력
battery? 현재 배터리 잔량(%) 출력
time? 비행 시간 출력
wifi? 와이파이 SNR(전송속도의 척도) 출력
sdk? SDK 버전 출력
sn? 드론 시리얼 번호 출력

Tello 와이파이 초기화

드론의 전원을 켠 뒤, 전원 버튼을 5초간 누른다. 지시등이 꺼졌다가 다시 켜져 노란불이 깜빡이면 초기화된 것이다. 이때 드론의 와이파이와 비밀번호가 초기화되는 것은 물론, 군집비행이나 ap 명령어로 설정한 핫스팟 연결도 해제된다.

Tello 지시등

Tello 지시등의 색깔은 Tello의 다양한 상태를 나타낸다.

  • 알록달록하게 깜빡임: 전원을 켜고 자가진단 실행 중.
  • 녹색으로 두번씩 깜빡임: VPS 작동중.
  • 노란색으로 천천히 깜빡임: VPS 사용 불가.
  • 노란색으로 빨리 깜빡임: 와이파이 연결 신호 끊어짐.
  • 빨간색으로 천천히 깜빡임: 배터리 부족.
  • 빨간색으로 빨리 깜빡임: 배터리 매우 부족.
  • 일정한 빨간색: 심각한 오류.

VPS

Vision Positioning System의 약자로, 카메라에 찍힌 영상을 통해 기체의 위치를 조정하는 모드이다. VPS 모드가 비활성화되는 조건 추가예정.