昨夜はどうにかスマホやGamePadで飛ばし、Scratchでプログラミングして飛ばすところまでやった。
第二夜は、これをPythonで飛ばして、かつ動画撮影まで出来た。
一応の目標
①とにかく飛行させる
②GamePadで飛ばす
③PCで飛ばす
④Pythonで飛ばす
⑤画像入力する
⑥物体検出搭載
⑦トラッキングする
⑧物体を探して見つける
⑨...
ということで、今回は
④Pythonで飛ばす
⑤画像動画入力する
について報告する。
コードは以下に置いた
Tello/takeoffVideo.py
なお、このコードは以下の参考サイトのTellopyをインストールして、そこにあるフレームワークを前提としている。
【参考】
・hanyazou/TelloPy
④Pythonで飛ばす
これは、上記参考をインストールして、
python -m tellopy.examples.simple_takeoff
と入力すれば、飛んだ。
⑤画像動画入力する
こちらも同じように以下をインストールして試そうとしたが、
$ pip install av
$ pip install opencv-python
$ pip install image
$ python -m tellopy.examples.video_effect
実はこれはWindowsの実行環境ではavがインストールできなかった。
そこで、conda環境でインストールするとインストールできました。
ということで、飛ばせて、動画入力まで出来たのでこれらを合体します。
動画撮影しつつ飛んだ!
今回は通過点ということもあり、以下のコードとしました。
import sys
import traceback
import tellopy
import av
import cv2.cv2 as cv2 # for avoidance of pylint error
import numpy
import time
from time import sleep
def videoCamera(start_time,container,drone,set_time):
frame_skip = 300
while True:
for frame in container.decode(video=0):
if 0 < frame_skip:
frame_skip = frame_skip - 1
continue
image = cv2.cvtColor(numpy.array(frame.to_image()), cv2.COLOR_RGB2BGR)
cv2.imshow('Original', image)
#cv2.imshow('Canny', cv2.Canny(image, 100, 200))
cv2.waitKey(1)
if frame.time_base < 1.0/60:
time_base = 1.0/60
else:
time_base = frame.time_base
frame_skip = int((time.time() - start_time)/time_base)
if time.time() - start_time > set_time:
return
else:
continue
def main():
drone = tellopy.Tello()
try:
drone.connect()
drone.wait_for_connection(60.0)
drone.takeoff()
#sleep(10)
container = av.open(drone.get_video_stream())
start_time = time.time()
videoCamera(start_time,container,drone,10)
drone.down(50)
sleep(5)
start_time = time.time()
videoCamera(start_time,container,drone,10)
drone.land()
sleep(5)
drone.quit()
cv2.destroyAllWindows()
except Exception as ex:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_traceback)
print(ex)
finally:
drone.quit()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
これで、どうにかtakeoffして、動画撮影10sして、降りてきて再度動画撮影10s、最後に無事に着陸しました。
ちなみに今回は動画の乱れもほとんどなく転送時間も動画っぽく取れました。
まとめ
・PythonでTelloを飛ばせた
・動画を撮影しつつTelloをコントロールできた
・次回は、物体検出、トラッキングのどちらかを実施する