目的
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一覧に、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
{"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回くらい上手く動く感じでした...
いざ操縦
接続ができたら、自分の思うように操縦してみましょう!
操作できること
主に使うのは以下のものです。
静止
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
とでも名付け、ターミナルから実行します。
操縦のためのコードの参考はこちら
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分程度でなくなってしまいます。
予備のバッテリーもあるそうなので、複数人でやる際は用意しておくと便利かと思います。
まとめ
記事の感想をリアクションでお願いします!