見出し画像

【プログラミング】【初心者】Pythonでトイドローンを操作してみる

始めに

2020年に流行した新型コロナの影響もあり,企業ではますますDXやIoTの推進の意識が高くなっている.その一方でDXやIoTに関して明確なイメージがある人は少ないと感じる.その中で実際に自身で手を動かし,体験することは重要だと考える.
(何よりもドローンを実際に操作してみると楽しいですよ)

本記事はPythonを使用してトイドローンを操作するものになる.
トイドローンはスマホに専用アプリを入れることで簡単に操作することができる.その中であえてプログラミングを利用して操作する理由は僕が思うに以下の2点である.
1.決まった操作を確実に行うことができる
2.画像処理を使っての操作ができる

1.に関して
僕のような不器用で操作が苦手な人はプログラミングで操作した方が確実に安全に操作ができる.
(もちろんコントローラーで操作するのも楽しい)
また,複数のドローンを操作することを想定した場合,プログラミングの方が確実に編隊を組むことができる.
2.に関して
どちらかというと,こちらの方が重要だ(面白い)と考えている.Pythonから操作することでドローンで取得した画像を安易に画像処理が可能になる.
今後(既に?),ドローンが社会でどんどん活用される中でのベースの技術を体験できるのではないかと考える.

環境

Python実行環境
MacBook Pro (Retina, 13-inch, Late 2013)
Python 3.6.1
トイドローン
Ryze トイドローン Tello Powered by DJI

本記事の内容

本文に書かれている内容は,シンプルにPythonのコードだけである.
僕が今回,こだわった点としては以下の2点である.
・今後の発展を考えてまずは必要最低限のコードで記述
 公開されているモジュールなどを使用をせずに基本的なコードで記述している.関数化などもせずに記述している.また,公開されているモジュールがPython2であることもあり,極力,バージョンなどの影響を少なくする意図もある.
・画像を取得できること
 上述したように画像処理ができることがプログラミングで操作する大きな利点だと考えている.従って,画像処理の記述は必須である.

本内容はあくまでも僕の環境で,着陸,離陸,画像の取得,ができたものである.本記事の内容によって起きた不利益に関して一切責任は負いません.それでもよろしければ先にお進みください.
(要するに苦情はやめてもらいたいです)
また,本来であればネットワークの知識も必要そうだが割愛している.

本文

# Tello Python3 Control Basic 

import socket
import time
import threading

# 画像処理用
import cv2

# Create a UDP socket 定型文
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tello_address = ('192.168.10.1' , 8889)

# -----
# トイドローンに命令を出す際のテンプレート
# socket.sendto('★命令をコマンド記述★'.encode('utf-8'), tello_address)
# コマンドに関してはドキュメント参照
# https://dl-cdn.ryzerobotics.com/downloads/Tello/Tello%20SDK%202.0%20User%20Guide.pdf
# -----

# command-mode : 'command' まず始めにこれが必要
socket.sendto('command'.encode('utf-8'), tello_address)
print ('start')

# 離陸
socket.sendto('takeoff'.encode('utf-8'), tello_address)
print ('takeoff')

# ビデオストリーミング開始
socket.sendto('streamon'.encode('utf-8'), tello_address)
print("streamon")

# ビデオストリーミングを取得して、ウィンドウに表示
udp_video_address = cv2.VideoCapture('udp://@0.0.0.0:11111')
print(type(udp_video_address))


# 画面で"q"を押下することで画面を閉じる
while True:
   ret, frame = udp_video_address.read()
   cv2.imshow('frame', frame)
   if cv2.waitKey(1) & 0xFF == ord('q'):
       break
cap.release()
cv2.destroyAllWindows()

# ビデオストリーミングを停止させるため、'streamoff'というテキストを投げる
socket.sendto('streamoff'.encode('utf-8'), tello_address)
print ('video')

# 着陸
socket.sendto('land'.encode('utf-8'), tello_address)
print ('land')

# 終了
socket.sendto('end'.encode('utf-8'), tello_address)
print ('end')

終わりに

わざわざ購入してまで見ていただきありがとうございます.
苦情は受け付けませんと前述していますが,問い合わせいただいたら極力自己学習のために調査させていただきます.

--
僕の部屋の窓の外から2010年にリリースされたAKB48のriverが聞こえてきます.当時,AKB48の人気はすごく,TVつけたらAKB48メンバーが常に出演していましたが,最近ではめっきり見かけることがなくなりました.
同じような時期に話題になり始めたデータサイエンティスト人材は10年たった今でも未だに不足していると言われています.ただ,それはもしかしたらそれは虚構なのかもしれません.
(僕は真偽はわかりません.適当に書いています)
DX,IoT人材も当分の間はデータサイエンティスト同様に不足していると言われると思います.どうなるかはわかりませんが,今のうちに慣れておくのはいいのかもしれないですね.

PCとスマホ,wifiだけを持って全国をのんびり旅したい.