Python을 통한 Tello 작업 (기본 및 클라우드에서 MQTT로 작업까지)

Tello란?



Ryze Tech와 DJI가 공동 개발한 12,800엔의 소형 토이 드론으로, API가 공개되어 있으므로 누구나 간단하게 프로그램에 의해 조작할 수 있습니다.

htps //w w. ry 제로보치 cs. 코 m / jp / 꼭


API에는 다음 두 가지 유형이 있습니다.
  • 공개된 표준 명령. WiFi를 통해 Tello 주소의 8887/udp에 텍스트 명령을 보낼 수 있습니다. 기능 제한이 있습니다.
  • 통칭 바이너리 커멘드. 공개되어 있지 않지만, 전세계의 Tello 매니아에 의해 사양이 밝혀진 것으로, 기본적으로는 무엇이든 할 수 있습니다.

  • 오늘은 어른스럽게 1의 표준 커맨드를 이용합시다. 성실하게 쓰면 더 있습니다만, 조작에 필요한 것은 싹둑이런 느낌입니다. 자세한 내용은 여기


    명령
    사양


    command
    명령 모드로

    takeoff
    이륙

    land
    착륙

    up xx
    xx cm 상승(20 < xx < 500)

    다운 xx
    xx cm 하강(20 < xx < 500)

    left xx
    왼쪽으로 xx cm 이동 (20 < xx < 500)

    right xx
    오른쪽으로 xx cm 이동 (20 < xx < 500)

    forward xx
    이전 xx cm 이동 (20 < xx < 500)

    back xx
    뒤로 xx cm 이동 (20 < xx < 500)

    cw xx
    시계 방향으로 xx°회전(1 < xx < 3600)

    ccw xx
    반 시계 방향으로 xx ° 회전 (1 < xx < 3600)

    flip x
    귀환 l (왼쪽) r (오른쪽) f (전방) b (후방)


    입문편: 이착륙



    단순히 8889/udp에 필요한 명령을 던지기만 하면 됩니다.
    #!/usr/bin/env python
    
    import socket
    import time
    
    tello_ip = '192.168.10.1'
    tello_port = 8889
    
    #udpソケット作成
    socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    tello_address = (tello_ip , tello_port)
    
    #コマンドモードを使うため'command'というテキストを投げる
    socket.sendto('command'.encode('utf-8'),tello_address)
    
    #5秒まつ
    time.sleep(5)
    
    #離陸のため'takeoff'というテキストを投げる
    socket.sendto('takeoff'.encode('utf-8'),tello_address)
    #5秒まつ
    time.sleep(5)
    #着陸のため'land'というテキストを投げる
    socket.sendto('land'.encode('utf-8'),tello_address)
    

    네 간단. 입문편 종료.

    응용편: 클라우드의 IoT Platform에서 MQTT로 작업



    개요도





    PC가 드론의 컨트롤러가 되어 MQTT 클라이언트로서 MQTT Broker에 접속합니다. MQTT Broker를 SaaS로 제공하는 클라우드도 다양하지만, 여기에서는 손에 있는 알리바바 클라우드를 이용합니다. 알리바바 클라우드의 IoT platform에 MQTT 연결할 때의 파라미터 준비는 "ESP32 ~ Alibaba Cloud IoT Platform을 MQTT 연결 (Arduino Core 버전)" 에서 소개하고 있습니다.

    그림중 PC라고 써 있습니다만, 라즈파이에서도 OK. 다만, Tello가 WiFi의 AP로서 동작하는 사양으로, 네트워크 인터페이스의 하나는 Tello와 밖에 접속할 수 없기 때문에, 클라우드에 접속하기 위해서 또 하나의 네트워크 인터페이스가 필요합니다. 나는 아이폰의 USB 테더링을 사용했다. Tello와 연결하는 네트워크 (기본적으로 192.168.10.0/24)를 제외하고는 모두 iPhone usb 테더링을 통과해야합니다. OSX에서 설정하려면 인터넷을 통해 클라우드에 연결하는 인터페이스의 우선 순위를 Tello와 연결하는 WiFi보다 높아야 합니다.


    코드


    #!/usr/bin/env python
    
    import socket
    import time
    import paho.mqtt.client as mqtt
    
    TELLO_IP = '192.168.10.1'
    TELLO_PORT = 8889
    
    # 以下はMQTT Brokerの仕様に応じて書き換えてね。
    BROKER = 'MQTT BrokerのIPもしくはFQDN'
    CLIENTID = 'クライアントID'
    USER = 'ユーザーID'
    PASS = 'パスワード'
    TOPIC = '購読するトピック'
    
    # subscribeしたtopicでメッセージを受けたらそのままTelloへ送る
    def on_message(client, socket, msg):
        print(str(msg.payload))
        socket.sendto(str(msg.payload).encode('utf-8'),tello_address)
    
    def on_connect(client, userdata, flags, rc):
        print("Connected with result code "+str(rc))
    
    if __name__ == '__main__':
      tello_address = (TELLO_IP , TELLO_PORT)
      socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      socket.sendto('command'.encode('utf-8'),tello_address)
    
      client = mqtt.Client(client_id=CLIENTID,userdata=socket, protocol=mqtt.MQTTv311)
      client.username_pw_set(USER, password=PASS)
      client.on_message = on_message
      client.on_connect = on_connect
      client.connect(BROKER, port=1883, keepalive=30)
      client.subscribe(TOPIC)
      client.loop_forever()
    

    동작 확인



    여기는 Alibaba Cloud 콘솔에서 'takeoff'라는 명령을 pusblish하여 이륙시키는 예입니다. 미세한 화면 전환은 생략합니다. 'land'를 publish하면 착륙합니다. 간단하네요.



    요약



    소감



    10분 정도로 배터리가 끊어지므로 충전 또는 배터리 교환 필요. 사람이 근처에 있어야 하기 때문에 초저전력 대기 모드라든지, 무선 충전 기능이라든가 없으면 원래 클라우드에서 원격 조작하는 의미가 ^^;
    PC나 라즈파이까지 없어도 ESP32를 2개(WiFi 환경이 Tello용과 인터넷 접속용의 2개 필요하기 때문에) 사용해 Arduino Core에서도 움직일 수 있는 것은 아닐까요.
    수중의 클라우드를 사용했습니다만, MQTT Broker로서 mosquitto, Publisher로서 mosquito_pub를 사용한 테스트도 할 수 있을까.

    마지막으로



    이것은 내 취미 활동입니다. 소속된 단체의 사고방식은 전혀 반영하지 않습니다.

    좋은 웹페이지 즐겨찾기