Dronekit

プログラミング
image_print

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. こちらのほうがいろいろ参考になりました。

ついでながら、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

水平面に対する飛行機の軸の傾き

File:Yaw Axis Corrected.svg

print("Attitude: %s" % vehicle.attitude)
print("   pitch: %s" % vehicle.attitude.pitch)
print("     yaw: %s" % vehicle.attitude.yaw)
print("    roll: %s" % vehicle.attitude.roll)
velocity
現在の3次元の移動速度
print("Velocity: %s" % vehicle.velocity)
print("     x: %s" % vehicle.velocivy.vx)
print("     y: %s" % vehicle.velocivy.vy)
print("     z: %s" % vehicle.velocivy.vz)
gps
gpsの調整ができているか、いくつ衛星を補足できているかを示します。
print("GPS: %s" % vehicle.gps_0)
gimbal
ジンバルの状況(roll, yaw, pitch)
ジンバルはrelease()でユーザーがコントロール可能となり、rotate()かtarget_location()で動かす。
print("Gimbal status: %s" % vehicle.gimbal)

 battery

バッテリーの電圧(voltage)、電流(current)、残量(level) (%)
print("Battery: %s" % vehicle.battery)
print("   volt: %s" % vehicle.battery.voltage)
print("current: %s" % vehicle.battery.current)
print("  level: %s" % vehicle.battery.level)
ekf_ok

EKF(Extended Kalman Filter)が動作しているかどうか。EKFが働いていないと機体はセンサーの情報から安定させることができない。

print("EKF OK?: %s" % vehicle.ekf_ok)
last_heartbeat
最後にハートビートを受け取ってからの経過時間(秒)
print("Last Heartbeat: %s" % vehicle.last_heartbeat)
rangefinder

レンジファインダーについてはこちら

距離測定機器。レーザーや赤外線ビーム、超音波などで着陸、高度制御、物体回避、推進測定などに使われる。
距離と電圧が得られます。

print("Rangefinder distance: %s" % vehicle.rangefinder.distance)
print("Rangefinder voltage: %s" % vehicle.rangefinder.voltage)
heading
機体の向いている方向0-360度で表示。0が真北
print("Heding: %s" % vehicle.heading)
is_armable
Armingできるか? できない場合は、Mission Plannerで原因を探そう。
print("is Armable ?: %s" % vehicle.is_armable)
systemu_status

フライトコントローラーの状況。以下のいずれか。コマンドが可能なのはSTANBYかACTIVE

  • UNINIT: システムはイニシャライズされていない。不明。
  • BOOT: ブート中
  • CALIBRATING: キャリブレーション中。フライト不可
  • STANDBY: システムは準備状態。いつでもフライト可能
  • ACTIVE: システム稼働中。おそらくフライト中。モーター回転中。
  • CRITICAL:システムはノーマルな状態ではない。しかし、飛んでいるかもしれない。
  • EMERGENCY: 緊急事態。コントロールを失った。メイデイ。着陸中
  • POWEROFF: シャットダウンシーケンスに入っている
print("System Status: %s" % vehicle.system_status.state)

以下のパラメーターは設定も可能

groundspeed
対地速度。メートル/秒
ミッション中の速度(ここ参照
print("Groundspeed: %s" % vehicle.groundspeed)
airspeed
現在の速度(メートル/秒)。simple_goto()で指定されて移動中はその速度。
print("Airspeed: %s" % vehicle.airspeed)
mode
フライトモード
print("Mode: %s" % vehicle.mode.name)
armed
ARMかdisArmか?
print("Armed: %s" % vehicle.armed)
タイトルとURLをコピーしました