Pythonでドローンを操縦しよう

2020/10/05

【Python】 Python

t f B! P L

目的

Pythonに触れたことがない人向けに、Pythonになじんでもらうための導入のためです。
プログラムを書いてみることがゴールです。

ドローンについて

Parrotのミニドローン

Parrot Minidrone MAMBO FPV Packというドローンを使います。
製品ページ→
Parrot Minidrone MAMBO FPV Pack [パロットミニドローンマンボFPVパック] | Hitec Multiplex Japan Inc.

市販のドローンがすべてPythonで操縦できるわけではなく、対応しているものを選ぶ必要があります。
このParrotのドローンは対応している機種になります。



通常の操縦方法

コントローラーが付属しています。



また、アプリでも操縦できました。
FreeFlight Mini - Google Play のアプリ

ふつうにドローンを楽しむときはこれらで操縦したらいいのですが、今回はPythonをコントローラーの代わりに使います。

Pythonで動かす

pyparrotを使う

amymcgovern/pyparrot

Python interface for Parrot Drones pyparrot was designed and implemented by Dr. Amy McGovern to program Parrot Mambo and Parrot Bebop 2 drones using python. This interface was developed to teach K-20 STEM concepts (programming, math, and more) by programming a drone to fly autonomously.

こちらのライブラリを使います。
ドキュメントはこちら→Welcome to pyparrot’s documentation! — pyparrot 1.5.3 documentation

環境構築

いろいろとインストールしていきます。
仮想環境を作って、ドローン用の環境を作ります。

git clone https://github.com/amymcgovern/pyparrot.git

# 仮想環境をつくる
conda create -n drone python=3.7 anaconda
conda activate drone
# パッケージをinstall
conda install -y -c anaconda opencv
conda install -y -c menpo ffmpeg
brew install ffmpeg
pip install untangle
pip install zeroconf
pip install pyparrot

installはこちらのドキュメントを参考にしてください。
Installation — pyparrot 1.5.3 documentation

ドローンを接続

環境が整ったら、ドローンをパソコンと接続します。
接続に関する説明があまり見つからず、手こずってしまいました...

手順

  • ドローン本体にカメラをつける(重要)
  • ドローンの電源をつける
  • パソコン側で、WiFiをさがす
  • ドローン本体にカメラをつけるのが大事です。カメラ部分がWiFiのアンテナのようになっている様です。
    これに気付くまで時間がかかってしまいました。

    WiFi一覧に、Mambo_******というものが見つかればOKです。
    接続しましょう。ドローンと接続している間は通常のネットワークは使えません。

    接続テスト

    WiFiがつなげたら、動かしてみましょう。

    connect.py

    # 接続できるかの確認
    # https://github.com/amymcgovern/pyparrot/issues/116
    
    from pyparrot.Minidrone import Mambo
    
    mambo = Mambo(use_wifi=True)
    # 接続を試みる
    success = mambo.connect(num_retries=3)
    print(success)
    mambo.safe_takeoff(5)  # 離陸
    mambo.smart_sleep(3)  # 静止
    mambo.safe_land(5)  # 着陸
    
    mambo.disconnect()  # 接続解除

    上のコードをconnect.pyと名付け、ターミナルから実行します。

    python connect.py

    上手く接続できれば、

    % python connect.py
    
    {"d2c_port": 43210, "controller_type": "computer", "controller_name": "pyparrot"}
    {'status': 0, 'c2d_port': 6000, 'c2d_update_port': 51, 'c2d_user_port': 21}
    c2d_port is 6000
    starting listening at
     Success in setting up the wifi network to the drone!
    True
     trying to land
    timeout - trying again
    timeout - trying again
     disconnecting

    のようなログが出て、動きます。

    二つ目のつまずきポイントとして、ここが上手く動かないことが多々ありました。
    WiFi自体は接続できているのに、プログラムから操縦できない。
    こうなってしまったら、何度かwifiを切って接続し直す、という手段でなんとかつないでいました。体感では3回に1回くらい上手く動く感じでした...

    いざ操縦

    接続ができたら、自分の思うように操縦してみましょう!

    操作できること

    主に使うのは以下のものです。

  • 静止 smart_sleep
  • 移動 fly_direct
  • 方向転換 turn_degrees
  • 宙返り flip
  • 静止

    mambo.smart_sleep(5)

    何もせずに空中(地上)に静止します。
    ()のなかに入れた数字の時間静止します。

    移動

    mambo.fly_direct(roll=0, pitch=0, yaw=0, vertical_movement=0, duration=1)

    空中を移動させます。
    変数を操作することで、思い通りに飛行させることができます。

    roll, pitch, yaw, vertical_movementは-100~100の間の数値で設定。
    durationは飛行時間です。部屋が広くないと、1秒か2秒くらいが適切です。

    方向転換

    mambo.turn_degrees(90)

    ()のなかに-180~180の値を入力します。
    例えば、90を入れると右に90°方向転換します。

    宙返り

    mambo.flip(direction="front")

    ドローンを宙返りさせることができます。
    direction以下で前転、後転などを指定することができます。

    デモのプログラム

    一連の動作を詰め込んだプログラムです。

    # デモ用のプログラム
    from pyparrot.Minidrone import Mambo
    
    # you will need to change this to the address of YOUR mambo
    # mamboAddr = "e0:14:d0:63:3d:d0"
    
    # make my mambo object
    # remember to set True/False for the wifi depending on if you are using the wifi or the BLE to connect
    mambo = Mambo(use_wifi=True)
    
    print("trying to connect")
    success = mambo.connect(num_retries=3)
    print("connected: %s" % success)
    
    if (success):
        # get the state information
        print("sleeping")
        mambo.smart_sleep(2)
        mambo.ask_for_state_update()
        mambo.smart_sleep(2)
    
        print("taking off!")  # 離陸
        mambo.safe_takeoff(5)
    
        print("Flying direct: going forward (positive pitch)")  # 直進
        mambo.fly_direct(roll=0, pitch=0, yaw=0, vertical_movement=0, duration=1)
    
        print("Showing turning (in place) using turn_degrees")  # 回転
        mambo.turn_degrees(90)
        mambo.smart_sleep(2)
        mambo.turn_degrees(-90)
        mambo.smart_sleep(2)
    
        print("Flip")  # 宙返り
        mambo.flip(direction="front")
    
        print("landing")  # 離陸
        mambo.safe_land(5)
        mambo.smart_sleep(5)
    
        print("disconnect")
        mambo.disconnect()

    これもdemoMambo.pyとでも名付け、ターミナルから実行します。

    % python demoMambo.py

    操縦のためのコードの参考はこちら
    Minidrone Commands and Sensors — pyparrot 1.5.3 documentation

    自分なりのプログラムを作る

    これまででプログラムの雰囲気はつかめたかと思います。
    最後に自分の思うように操縦プログラムを作ってみましょう。

    from pyparrot.Minidrone import Mambo
    
    # make my mambo object
    # remember to set True/False for the wifi depending on if you are using the wifi or the BLE to connect
    mambo = Mambo(use_wifi=True)
    
    print("trying to connect")
    success = mambo.connect(num_retries=3)
    print("connected: %s" % success)
    
    mambo.safe_takeoff(2)  # 離陸
    mambo.smart_sleep(3)  # 静止
    # ここから、好きな動作を加えていきましょう。
    
    mambo.safe_land(5)  # 着陸
    mambo.disconnect()  # 接続解除

    ベースとなる部分です。
    mambo.smart_sleep(3)の静止のあとからの動作を付け加えていきましょう。
    数行書いたら、間違っていないかの確認を含め、とりあえず実行してみるのがおすすめです。

    困ったポイント

    接続が難しい

    カメラ部分を付けるのを忘れていると接続できないので、注意です。

    接続できても、操作できない

    いざWiFiにつなげても、調子次第で操縦ができません。
    相性の問題なのか、本体の問題なのか...

    バッテリーは複数ないときつい

    バッテリーはすぐに切れてしまいます。
    電源をつけて、プログラムを編集して、飛ばしてみて、、、
    とやっていると10分程度でなくなってしまいます。

    予備のバッテリーもあるそうなので、複数人でやる際は用意しておくと便利かと思います。

    まとめ

  • Python、プログラミングに触れたことがなくても楽しみやすい題材です
  • 画面でプログラムを見るだけでなく、リアルに動くものを見て学ぶほうがわかりやすい

  • 記事の感想をリアクションでお願いします!

    QooQ