스콜라/드론 매뉴얼 편집하기
통진고위키
편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
| 최신판 | 당신의 편집 | ||
| 1번째 줄: | 1번째 줄: | ||
''본 문서는 융합탐구동아리 [[스콜라]] 부원들을 위한 드론에 관한 전반적인 매뉴얼입니다. 스콜라 1기 멤버 [[안중원]]이 처음 작성했으며, 이후 추가 및 개선할 내용이 있다면 통진고 재학생 여러분이 지속적으로 반영해주시기 바랍니다.'' | ''본 문서는 융합탐구동아리 [[스콜라]] 부원들을 위한 드론에 관한 전반적인 매뉴얼입니다. 스콜라 1기 멤버 [[안중원]]이 처음 작성했으며, 이후 추가 및 개선할 내용이 있다면 통진고 재학생 여러분이 지속적으로 반영해주시기 바랍니다.'' | ||
==개요== | ==개요== | ||
2020년 12월 현재 [[골방|과학실 교무실]]에 구비된 드론은 중국의 드론 스타트업 기업 [https://www.ryzerobotics.com/kr Ryze]의 [https://www.ryzerobotics.com/kr/tello Tello]와 [https://www.ryzerobotics.com/kr/tello-edu Tello EDU]이다. Tello와 Tello EDU는 모두 프로그래밍이 가능하지만 Tello EDU에는 미션패드, 군집비행, SDK 2.0 등의 기능이 추가/개선되었다. | 2020년 12월 현재 [[골방|과학실 교무실]]에 구비된 드론은 중국의 드론 스타트업 기업 [https://www.ryzerobotics.com/kr Ryze]의 [https://www.ryzerobotics.com/kr/tello Tello]와 [https://www.ryzerobotics.com/kr/tello-edu Tello EDU]이다. Tello와 Tello EDU는 모두 프로그래밍이 가능하지만 Tello EDU에는 미션패드, 군집비행, SDK 2.0 등의 기능이 추가/개선되었다. | ||
==조종== | |||
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 플레이스토어]를 통해 다운로드 가능하다. 자세한 연결 및 조종 방법 추가예정. | |||
== | |||
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 플레이스토어]를 통해 | |||
== | ==코딩== | ||
*''본 문단에서는 Windows 운영체제에서 Tello 및 Tello EDU 드론의 기본적인 비행동작(이륙, 착륙, 이동, 뒤집기 등)을 스크래치로 프로그래밍하는 방법을 설명합니다.'' | *''본 문단에서는 Windows 운영체제에서 Tello 및 Tello EDU 드론의 기본적인 비행동작(이륙, 착륙, 이동, 뒤집기 등)을 스크래치로 프로그래밍하는 방법을 설명합니다.'' | ||
*''Ryze에서 제공하는 최신 버전의 설명서는 [https://www.ryzerobotics.com/kr/tello-edu/downloads Tello EDU 다운로드 페이지]의 '''Scratch README''' 문서를 참조하십시오.'' | *''Ryze에서 제공하는 최신 버전의 설명서는 [https://www.ryzerobotics.com/kr/tello-edu/downloads Tello EDU 다운로드 페이지]의 '''Scratch README''' 문서를 참조하십시오.'' | ||
*''[[스콜라/드론 매뉴얼#군집비행 | *''[[스콜라/드론 매뉴얼#군집비행|군집비행]], [[스콜라/드론 매뉴얼#미션패드|미션패드]] 등을 활용한 코딩은 해당 문단을 참조하십시오.'' | ||
*''Python 등 다른 언어로 프로그래밍하는 방법은 [[스콜라/드론 매뉴얼# | *''Python 등 다른 언어로 프로그래밍하는 방법은 [[스콜라/드론 매뉴얼#SDK|SDK]] 문단을 참조하십시오.'' | ||
===설치=== | ===설치=== | ||
| 30번째 줄: | 22번째 줄: | ||
*Tello 스크래치 추가기능 압축파일: 최신 버전을 [https://www.ryzerobotics.com/kr/tello/downloads Tello 다운로드 페이지] 또는 [https://www.ryzerobotics.com/kr/tello-edu/downloads Tello EDU 다운로드 페이지]의 '''Scratch README''' 문서의 링크에서 받을 수 있다. 사용하는 기종에 따라 적절한 압축파일을 받도록 한다. | *Tello 스크래치 추가기능 압축파일: 최신 버전을 [https://www.ryzerobotics.com/kr/tello/downloads Tello 다운로드 페이지] 또는 [https://www.ryzerobotics.com/kr/tello-edu/downloads Tello EDU 다운로드 페이지]의 '''Scratch README''' 문서의 링크에서 받을 수 있다. 사용하는 기종에 따라 적절한 압축파일을 받도록 한다. | ||
어도비 에어, 스크래치, Node.js를 순서대로 설치하고 추가기능 압축파일을 압축해제한다. 압축해제한 폴더에는 Tello.js, Tello.s2e, TelloChs.s2e, | 어도비 에어, 스크래치, Node.js를 순서대로 설치하고 추가기능 압축파일을 압축해제한다. 압축해제한 폴더에는 Tello.js, Tello.s2e, TelloChs.s2e,ㅊrun_Tellojs.bat 파일이 들어있다. | ||
run_Tellojs.bat과 TelloChs.s2e 파일은 본 매뉴얼에서는 사용하지 않는다. 참고로 run_Tellojs.bat은 콘솔을 여는 과정 없이 바로 명령어를 실행하기 위한 배치 스크립트이지만 돌발상황에 대처할 때에는 사용이 불편하다. TelloChs.s2e는 Tello.s2e와 같이 스크래치 확장기능 파일이지만 중국어로 되어있다는 차이점이 있다. | run_Tellojs.bat과 TelloChs.s2e 파일은 본 매뉴얼에서는 사용하지 않는다. 참고로 run_Tellojs.bat은 콘솔을 여는 과정 없이 바로 명령어를 실행하기 위한 배치 스크립트이지만 돌발상황에 대처할 때에는 사용이 불편하다. TelloChs.s2e는 Tello.s2e와 같이 스크래치 확장기능 파일이지만 중국어로 되어있다는 차이점이 있다. | ||
===준비=== | ===코딩 준비=== | ||
다음 사항들을 서술된 순서대로 준비한다. | 다음 사항들을 서술된 순서대로 준비한다. | ||
*노트북 와이파이를 코딩하려는 드론에 연결한다. | *[[스콜라/드론 매뉴얼#조종|조종]]할 때와 마찬가지로 노트북 와이파이를 코딩하려는 드론에 연결한다. | ||
#전원 버튼을 눌러 드론을 켠다 | #전원 버튼을 눌러 드론을 켠다. | ||
#노트북 와이파이를 드론에 연결한다. 와이파이 이름은 드론의 배터리 넣는 칸 안에 적혀있다. 현재 과학실의 모든 Tello 드론은 기체 상단에 와이파이 이름이 라벨링되어있다. | #노트북 와이파이를 드론에 연결한다. 와이파이 이름은 드론의 배터리 넣는 칸 안에 적혀있다. 현재 과학실의 모든 Tello 드론은 기체 상단에 와이파이 이름이 라벨링되어있다. | ||
| 46번째 줄: | 38번째 줄: | ||
#Tello.js 파일이 저장된 폴더(일반적으로 압축해제된 폴더)를 열고 shift 키를 누른 채로 마우스 오른쪽 버튼을 누른다. | #Tello.js 파일이 저장된 폴더(일반적으로 압축해제된 폴더)를 열고 shift 키를 누른 채로 마우스 오른쪽 버튼을 누른다. | ||
#메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 누르면 콘솔 창이 뜬다. | #메뉴에서 "여기서 명령 창 열기" 또는 "여기서 PowerShell 창 열기"를 누르면 콘솔 창이 뜬다. | ||
#콘솔에서 | #콘솔에서 "node Tello.js"를 입력하고 엔터를 누르면 Tello 확장기능 서버가 실행된다. | ||
#이 콘솔 창을 그대로 켜놔야 스크래치에서 확장기능을 사용할 수 있다. Tello.js를 종료할 때에는 콘솔 창을 닫거나 콘솔에서 Ctrl+C를 누른다. | #이 콘솔 창을 그대로 켜놔야 스크래치에서 확장기능을 사용할 수 있다. Tello.js를 종료할 때에는 콘솔 창을 닫거나 콘솔에서 Ctrl+C를 누른다. | ||
| 186번째 줄: | 176번째 줄: | ||
*명령어 간에 시간 간격을 두지 않아도 비행 자체에는 문제가 없지만, 명령어 전송과 명령어 실행 간에 시간차가 생기게 된다. 실제 명령 실행하는 데 걸리는 예상 시간 정도의 시간 간격을 두는 것을 권장한다. "제어" 탭의 "~초 기다리기" 또는 "Control" 탭의 "wait ~ seconds" 명령어를 통해 시간 간격을 둘 수 있다. | *명령어 간에 시간 간격을 두지 않아도 비행 자체에는 문제가 없지만, 명령어 전송과 명령어 실행 간에 시간차가 생기게 된다. 실제 명령 실행하는 데 걸리는 예상 시간 정도의 시간 간격을 두는 것을 권장한다. "제어" 탭의 "~초 기다리기" 또는 "Control" 탭의 "wait ~ seconds" 명령어를 통해 시간 간격을 둘 수 있다. | ||
===기타=== | === 기타 사항 === | ||
아래 사항들은 Tello 스크래치 확장기능의 구조를 분석한 것으로, 확장기능 코드에 오류가 발생해 원인을 분석해야 하거나 확장기능 블록을 번역/추가하려고 할 때 활용할 수 있을 것이다. 아마 볼 사람은 없을 것 같지만 그냥 [[안중원|내]]가 궁금해서 분석해봤다.... | 아래 사항들은 Tello 스크래치 확장기능의 구조를 분석한 것으로, 확장기능 코드에 오류가 발생해 원인을 분석해야 하거나 확장기능 블록을 번역/추가하려고 할 때 활용할 수 있을 것이다. 아마 볼 사람은 없을 것 같지만 그냥 [[안중원|내]]가 궁금해서 분석해봤다.... | ||
*'''Tello.js''': Tello 확장기능 스크립트인 Tello.js는 스크래치가 연결가능한 HTTP 서버와 드론과 통신하는 UDP 소켓을 개설해 스크래치와 드론을 중계한다. | * '''Tello.js''': Tello 확장기능 스크립트인 Tello.js는 스크래치가 연결가능한 HTTP 서버와 드론과 통신하는 UDP 소켓을 개설해 스크래치와 드론을 중계한다. | ||
**'''order 변수''': 명령어 큐를 저장하는 배열. 명령어 큐에서 명령어가 사라지는 순간 명령어가 실행된다. | ** '''order 변수''': 명령어 큐를 저장하는 배열. 명령어 큐에서 명령어가 사라지는 순간 명령어가 실행된다. | ||
**'''lock 변수''': 명령어 연쇄가 실행중임을 나타내는 부울 변수. | ** '''lock 변수''': 명령어 연쇄가 실행중임을 나타내는 부울 변수. | ||
**'''osdData 변수''': 드론 상태와 response 등 스크래치에 전송할 읽기전용 데이터를 저장한다. | ** '''osdData 변수''': 드론 상태와 response 등 스크래치에 전송할 읽기전용 데이터를 저장한다. | ||
**'''sendMethod 함수''': 직접 UDP 통신을 통해 메시지를 보낸다. 패킷 손실을 막기 위해 같은 메시지를 여러번 보낸다. | ** '''sendMethod 함수''': 직접 UDP 통신을 통해 메시지를 보낸다. 패킷 손실을 막기 위해 같은 메시지를 여러번 보낸다. | ||
**'''carryCMD 함수''': order[0]에 해당하는 메시지를 sendMethod를 통해 전송한다. | ** '''carryCMD 함수''': order[0]에 해당하는 메시지를 sendMethod를 통해 전송한다. | ||
**'''sendCMD 함수''': order에 명령어를 추가한 후, 명령어 연쇄가 실행중이지 않다면(즉 !lock이면) 명령어 연쇄를 시작한다. 단, 스크래치에서 멈춤 버튼을 눌렀을 때 전송되는 reset_all 명령어는 무시하고, emergency, rc, stop 명령어는 즉시 실행하고 명령어 큐(order)를 비운다. | ** '''sendCMD 함수''': order에 명령어를 추가한 후, 명령어 연쇄가 실행중이지 않다면(즉 !lock이면) 명령어 연쇄를 시작한다. 단, 스크래치에서 멈춤 버튼을 눌렀을 때 전송되는 reset_all 명령어는 무시하고, emergency, rc, stop 명령어는 즉시 실행하고 명령어 큐(order)를 비운다. | ||
**'''client on "message"''': 드론으로부터 명령에 대한 응답을 받았을 때 실행된다. 실행된 명령을 큐(order)에서 지우고 carryCMD로 다음 명령을 실행한다. | ** '''client on "message"''': 드론으로부터 명령에 대한 응답을 받았을 때 실행된다. 실행된 명령을 큐(order)에서 지우고 carryCMD로 다음 명령을 실행한다. | ||
**'''server on "message"''': 드론으로부터 드론 상태 데이터를 받았을 때 실행된다. osdData에 데이터를 저장한다. | ** '''server on "message"''': 드론으로부터 드론 상태 데이터를 받았을 때 실행된다. osdData에 데이터를 저장한다. | ||
**'''http''': 스크래치에서 오는 요청을 처리한다. | ** '''http''': 스크래치에서 오는 요청을 처리한다. | ||
***poll: osdData에 저장된 데이터를 전송한다. | *** poll: osdData에 저장된 데이터를 전송한다. | ||
***reset: 큐(order)를 비운다. | *** reset: 큐(order)를 비운다. | ||
***takeoff: command, mon, takeoff 명령어를 sendCMD를 통해 차례로 보내 드론을 초기화한다. | *** takeoff: command, mon, takeoff 명령어를 sendCMD를 통해 차례로 보내 드론을 초기화한다. | ||
***그 외에는 sendCMD로 명령어를 그대로 보낸다. | *** 그 외에는 sendCMD로 명령어를 그대로 보낸다. | ||
**'''process on 'SIGINT'''': Ctrl+C로 프로그램을 종료할 때 실행된다. 소켓을 닫고 안전하게 종료한다. | ** '''process on 'SIGINT'''': Ctrl+C로 프로그램을 종료할 때 실행된다. 소켓을 닫고 안전하게 종료한다. | ||
*'''Tello.s2e''': Tello 확장기능의 명령어 블록을 정의하는 JSON 형식 파일이다. 각 명령어가 [" "/"r", "블록 명령어", "서버에 전송할 명령어", "기본 인수"] 형식으로 정리되어 있다. 예를 들어 | * '''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''': 빈칸에 기본적으로 들어가는 숫자들이다. | ||
==미션패드== | ==미션패드== | ||
추가예정 | 추가예정 | ||
==군집비행 | ==군집비행== | ||
추가예정 | |||