드론 프로그래밍으로 Tello를 무인 자동 비행해 보았다 (Python3)
전체 구성
전회는, Macbook의 Terminal에, 인간이 손 입력으로 "takeoff", "forward 100",···,"land"라고, Tello API로 제공되고 있는 커멘드를 하나하나 입력하고 있었습니다.
Macbook에서 Wifi 통신으로 Tello에 명령을 보낼 수 있게 되었지만 이것이라면 마찬가지로 Wifi 통신으로 iPhone/iPad의 화면에 표시된 가상 조이스틱으로 조작하는 것이 조작하기 쉽습니다.
그래서 이번에는 일련의 비행 동작을 미리 스크립트에 기술(열거)하고, 인간은 놓아서 텔로가 날아가는 모습을 바라보고 있을 수 있도록 파이썬 스크립트를 다시 작성해 보았습니다.
프로그램 안에서는 for문에서 반복 처리를 하도록 했습니다. (시계 방향 45도 회전을 8회 반복한다).
앞으로 if문과 일반물체인식(OpenCV의 기능)을 조합하여 다음과 같은 것에도 도전해보고 싶습니다.
이번, 임하는 내용을 다음에 설명합니다.
시험 비행을 실시한 결과, 의도한 대로 동작하는 것을 확인하고 있습니다.
프로그래밍된 자동 비행 경로
실행한 스크립트
# Tello Python3
import threading
import socket
import sys
import time
host = ''
port = 9000
locaddr = (host,port)
# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tello_address = ('192.168.10.1', 8889)
sock.bind(locaddr)
def recv():
count = 0
while True:
try:
data, server = sock.recvfrom(1518)
except Exception:
print ('\nExit . . .\n')
break
def takeoff():
sent = sock.sendto("takeoff".encode(encoding="utf-8"), tello_address)
def land():
sent = sock.sendto("land".encode(encoding="utf-8"), tello_address)
def forward(n):
order = "forwarding " + str(int(n))
sent = sock.sendto(order.encode(encoding="utf-8"), tello_address)
def up(n):
order = "up " + str(int(n))
sent = sock.sendto(order.encode(encoding="utf-8"), tello_address)
def clockwise_45degree_8times_repeating():
i = 0
for i in range(8):
if i == 0:
print("Clockwise 45degree Rotating 1st turn")
elif i == 1:
print("Clockwise 45degree Rotating 2nd turn")
else:
print("Clockwise 45degree Rotating " + str(i+1) + "-th turn")
sent = sock.sendto("cw 45".encode(encoding="utf-8"), tello_address)
time.sleep(3)
i +=1
#recvThread create
recvThread = threading.Thread(target=recv)
recvThread.start()
print("start")
sent = sock.sendto("command".encode(encoding="utf-8"), tello_address)
time.sleep(8)
try:
print("Taking off")
takeoff()
time.sleep(3)
up(100)
time.sleep(3)
clockwise_45degree_8times_repeating()
print("Ascending 100cm")
up(100)
time.sleep(3)
print("forwarding 150cm")
forward(150)
time.sleep(3)
clockwise_45degree_8times_repeating()
print("Landing down")
land()
time.sleep(3)
sock.close()
except KeyboardInterrupt:
print("forced shutdown button pressed. Landing down.")
land()
time.sleep(8)
sock.close()
실행 결과(1)
스크립트에 기술한 동작을 처음부터 끝까지 모두 실행할 수 있었다.
(1) Rotating 1st turn ~ Rotating 8-th turn: 시계 방향 45도 회전을 8회 반복, 360도 회전
(2) 100cm 상승 후
(3) 150cm 전진
(4) Rotating 1st turn ~ Rotating 8-th turn: 시계 방향 45도 회전을 8회 반복, 360도 회전
Terminal
electron@diynoMacBook-Pro Tello % python3 TelloScript.py
start
Taking off
Clockwise 45degree Rotating 1st turn
Clockwise 45degree Rotating 2nd turn
Clockwise 45degree Rotating 3-th turn
Clockwise 45degree Rotating 4-th turn
Clockwise 45degree Rotating 5-th turn
Clockwise 45degree Rotating 6-th turn
Clockwise 45degree Rotating 7-th turn
Clockwise 45degree Rotating 8-th turn
Ascending 100cm
forwarding 150cm
Clockwise 45degree Rotating 1st turn
Clockwise 45degree Rotating 2nd turn
Clockwise 45degree Rotating 3-th turn
Clockwise 45degree Rotating 4-th turn
Clockwise 45degree Rotating 5-th turn
Clockwise 45degree Rotating 6-th turn
Clockwise 45degree Rotating 7-th turn
Clockwise 45degree Rotating 8-th turn
Landing down
Exit . . .
electron@diynoMacBook-Pro Tello %
실행 결과(2)
스크립트 실행에 의해, Tello가 이륙한 후에, Macbook 키보드측에서 Ctrl-Z(강제 종료)를 두드렸다. 스크립트에서 설명한대로 Tello는 몇 초 후에 자동 착륙했습니다.
Terminal
electron@diynoMacBook-Pro Tello % python3 TelloScript.py
start
Taking off
Clockwise 45degree Rotating 1st turn
Clockwise 45degree Rotating 2nd turn
Clockwise 45degree Rotating 3-th turn
Clockwise 45degree Rotating 4-th turn
^Z
zsh: suspended python3 TelloScript.py
electron@diynoMacBook-Pro Tello %
Reference
이 문제에 관하여(드론 프로그래밍으로 Tello를 무인 자동 비행해 보았다 (Python3)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/electronics_diy721/items/e570a1f65daca84aea0d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)