趣味探しブログ「研究しましょう」 --- 日記 マガジン

    やりたい趣味を探してネットをさまよう私の、ブログです --- I'm here. Find me out.
0

DJI ドローン Tello の動作確認プログラムを動かしてみた 🚁💨   #ドローン #プログラミング #Python

ドローンプログラムTEST
 DJI のドローン Tello の動作確認プログラムを、 Python で作ってみた。プログに乗せるために、記述のチェックをしてて、それに、チョット時間が掛かってしまった。

ドローンの Tello は WiFi のアクセスポイントとして接続するので、ノートパソコンの様に、WiFi が使える物が必要。そのため、私は、MacBookPro 上の Python でプログラミングをした。

上の写真が、自動離陸した後、どの場でホバリングしている、Tello ドローン。この状態で、もたもたしてると、タイムアウトが掛かって、自動着陸してしまう。

Tello は、ホバリングが、超、安定しているので、室内で遊ぶのに適していると思う。

 使い方は、Paython インタープリターを起動して、そこに、このコマンドで、下記のスクリプトを読み込む。

exec(open("[ファイル名].py").read())

以下のコードは main 関数を持たない形にしている。インタープリターに読み込んだら、プロンプトで関数をコールして動作させる。

WiFi で Tello に接続して、最初に connect() を実行する。そうすると、Tello に Socket に UDP 接続される。その後に、以下のコマンドを打って、ドローン操作する。

  takeoff() : ドローンの飛行開始(ある高さにきたらホバリングする)
  land() : ドローンを自動着陸させる

Pathon スクリプトから抜け出す時は、 exit() 関数を使う。インタープリターがロックしたら、MacBookPro の場合 Ctrl+C を使う。

 さてと、動作確認はできた。今後は、このままアプリを作って遊ぶ予定。どういう仕様にしようかなぁ

以下、動作確認テスト用のソース。

PS. 参考記事『Python ソケット通信のサンプル

import socket
#import tellopy    # 公式(?)ドローン制御ライブラリ
#import djitellopy

tello_ip      = b'192.168.10.1'   # Tello の IPアドレス
tello_port    = 8889              # Tello の UDP ポート番号
tello_address = (tello_ip, tello_port)
res_port      = 1518
srv_address   = (b'',9000)

tello_socket  = object # ドローンの接続用(nullの代替が分からない)
sw_res        = True  # print message: True or False

print("TELLO TEST Start")     # テスト用

# ドローンへの接続
def connect():
    global tello_socket,srv_address, tello_address
    tello_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # tello_socket.bind(srv_address)    # 必要性不明
    if tello_socket == object: return
    tello_socket.sendto(b'command',tello_address)
    getRes()

# 応答の取得
def getRes():
    if sw_res==False: return 
    global tello_socket,res_port
    if tello_socket == object:
        print("NO SOCKET")
        return
    retv, server = tello_socket.recvfrom(res_port)
    msg = retv.decode(encoding="utf-8")
    print(msg)
    return msg

# 飛行開始
def takeoff():
    if sw_res==False: print("takeoff")
    global tello_socket,tello_address,tello_ip,tello_port
    tello_socket.sendto(b'takeoff',tello_address)
    getRes()

# 着陸
def land():
    if sw_res==False: print("land")
    global tello_socket,tello_address,tello_ip,tello_port
    tello_socket.sendto(b'land',tello_address)
    getRes()    # 着陸完了後に OK が返ってくる

# 高度下げ
def down(dist):
    global tello_socket,tello_address,tello_port
    if sw_res==False: print("dist:"+str(dist))
    tello_socket.sendto(b'land '+str(dist),tello_address)
    getRes()

def quit():
    global tello_socket
    tello_socket.close()

def resTest():
    global tello_socket
    retv = getRes(tello_socket)
    print(retv)

該当の記事は見つかりませんでした。