LoginSignup
14
12

More than 5 years have passed since last update.

【Tello】トイ・ドローンで遊んでみた♪~Pythonで動画撮影しつつ飛んだ!

Last updated at Posted at 2018-12-10

昨夜はどうにかスマホや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環境でインストールするとインストールできました。
ということで、飛ばせて、動画入力まで出来たのでこれらを合体します。

動画撮影しつつ飛んだ!

今回は通過点ということもあり、以下のコードとしました。

takeoffVideo.py
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をコントロールできた

・次回は、物体検出、トラッキングのどちらかを実施する

14
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12