드론 프로그래밍으로 Tello를 무인 자동 비행해 보았다 (Python3)

마지막 기사의 속편입니다.

전체 구성





전회는, Macbook의 Terminal에, 인간이 손 입력으로 "takeoff", "forward 100",···,"land"라고, Tello API로 제공되고 있는 커멘드를 하나하나 입력하고 있었습니다.

Macbook에서 Wifi 통신으로 Tello에 명령을 보낼 수 있게 되었지만 이것이라면 마찬가지로 Wifi 통신으로 iPhone/iPad의 화면에 표시된 가상 조이스틱으로 조작하는 것이 조작하기 쉽습니다.

그래서 이번에는 일련의 비행 동작을 미리 스크립트에 기술(열거)하고, 인간은 놓아서 텔로가 날아가는 모습을 바라보고 있을 수 있도록 파이썬 스크립트를 다시 작성해 보았습니다.

프로그램 안에서는 for문에서 반복 처리를 하도록 했습니다. (시계 방향 45도 회전을 8회 반복한다).

앞으로 if문과 일반물체인식(OpenCV의 기능)을 조합하여 다음과 같은 것에도 도전해보고 싶습니다.
  • Tello에 내장된 카메라에 "의자"가 비치면 거기에 착지("land")시킨다.
  • Tello 내장 카메라에 사람이 비치면 충돌 위험을 줄이기 위해 300 상승 ("up 300")

  • 이번, 임하는 내용을 다음에 설명합니다.
    시험 비행을 실시한 결과, 의도한 대로 동작하는 것을 확인하고 있습니다.

    프로그래밍된 자동 비행 경로





    실행한 스크립트


    # 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 % 
    

    좋은 웹페이지 즐겨찾기