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

통진고위키
211번째 줄: 211번째 줄:
==군집비행 코딩==
==군집비행 코딩==


* ''본 문단에서는 [https://github.com/TelloSDK/Multi-Tello-Formation Multi-Tello-Formation]를 통해 Tello EDU 군집비행을 코딩하는 방법을 설명합니다.''
*''본 문단에서는 [https://github.com/TelloSDK/Multi-Tello-Formation Multi-Tello-Formation]를 통해 Tello EDU 군집비행을 코딩하는 방법을 설명합니다.''
* ''Tello EDU 군집비행에 대한 최신 설명서는 [https://github.com/TelloSDK/Multi-Tello-Formation/blob/master/README.md Multi-Tello-Formation README]를 통해 확인할 수 있습니다.''
*''Tello EDU 군집비행에 대한 최신 설명서는 [https://github.com/TelloSDK/Multi-Tello-Formation/blob/master/README.md Multi-Tello-Formation README]를 통해 확인할 수 있습니다.''


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


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


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


# Multi-Tello-Formation 폴더에서 Shift를 누른 채 마우스 오른쪽 버튼을 눌러서 나온 메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 눌러 콘솔창을 실행한다.
#Multi-Tello-Formation 폴더에서 Shift를 누른 채 마우스 오른쪽 버튼을 눌러서 나온 메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 눌러 콘솔창을 실행한다.
# 다음 명령어로 pip와 netifaces, netaddr 패키지를 설치한다.<syntaxhighlight line="1">
#다음 명령어로 pip와 netifaces, netaddr 패키지를 설치한다.<syntaxhighlight line="1">
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
</syntaxhighlight>
</syntaxhighlight>


=== 준비 ===
===준비===
다음 순서에 따라 드론을 군집비행에 맞게 준비한다. 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="python" 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>
256번째 줄: 256번째 줄:
</syntaxhighlight>
</syntaxhighlight>


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


=== 코딩 가이드 ===
===코딩 가이드===
군집비행 코드는 일반적으로 다음의 구조를 이룬다:
군집비행 코드는 일반적으로 다음의 구조를 이룬다:
{| class="wikitable"
{| class="wikitable"
313번째 줄: 313번째 줄:
|-
|-
|<code>[N]>[명령어]</code>
|<code>[N]>[명령어]</code>
|[N]번 드론에 [명령어]를 보낸다. [N] 자리에 <code>*</code>이 들어가면 모든 드론에 [명령어]를 보낸다.  
|[N]번 드론에 [명령어]를 보낸다. [N] 자리에 <code>*</code>이 들어가면 모든 드론에 [명령어]를 보낸다.
|<code>1>forward 100</code>
|<code>1>forward 100</code>
<code>*>land</code>
<code>*>land</code>
331번째 줄: 331번째 줄:
[명령어]에 들어가는 자세한 비행 명령은 [[스콜라/드론 매뉴얼#Tello SDK|Tello SDK]] 문단 참조.
[명령어]에 들어가는 자세한 비행 명령은 [[스콜라/드론 매뉴얼#Tello SDK|Tello SDK]] 문단 참조.


== Tello SDK ==
==Tello SDK==
추가예정.
Tello 드론에 보낼 수 있는 SDK 명령어 목록은 다음과 같다:
{| class="wikitable mw-collapsible mw-collapsed"
!SDK 명령어
!동작
!비고
|-
|takeoff
|이륙
|
|-
|land
|착륙
|
|-
|streamon
|영상 스트리밍 활성화
| rowspan="2" |[[스콜라/드론 매뉴얼#영상 스트리밍|영상 스트리밍]] 문단에서 상술.
|-
|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]
| colspan="2" rowspan="3" |[[스콜라/드론 매뉴얼#%EB%AF%B8%EC%85%98%ED%8C%A8%EB%93%9C|미션패드]] 문단에서 상술. 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?
|드론 시리얼 번호 출력
|
|}

2020년 12월 11일 (금) 22:58 판

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

개요

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

Tello 드론에 보낼 수 있는 SDK 명령어 목록은 다음과 같다:

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? 드론 시리얼 번호 출력