Dronekitの意味
PythonからドローンをコントロールするツールのほとんどはPyMAVLinkというパッケージを利用します。
しかし、PyMAVLinkは使い方が難しいので、Dronekitという上位(=より簡単)のパッケージがあります。
もともとは3D Roboticsが開発したということで、そのサイトがこちら。
開発が止まっているといわれながらも、masterは修正が続けられているようです。
なによりも人気でGitHubを見るとforkが1.3Kもあります。
こういうものって「最新バージョン」であっても基本的なところは変わらないので、使うことにします。いきなりこの世から消えることはない、と思いたい。
インストール
ubuntuインストール終了後から
いつもの
sudo apt update
sudo apt upgrade
sudo apt install ubuntu-desktop
sudo apt update
sudo apt autoremove --purge
sudo apt autoclearn
#sudo apt install git ubuntuにはすでに入っている
Ardupilotのもちこみですが、私はcloneしてます。
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive
セットアップを忘れずに
cd ardupilot
./Tools/environment_install/install-prereqs-ubuntu.sh -y
ログアウトしてログインしなおします。つーか、Rebootしたほうがいい。
SITLの起動
(2024/5 追記:SITLの場所が ardupilot/ArduCopter -> ardupilot/Tools/autotest に変わった)
cd Tools/autotest/
sim_vehicle.py -w
一番最初は-wで動かします。仮想EEPROMのリフレッシュらしい。コンパイルが始まります。
sim_vehicle.py -v Rover --map --console -L Kawachi
-vにはドローンタイプを書きます。各フレームタイプはこのページを参照 example of using SITL by vehcle
-L以下のパラメーターはどこにシミュレーター機体を置くかで、ardupilot/Tools/autotest/locations.txtにある場所を書きます。
DRONE KIT
ちゃんと使うならソースからインストールすることが推奨されています。
git clone https://github.com/dronekit/dronekit-python.git
cd dronekit-python
python setup.py build install --user
dronekitのsitlより、本物のsitlを使ったほうがいいです。なにとなにが繋げるのか明確にしましょう。
また、アップデートされています。
DroneKitのドキュメントはこちらhttps://readthedocs.org/projects/dronekit-python/.
ガイド
サンプル
API リファレンス
サンプルはGithub上にもあり /dronekit-python/examples. こちらのほうがいろいろ参考になりました。
- Documentation:https://dronekit-python.readthedocs.io/en/latest/about/index.html
- Guides:[https://dronekit-python.readthedocs.io/en/latest/guide/index.html)
- API Reference:[https://dronekit-python.readthedocs.io/en/latest/automodule.html)
- Examples:/dronekit-python/examples
- Forums:http://discuss.dronekit.io/
ついでながら、Drone kitを作った3DRoboticsのウェブサイトは姿を消しました。
会社は存在しているようですが、2017年頃を最後にコンシューマー向けのドローンにかかわることをやめました。
この会社はクリス・アンダーソンという「フリー」「ロングテール」「メイカーズ」などのビジョンと本で有名な人の出資で作られた会社でした。
Ardupilotも初期は3DRoboticsがかかわっていたし、フライトコントローラーのベストセラーPixhawkの製造もこの会社の産物です。素晴らしい技術でドローン業界を引っ張っていたのにずさんな経営でおカネを無駄にしてしまったようです。
5年経った今も3DRoboticsの財産はドローン業界に強い影響を残しています。
DRONE KITのテスト
まず、SITLを
というわけでDRONEKITでプログラムを書いていたのですが、接続が極めて不安定です。
例えば
from dronekit import connect as VehicleConnect
connectstring = "tcp:127.0.0.1:5762"
connectstring2 = "udp:127.0.0.1:14550"
vehicle = VehicleConnect(connectstring, wait_ready=False)
vehicle.wait_ready('autopilot_version')
print("connected")
Connectでwait_ready=Trueで待つと戻ってこないことがあります。
API内ではコールバックの説明が多いのですが、ひとつひとつコールバックしていたらたまったもんじゃないので、
タイマーで周期的に取りにいきたいものです。
また、値をセットしたら読み出してセットされるまで待て、と強調されています。要するにフライトコントローラーはコマンドを受け付けたり受け付けなかったりするタイミングがあるので値をセットしたら、必ず読み出して確認しろ、ということです。
メソッドの解読
以下、ステータスを知るメソッド。
(以下のサンプルコードは動きますが、レイアウトはきれいではありません。)
global_frame
緯度、経度はWGS84 coorinate systemに従っている。高度は海抜。
print("Global Location: %s" % vehicle.location.global_frame)
print(" lat: %s" % vehicle.location.global_frame.lat)
print(" lon: %s" % vehicle.location.global_frame.lon)
print(" alt: %s" % vehicle.location.global_frame.alt)
global_relative_frame
Homeロケーションからの相対位置。緯度経度はglobal_frameと同じ? 高度は違う。
print("Global Location (relative altitude): %s" % vehicle.location.global_relative_frame)
print(" lat: %s" % vehicle.location.global_relative_frame.lat)
print(" lon: %s" % vehicle.location.global_relative_frame.lon)
print(" alt: %s" % vehicle.location.global_relative_frame.alt)
local_frame
north, east, downで示される三次元座標。
Armしてからでないと更新されない。(たぶん、出発点からの相対位置)
print("Local Location: %s" % vehicle.location.local_frame)
print(" north: %s" % vehicle.location.local_frame.north)
print(" east: %s" % vehicle.location.local_frame.east)
print(" down: %s" % vehicle.location.local_frame.down)
attitude
水平面に対する飛行機の軸の傾き
print("Attitude: %s" % vehicle.attitude)
print(" pitch: %s" % vehicle.attitude.pitch)
print(" yaw: %s" % vehicle.attitude.yaw)
print(" roll: %s" % vehicle.attitude.roll)
print("Velocity: %s" % vehicle.velocity)
print(" x: %s" % vehicle.velocivy.vx)
print(" y: %s" % vehicle.velocivy.vy)
print(" z: %s" % vehicle.velocivy.vz)
print("GPS: %s" % vehicle.gps_0)
ジンバルはrelease()でユーザーがコントロール可能となり、rotate()かtarget_location()で動かす。
print("Gimbal status: %s" % vehicle.gimbal)
battery
print("Battery: %s" % vehicle.battery)
print(" volt: %s" % vehicle.battery.voltage)
print("current: %s" % vehicle.battery.current)
print(" level: %s" % vehicle.battery.level)
EKF(Extended Kalman Filter)が動作しているかどうか。EKFが働いていないと機体はセンサーの情報から安定させることができない。
print("EKF OK?: %s" % vehicle.ekf_ok)
print("Last Heartbeat: %s" % vehicle.last_heartbeat)
レンジファインダーについてはこちら
距離測定機器。レーザーや赤外線ビーム、超音波などで着陸、高度制御、物体回避、推進測定などに使われる。
距離と電圧が得られます。
print("Rangefinder distance: %s" % vehicle.rangefinder.distance)
print("Rangefinder voltage: %s" % vehicle.rangefinder.voltage)
print("Heding: %s" % vehicle.heading)
print("is Armable ?: %s" % vehicle.is_armable)
フライトコントローラーの状況。以下のいずれか。コマンドが可能なのはSTANBYかACTIVE
- UNINIT: システムはイニシャライズされていない。不明。
- BOOT: ブート中
- CALIBRATING: キャリブレーション中。フライト不可
- STANDBY: システムは準備状態。いつでもフライト可能
- ACTIVE: システム稼働中。おそらくフライト中。モーター回転中。
- CRITICAL:システムはノーマルな状態ではない。しかし、飛んでいるかもしれない。
- EMERGENCY: 緊急事態。コントロールを失った。メイデイ。着陸中
- POWEROFF: シャットダウンシーケンスに入っている
print("System Status: %s" % vehicle.system_status.state)
以下のパラメーターは設定も可能
ミッション中の速度(ここ参照)
print("Groundspeed: %s" % vehicle.groundspeed)
print("Airspeed: %s" % vehicle.airspeed)
print("Mode: %s" % vehicle.mode.name)
print("Armed: %s" % vehicle.armed)