Dronekitによる python apiとアプリ開発の概要

Masami Ogoshi
Masami Ogoshi代表取締役 at WASP株式会社
Dronekitによる Python APIと
アプリ開発の概要
@ogochan
2015年7月20日
DroneKit-Pythonとは
• DroneKitの中心的API
• companion computer上で稼動して、
AruduPilotと通信する
• 自律運転(オートパイロット)を高度化する
• MAVLinkで通信する
• 制御だけでなくテレメータ機能もある
• OSS(Apacheライセンス)でGithubにホストされ
ている
Pythonかよ!
• 「RubyやC++じゃねーの?」
• ↑と文法的にかけ離れてるわけじゃない
• 後述するようにプログラムとして難しいわけじゃない
(「凄いテクニック」とかいらない)
• ぶっちゃけPythonよくわからなくても、サンプル見た
らなんとなくわかる(私もそうだった)
たいした問題じゃない!
APIの機能
• 機体リストの取得
• 機体の状態を設定、テレメトリの取得
• 非同期に状態変更を受信する
• waypoint mission(通過点を指定した飛行)の
作成と管理(自動モード)
• 指定した場所への誘導(誘導モード)
• 機体へのメッセージ送信
• 設定済みラジコンチャンネルの書き換え
API一覧
クラス API 機能 値
droneapi.lib.APIConnection exit 現在のスレッドが終了しているかどうか 終了していたらTrue
get_vehicles 現在のコネクションで制御可能な機体の取得 制御可能なVehicleオブジェクトの集合
droneapi.lib.Vehicle
location 現在のLocation droneapi.lib.Location
attitude 現在のAttitude droneapi.lib.Attitude
velocity 現在の速度 [ vx, vy, vz ]
mode 現在の飛行モードの取得と設定 droneapi.lib.VehicleMode
airspeed 現在の対気速度 double
groundspeed 現在の対地速度 double
gps_0 GPSの情報 droneapi.lib.GPSInfo
armed 装備状態 boolean
mount_status ジンバルの状態 [ pitch, yaw, roll ] or None
battery バッテリの状態 droneapi.lib.Battery
channel_override RCチャネルの直接的な変更 ハッシュ
channel_readback RCチャネルの読み出し ハッシュ
add_attribute_observer 属性オブザーバの追加
commands 現在の飛行の通過点(waypoint)の取得 droneapi.lib.CommandSequence
flush() いわゆるflush
message_factory 生MAV Linkメッセージを作成するオブジェクトを得る
parameters 機体のパラメータ(編集可能)を得る droneapi.lib.Parameters
remove_attribute_observer 属性オブザーバの削除
send_mavlink 生MAV Linkメッセージの送信
set_mavlink_callback 非同期通知を受け取った時のcallbackの設定
droneapi.lib.Location 機体の位置
lat Latitude(緯度) double
lon Longitude(経度)
alt Altitude(高度)
is_relative 高度が絶対(海抜)か相対(ホーム位置)か True or False
droneapi.lib.Attitude 機体の方向
pitch ピッチ radian
yaw ヨー radian
roll ロール radian
droneapi.lib.VehicleMode フライトモード(機体特性に依る)
name モードの名前
droneapi.lib.GPSInfo GPSの情報
eph HDOP(Horizontal Dilution of Precision) cm
epv VDOP(Vertical Dilution of Precision) cm
fix_type GPSの運転モード 0: no, 2:2D, 3:3D
satellites_visible 見えている衛星の数
droneapi.lib.Battery バッテリーの状態
voltage 電圧 mV
current 電流 10mA
level 残量
droneapi.lib.CommandSequence 飛行の通過点(waypoint)の並び
takeoff(altitude) テイクオフ 高度
add(cmd) 通過点の追加 droneapi.lib.Command
clear() コマンドリストの消去
count 通過点の数
download() 機体から通過点をダウンロード
goto(location) 指定位置への移動 droneapi.lib.Location
next 現在意味のある通過点の数
wait_valid() 通過点ダウンロードが終了するまでブロック
droneapi.lib.Parameters 機体のパラメータ
[]= パラメータの設定
[] パラメータの参照
キモ
いっぱいあるけど、
droneapi.lib.Vehicle
が理解出来れば、
だいたいOK
他はほとんどデータ操作
droneapi.lib.Vehicle
location 現在のLocation droneapi.lib.Location
attitude 現在のAttitude droneapi.lib.Attitude
velocity 現在の速度 [ vx, vy, vz ]
mode 現在の飛行モードの取得と設定 droneapi.lib.VehicleMode
airspeed 現在の対気速度 double
groundspeed 現在の対地速度 double
gps_0 GPSの情報 droneapi.lib.GPSInfo
armed 装備状態 boolean
mount_status ジンバルの状態 [ pitch, yaw, roll ] or None
battery バッテリの状態 droneapi.lib.Battery
channel_override RCチャネルの直接的な変更 ハッシュ
channel_readback RCチャネルの読み出し ハッシュ
add_attribute_observer 属性オブザーバの追加
commands 現在の飛行の通過点(waypoint)の取得 droneapi.lib.CommandSequence
flush() いわゆるflush
message_factory 生MAV Linkメッセージを作成するオブジェクトを得る
parameters 機体のパラメータ(編集可能)を得る droneapi.lib.Parameters
remove_attribute_observer 属性オブザーバの削除
send_mavlink 生MAV Linkメッセージの送信
set_mavlink_callback 非同期通知を受け取った時のcallbackの設定
droneapi.lib.Location
lat Latitude(緯度) double
lon Longitude(経度)
alt Altitude(高度)
is_relative 高度が絶対(海抜)か相対(ホーム位置)か True or False
droneapi.lib.Attitude
pitch ピッチ radian
yaw ヨー radian
roll ロール radian
droneapi.lib.Battery
voltage 電圧 mV
current 電流 10mA
level 残量
droneapi.lib.CommandSequence
takeoff(altitude) テイクオフ 高度
add(cmd) 通過点の追加 droneapi.lib.Command
clear() コマンドリストの消去
count 通過点の数
download() 機体から通過点をダウンロード
goto(location) 指定位置への移動 droneapi.lib.Location
next 現在意味のある通過点の数
wait_valid() 通過点ダウンロードが終了するまでブロック
サンプル解説
http://python.dronekit.io/examples/index.html
にあるサンプルの解説をちょっとだけします。
今回は、
• Vehicle State
• Simple Go To (Copter)
• Follow Me
を解説します。
Vehicle State(1)
from droneapi.lib import VehicleMode
from pymavlink import mavutil
import time
api = local_connect()
v = api.get_vehicles()[0]
ライブラリのインポート
コネクションの確立
コネクション配下にある最初の機体の情
報の取得
値の出力をします
Vehicle State(2)
print "nGet all vehicle attribute values:"
print " Location: %s" % v.location
print " Attitude: %s" % v.attitude
print " Velocity: %s" % v.velocity
print " GPS: %s" % v.gps_0
print " Groundspeed: %s" % v.groundspeed
print " Airspeed: %s" % v.airspeed
print " Mount status: %s" % v.mount_status
print " Battery: %s" % v.battery
print " Mode: %s" % v.mode.name # settable
print " Armed: %s" % v.armed # settable
それぞれの値はそれぞれのクラスなの
だけど、’print’は良きにはからってくれま
す。
値の出力をします
Vehicle State(2)
Get all vehicle attribute values:
Location: Attitude: Attitude:pitch=-0.00405988190323,yaw=-0.0973932668567,roll=-
0.00393210304901
Velocity: [0.06, -0.07, 0.0]
GPS: GPSInfo:fix=3,num_sat=10
Groundspeed: 0.0
Airspeed: 0.0
Mount status: [None, None, None]
Battery: Battery voltage: 12590, current: 0, level: 99
Mode: STABILIZE
Armed: False
この辺の実行結果
Vehicle State(3)
print "Set Vehicle.mode=GUIDED
(currently: %s)" % v.mode.name
v.mode = VehicleMode("GUIDED")
v.flush()
while not v.mode.name=='GUIDED' and not
api.exit:
print " Waiting for mode change ..."
time.sleep(1)
print "Set Vehicle.armed=True (currently: %s)" %
v.armed
v.armed = True
v.flush()
while not v.armed and not api.exit:
print " Waiting for arming..."
time.sleep(1)
フライトモードを’GUDED’にします
確実な操作をするために、flushして状態
が変化するまで待ちます
‘armed’にします
同じく確実に操作するためにflushして状
態が変化するまで待ちます
機体を「armed」にします
Vehicle State(3)
Set Vehicle.mode=GUIDED (currently: STABILIZE)
Waiting for mode change ...
Got MAVLink msg: COMMAND_ACK {command : 11, result : 0}
GUIDED> Mode GUIDED
Set Vehicle.armed=True (currently: False)
Waiting for arming...
APM: ARMING MOTORS
APM: Initialising APM...
Got MAVLink msg: COMMAND_ACK {command : 400, result : 0}
ARMED
この辺の実行結果
Vehicle State(4)
def mode_callback(attribute):
print " CALLBACK: Mode changed to: ",
v.mode.name
print "nAdd mode attribute observer for
Vehicle.mode"
v.add_attribute_observer('mode', mode_callback)
print " Set mode=STABILIZE (currently: %s)" %
v.mode.name
v.mode = VehicleMode("STABILIZE")
v.flush()
print " Wait 2s so callback invoked before
observer removed"
time.sleep(2)
v.remove_attribute_observer('mode',
mode_callback)
オブザーバの内容です。「オブザーバ」と
か言ってますが、要するにコールバック
です。
モード変更のオブザーバとして登録しま
す
モードを‘STABILIZE’にします
確実に操作するためにflushして状態が
変化するまで待ちます
オブザーバを外すのを2秒待ちます
オブザーバを外します
オブザーバをつけたり外したりします
Vehicle State(4)
Add mode attribute observer for Vehicle.mode
Set mode=STABILIZE (currently: GUIDED)
Wait 2s so callback invoked before observer removed
Got MAVLink msg: COMMAND_ACK {command : 11, result : 0}
STABILIZE> Mode STABILIZE
CALLBACK: Mode changed to: STABILIZE
この辺の実行結果
Vehicle State(5)
print "nGet home location"
cmds = v.commands
cmds.download()
cmds.wait_valid()
print " Home WP: %s" % cmds[0]
現在のミッションの通過点(waypoint)をダ
ウンロードします
ダウンロードが完了するまで待ちます
一番最初の通過点は初期位置です
機体の初期位置(home location)を得ます
Vehicle State(5)
Get home location
Requesting 0 waypoints t=Fri May 15 11:35:58 2015 now=Fri May 15 11:35:58 2015
Home WP: MISSION_ITEM {target_system : 255, target_component : 0, seq : 0, frame : 0,
command : 16, current : 0, autocontinue : 1, param1 : 0.0, param2 : 0.0, param3 : 0.0, param4 :
0.0, x : -35.3632621765, y : 149.165237427, z : 583.729980469}
この辺の実行結果
Vehicle State(6)
print "nRead vehicle param 'THR_MIN': %s" %
v.parameters['THR_MIN']
print "Write vehicle param 'THR_MIN' : 10"
v.parameters['THR_MIN']=10
v.flush()
print "Read new value of param
'THR_MIN': %s" % v.parameters['THR_MIN']
パラメータ‘THR_MIN’を読みます。
パラメータ’THR_MIN’を10に設定します
完了するまで待ちます
あらためてパラメータ’THR_MIN’を読み
ます
なお、’THR_MIN’とはストットルの最小値
を意味します。
機体のパラメータの読み出し書き込みをします
Vehicle State(6)
Read vehicle param 'THR_MIN': 130.0
Write vehicle param 'THR_MIN' : 10
timeout setting THR_MIN to 10.000000
Read new value of param 'THR_MIN': 10.0
この辺の実行結果
Vehicle State(7)
print "nOverriding RC channels for roll and yaw"
v.channel_override = { "1" : 900, "4" : 1000 }
v.flush()
print " Current overrides are:",
v.channel_override
print " Channel default values:",
v.channel_readback # All channel values before
override
# Cancel override by setting channels to 0
print " Cancelling override"
v.channel_override = { "1" : 0, "4" : 0 }
v.flush()
チャネルの値を変更します
反映させます
上書きされた値を表示します
元の値を表示します
上書きをやめてコントローラの値に戻し
ます(0を設定するのはそういう意味)
反映させます
RCチャンネルの上書き
Vehicle State(7)
Overriding RC channels for roll and yaw
Current overrides are: {'1': 900, '4': 1000}
Channel default values: {'1': 1500, '3': 1000, '2': 1500, '5': 1800, '4': 1500, '7': 1000, '6': 1000, '8':
1800}
Cancelling override
この辺の実行結果
Vehicle State(8)
print "nReset vehicle atributes/parameters and
exit“
v.mode = VehicleMode("STABILIZE")
v.armed = False
v.parameters['THR_MIN']=130
v.flush()
機体モードを’STABILIZE’に
armedをFalseに
スロットル最小値を130に
反映させます
ヤバそうな値は元に戻しておきます
Vehicle State(8)
Reset vehicle atributes/parameters and exit
Got MAVLink msg: COMMAND_ACK {command : 11, result : 0}
APM: DISARMING MOTORS
Got MAVLink msg: COMMAND_ACK {command : 400, result : 0}
DISARMED
timeout setting THR_MIN to 130.000000
APIThread-0 exiting...
この辺の実行結果
Simple Go To (Copter) (1)
import time
from droneapi.lib import VehicleMode
from pymavlink import mavutil
api = local_connect()
v = api.get_vehicles()[0]
ライブラリのインポート
コネクションの確立
コネクション配下にある最初の機体の情
報の取得
目的の場所に移動させるサンプルです
Simple Go To (Copter) (2)
def arm_and_takeoff(aTargetAltitude):
print "Basic pre-arm checks"
if vehicle.mode.name == "INITIALISING":
print "Waiting for vehicle to initialise“
time.sleep(1)
while vehicle.gps_0.fix_type < 2:
print “Waiting for GPS...:”, vehicle.
gps_0. fix_type
time.sleep(1)
armedにし、目的の高度まで飛び上がる
関数(手続)を定義します
メッセージを出します
モードが’INITIALISING’であれば、
「初期化待ち」を表示して
1秒待ちます
GPSが有効になるまで
メッセージを出して
1秒待ちます
機体とGPSの初期化をします
GPSのfix_typeが2次元未満の場合は、
GPSは無効の状態です
Simple Go To (Copter) (3)
print "Arming motors“
vehicle.mode = VehicleMode("GUIDED")
vehicle.armed = True
vehicle.flush()
while not vehicle.armed and not api.exit:
print " Waiting for arming...“
time.sleep(1)
メッセージを出します
モードが’GUIDED’にして
armedにします
変更を反映させて、
armedになるまで
メッセージを出して
1秒待ちます
armedにします
モードの’GUIDED’とは、通過点通りに飛
行する以外のモードです
Simple Go To (Copter) (4)
print "Taking off!“
vehicle.commands.takeoff(aTargetAltitude)
vehicle.flush()
メッセージを出します
目的の高度まで飛行するコマンドを出し
反映させます
飛び立ちます
Simple Go To (Copter) (5)
while not api.exit:
print " Altitude: ", vehicle.location.alt
if vehicle.location.alt >=
aTargetAltitude * 0.95:
print "Reached target altitude“
break;
time.sleep(1)
APIが生きている限り
高度を表示します
目的の高度であるか調べ、
目的の高度であればメッセー
ジを出して、
ループを抜けます
そうでなければ1秒待ちます
目的の高度になるまで処理を待ちます
Simple Go To (Copter) (6)
arm_and_takeoff(20)
print "Going to first point..."
point1 = Location(-35.361354, 149.165218, 20,
is_relative=True)
vehicle.commands.goto(point1)
vehicle.flush()
time.sleep(30)
print "Going to second point..."
point2 = Location(-35.363244, 149.168801, 20,
is_relative=True)
vehicle.commands.goto(point2)
vehicle.flush()
time.sleep(20)
print "Returning to Launch"
vehicle.mode = VehicleMode("RTL")
vehicle.flush()
目的高度まで飛び立たせます
最初のポイントに飛行します
最初の点のLocationを作ります
移動するよう指示して
反映させます
30秒待ちます(多分その間に飛行する)
次のポイントに飛行します
次のポイントのLocationを作ります
移動するよう指示して
反映させます
20秒待ちます(多分その間に飛行する)
帰投モードにします
反映させます
メインのコントロールです
Follow Me(1)
import gps
import socket
import time
from droneapi.lib import VehicleMode, Location
ライブラリのインポート
このサンプルでは、GPSデーモンと通信し
て、その位置に移動させるために、今ま
でとはちょっと違うライブラリもインポート
しています
「付いて来る」
Follow Me(2)
def followme():
try:
api = local_connect()
v = api.get_vehicles()[0]
if v.mode.name == "INITIALISING":
print "Vehicle still booting, try
again later"
return
cmds = v.commands
is_guided = False
gpsd = gps. gps ( mode = gps.
WATCH_ENABLE)
「付いて来る」関数を定義します
例外処理を考慮します
いつもの準備
モードが’INITIALISING’であれば、
「後にしろ」を表示して
おしまい
Commandを取得します
GPSが取得出来るようにしま
す
機体とGPSの初期化をします
Follow Me(3)
while not api.exit:
gpsd.next()
if is_guided and v.mode.name != "GUIDED":
print "User has changed flight modes -
aborting follow-me“
break
if (gpsd.valid & gps.LATLON_SET) != 0:
altitude = 30
dest = Location(gpsd.fix.latitude,
gpsd.fix.longitude, altitude,
is_relative=True)
print "Going to: %s" % dest
cmds.goto(dest)
is_guided = True
v.flush()
time.sleep(2)
APIが生きている間
GPSデータを取得します
モードに矛盾があったら停止
GPSデータが有効であれば
高さを30mにして
GPSから取得した位置で
Locationを作り、
Locationを表示し
Locationに行くように指示
反映させて
2秒待ちます
「付いて来る」の本体
Follow Me(4)
except socket.error:
print "Error: gpsd service does not seem to
be running, plug in USB GPS or run run-fake-
gps.sh"
socketの例外の場合
メッセージを出します
例外処理
おまけ(DroneKitのbuild)
git clone git://github.com/diydrones/ardupilot.git
sudo apt-get install python-matplotlib python-
serial python-wxgtk2.8 python-lxml
sudo apt-get install python-scipy python-opencv
ccache gawk git python-pip python-pexpect
sudo pip install pymavlink MAVProxy
cd ardupilot
export PATH=$PATH:$HOME/ardupilot/jsbsim/src
export
PATH=$PATH:$HOME/ardupilot/Tools/autotest
sim_vehicle.sh -w
ソースを取得
いろいろ必要なものをインストール
環境変数作る
Buildもこの中で勝手にしてくれる
IA64、RaspberryPi上で可能(Ubuntu 14)
1 of 38

Recommended

Drone programming with ArduPilot by
Drone programming  with ArduPilotDrone programming  with ArduPilot
Drone programming with ArduPilotLINE Corporation
2.5K views31 slides
あれから2年、オープンソースによる ドローン開発はここまで来た! by
あれから2年、オープンソースによるドローン開発はここまで来た!あれから2年、オープンソースによるドローン開発はここまで来た!
あれから2年、オープンソースによる ドローン開発はここまで来た!博宣 今村
1.5K views56 slides
Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S ) by
Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )
Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )博宣 今村
34.1K views39 slides
ドローン用フライトコントローラ「Dronecode」の概要( #KOF2015 ) by
ドローン用フライトコントローラ「Dronecode」の概要( #KOF2015 )ドローン用フライトコントローラ「Dronecode」の概要( #KOF2015 )
ドローン用フライトコントローラ「Dronecode」の概要( #KOF2015 )博宣 今村
9.5K views34 slides
はじめようARCore:自己位置推定・平面検出・FaceTracking by
はじめようARCore:自己位置推定・平面検出・FaceTrackingはじめようARCore:自己位置推定・平面検出・FaceTracking
はじめようARCore:自己位置推定・平面検出・FaceTrackingTakashi Yoshinaga
34.3K views136 slides
GLSLによるシェーダーアートことはじめ by
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめYoichi Hirata
9.2K views13 slides

More Related Content

What's hot

低レイヤー入門 by
低レイヤー入門低レイヤー入門
低レイヤー入門demuyan
12.3K views31 slides
Dronecodeの概要とROSの対応について by
Dronecodeの概要とROSの対応についてDronecodeの概要とROSの対応について
Dronecodeの概要とROSの対応について博宣 今村
10.3K views23 slides
プログラムを高速化する話 by
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話京大 マイコンクラブ
242.3K views120 slides
Zynq mp勉強会資料 by
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料一路 川染
5.7K views69 slides
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク... by
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...KLab Inc. / Tech
4.5K views158 slides
オンラインゲームの仕組みと工夫 by
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
869.8K views56 slides

What's hot(20)

低レイヤー入門 by demuyan
低レイヤー入門低レイヤー入門
低レイヤー入門
demuyan12.3K views
Dronecodeの概要とROSの対応について by 博宣 今村
Dronecodeの概要とROSの対応についてDronecodeの概要とROSの対応について
Dronecodeの概要とROSの対応について
博宣 今村10.3K views
Zynq mp勉強会資料 by 一路 川染
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料
一路 川染5.7K views
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク... by KLab Inc. / Tech
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
KLab Inc. / Tech4.5K views
オンラインゲームの仕組みと工夫 by Yuta Imai
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai869.8K views
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック by UnityTechnologiesJapan002
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
オブジェクト指向できていますか? by Moriharu Ohzu
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu237.5K views
すごい constexpr たのしくレイトレ! by Genya Murakami
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami25.6K views
【Unity】 Behavior TreeでAIを作る by torisoup
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
torisoup19.8K views
Rustに触れて私のPythonはどう変わったか by ShunsukeNakamura17
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
Unityではじめるオープンワールド制作 エンジニア編 by Unity Technologies Japan K.K.
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション by akio19937
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
akio1993735.9K views
Gofのデザインパターン stateパターン編 by Ayumu Itou
Gofのデザインパターン stateパターン編Gofのデザインパターン stateパターン編
Gofのデザインパターン stateパターン編
Ayumu Itou7.3K views
【Unity】より良い表現のためのライティング戦略 by Takayasu Beharu
【Unity】より良い表現のためのライティング戦略【Unity】より良い表現のためのライティング戦略
【Unity】より良い表現のためのライティング戦略
Takayasu Beharu6.9K views
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう by Unity Technologies Japan K.K.
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
見よう見まねでやってみる2D流体シミュレーション by KLab Inc. / Tech
見よう見まねでやってみる2D流体シミュレーション見よう見まねでやってみる2D流体シミュレーション
見よう見まねでやってみる2D流体シミュレーション
KLab Inc. / Tech838 views
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜 by Hideki Takase
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
Hideki Takase1.5K views
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略 by Haruki Yano
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
モバイルアプリにおけるアーティストフレンドリーな水面表現戦略
Haruki Yano3.3K views
オープンソースを用いたドローンの自律制御ソフトウェア技術 by Masayuki Isobe
オープンソースを用いたドローンの自律制御ソフトウェア技術オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術
Masayuki Isobe3.4K views

Similar to Dronekitによる python apiとアプリ開発の概要

2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会 by
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会openrtm
2.4K views28 slides
Guide for Swift and Viewer app by
Guide for Swift and Viewer appGuide for Swift and Viewer app
Guide for Swift and Viewer appShintaro Kaneko
2.3K views74 slides
VerilatorとSystemCでSoftware Driven Verification by
VerilatorとSystemCでSoftware Driven VerificationVerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven VerificationMr. Vengineer
447 views25 slides
Zynq VIPを利用したテストベンチ by
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチMr. Vengineer
3.7K views47 slides
ネットワーク自動化ツール紹介(Ansible・NAPALM編) by
ネットワーク自動化ツール紹介(Ansible・NAPALM編)ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)akira6592
11.5K views36 slides
20081003 by
2008100320081003
20081003小野 修司
749 views40 slides

Similar to Dronekitによる python apiとアプリ開発の概要(20)

2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会 by openrtm
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
2016 summercamp RTコンポーネント開発のためのシステムモデリング講習会
openrtm2.4K views
Guide for Swift and Viewer app by Shintaro Kaneko
Guide for Swift and Viewer appGuide for Swift and Viewer app
Guide for Swift and Viewer app
Shintaro Kaneko2.3K views
VerilatorとSystemCでSoftware Driven Verification by Mr. Vengineer
VerilatorとSystemCでSoftware Driven VerificationVerilatorとSystemCでSoftware Driven Verification
VerilatorとSystemCでSoftware Driven Verification
Mr. Vengineer447 views
Zynq VIPを利用したテストベンチ by Mr. Vengineer
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチ
Mr. Vengineer3.7K views
ネットワーク自動化ツール紹介(Ansible・NAPALM編) by akira6592
ネットワーク自動化ツール紹介(Ansible・NAPALM編)ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)
akira659211.5K views
Capistranoで自動デプロイ by toyoshi
Capistranoで自動デプロイCapistranoで自動デプロイ
Capistranoで自動デプロイ
toyoshi4.6K views
Android Lecture #04 @PRO&BSC Inc. by Yuki Higuchi
Android Lecture #04 @PRO&BSC Inc.Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.
Yuki Higuchi3.5K views
Pf部2012年1月勉強会.androidsola by android sola
Pf部2012年1月勉強会.androidsolaPf部2012年1月勉強会.androidsola
Pf部2012年1月勉強会.androidsola
android sola1.8K views
有用なRtcの紹介 by openrtm
有用なRtcの紹介有用なRtcの紹介
有用なRtcの紹介
openrtm1.4K views
Perl 非同期プログラミング by lestrrat
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
lestrrat7.3K views
フィルタドライバ入門 by firewood
フィルタドライバ入門フィルタドライバ入門
フィルタドライバ入門
firewood20.2K views
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1 by Masaya Aoyama
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
ServiceMesh と仲間たち 〜Istio & Conduit & Linkerd〜 @Cloud Native Meetup Tokyo #1
Masaya Aoyama2.6K views
Mon, Muninによる楽々監視生活 by Akihiro Kuwano
Mon, Muninによる楽々監視生活Mon, Muninによる楽々監視生活
Mon, Muninによる楽々監視生活
Akihiro Kuwano36.4K views
10分で作る Node.js Auto Scale 環境 with CloudFormation by Kazuyuki Honda
10分で作る Node.js Auto Scale 環境 with CloudFormation10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
Kazuyuki Honda4K views
WebRTC getStats - WebRTC Meetup Tokyo 5 LT by mganeko
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
mganeko4.8K views
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料 by codeal
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
codeal1.6K views
show コマンド結果をパースする方法あれこれ #npstudy by akira6592
show コマンド結果をパースする方法あれこれ #npstudyshow コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudy
akira65926.7K views

Dronekitによる python apiとアプリ開発の概要

  • 2. DroneKit-Pythonとは • DroneKitの中心的API • companion computer上で稼動して、 AruduPilotと通信する • 自律運転(オートパイロット)を高度化する • MAVLinkで通信する • 制御だけでなくテレメータ機能もある • OSS(Apacheライセンス)でGithubにホストされ ている
  • 3. Pythonかよ! • 「RubyやC++じゃねーの?」 • ↑と文法的にかけ離れてるわけじゃない • 後述するようにプログラムとして難しいわけじゃない (「凄いテクニック」とかいらない) • ぶっちゃけPythonよくわからなくても、サンプル見た らなんとなくわかる(私もそうだった) たいした問題じゃない!
  • 4. APIの機能 • 機体リストの取得 • 機体の状態を設定、テレメトリの取得 • 非同期に状態変更を受信する • waypoint mission(通過点を指定した飛行)の 作成と管理(自動モード) • 指定した場所への誘導(誘導モード) • 機体へのメッセージ送信 • 設定済みラジコンチャンネルの書き換え
  • 5. API一覧 クラス API 機能 値 droneapi.lib.APIConnection exit 現在のスレッドが終了しているかどうか 終了していたらTrue get_vehicles 現在のコネクションで制御可能な機体の取得 制御可能なVehicleオブジェクトの集合 droneapi.lib.Vehicle location 現在のLocation droneapi.lib.Location attitude 現在のAttitude droneapi.lib.Attitude velocity 現在の速度 [ vx, vy, vz ] mode 現在の飛行モードの取得と設定 droneapi.lib.VehicleMode airspeed 現在の対気速度 double groundspeed 現在の対地速度 double gps_0 GPSの情報 droneapi.lib.GPSInfo armed 装備状態 boolean mount_status ジンバルの状態 [ pitch, yaw, roll ] or None battery バッテリの状態 droneapi.lib.Battery channel_override RCチャネルの直接的な変更 ハッシュ channel_readback RCチャネルの読み出し ハッシュ add_attribute_observer 属性オブザーバの追加 commands 現在の飛行の通過点(waypoint)の取得 droneapi.lib.CommandSequence flush() いわゆるflush message_factory 生MAV Linkメッセージを作成するオブジェクトを得る parameters 機体のパラメータ(編集可能)を得る droneapi.lib.Parameters remove_attribute_observer 属性オブザーバの削除 send_mavlink 生MAV Linkメッセージの送信 set_mavlink_callback 非同期通知を受け取った時のcallbackの設定 droneapi.lib.Location 機体の位置 lat Latitude(緯度) double lon Longitude(経度) alt Altitude(高度) is_relative 高度が絶対(海抜)か相対(ホーム位置)か True or False droneapi.lib.Attitude 機体の方向 pitch ピッチ radian yaw ヨー radian roll ロール radian droneapi.lib.VehicleMode フライトモード(機体特性に依る) name モードの名前 droneapi.lib.GPSInfo GPSの情報 eph HDOP(Horizontal Dilution of Precision) cm epv VDOP(Vertical Dilution of Precision) cm fix_type GPSの運転モード 0: no, 2:2D, 3:3D satellites_visible 見えている衛星の数 droneapi.lib.Battery バッテリーの状態 voltage 電圧 mV current 電流 10mA level 残量 droneapi.lib.CommandSequence 飛行の通過点(waypoint)の並び takeoff(altitude) テイクオフ 高度 add(cmd) 通過点の追加 droneapi.lib.Command clear() コマンドリストの消去 count 通過点の数 download() 機体から通過点をダウンロード goto(location) 指定位置への移動 droneapi.lib.Location next 現在意味のある通過点の数 wait_valid() 通過点ダウンロードが終了するまでブロック droneapi.lib.Parameters 機体のパラメータ []= パラメータの設定 [] パラメータの参照
  • 7. droneapi.lib.Vehicle location 現在のLocation droneapi.lib.Location attitude 現在のAttitude droneapi.lib.Attitude velocity 現在の速度 [ vx, vy, vz ] mode 現在の飛行モードの取得と設定 droneapi.lib.VehicleMode airspeed 現在の対気速度 double groundspeed 現在の対地速度 double gps_0 GPSの情報 droneapi.lib.GPSInfo armed 装備状態 boolean mount_status ジンバルの状態 [ pitch, yaw, roll ] or None battery バッテリの状態 droneapi.lib.Battery channel_override RCチャネルの直接的な変更 ハッシュ channel_readback RCチャネルの読み出し ハッシュ add_attribute_observer 属性オブザーバの追加 commands 現在の飛行の通過点(waypoint)の取得 droneapi.lib.CommandSequence flush() いわゆるflush message_factory 生MAV Linkメッセージを作成するオブジェクトを得る parameters 機体のパラメータ(編集可能)を得る droneapi.lib.Parameters remove_attribute_observer 属性オブザーバの削除 send_mavlink 生MAV Linkメッセージの送信 set_mavlink_callback 非同期通知を受け取った時のcallbackの設定
  • 8. droneapi.lib.Location lat Latitude(緯度) double lon Longitude(経度) alt Altitude(高度) is_relative 高度が絶対(海抜)か相対(ホーム位置)か True or False
  • 9. droneapi.lib.Attitude pitch ピッチ radian yaw ヨー radian roll ロール radian
  • 11. droneapi.lib.CommandSequence takeoff(altitude) テイクオフ 高度 add(cmd) 通過点の追加 droneapi.lib.Command clear() コマンドリストの消去 count 通過点の数 download() 機体から通過点をダウンロード goto(location) 指定位置への移動 droneapi.lib.Location next 現在意味のある通過点の数 wait_valid() 通過点ダウンロードが終了するまでブロック
  • 13. Vehicle State(1) from droneapi.lib import VehicleMode from pymavlink import mavutil import time api = local_connect() v = api.get_vehicles()[0] ライブラリのインポート コネクションの確立 コネクション配下にある最初の機体の情 報の取得 値の出力をします
  • 14. Vehicle State(2) print "nGet all vehicle attribute values:" print " Location: %s" % v.location print " Attitude: %s" % v.attitude print " Velocity: %s" % v.velocity print " GPS: %s" % v.gps_0 print " Groundspeed: %s" % v.groundspeed print " Airspeed: %s" % v.airspeed print " Mount status: %s" % v.mount_status print " Battery: %s" % v.battery print " Mode: %s" % v.mode.name # settable print " Armed: %s" % v.armed # settable それぞれの値はそれぞれのクラスなの だけど、’print’は良きにはからってくれま す。 値の出力をします
  • 15. Vehicle State(2) Get all vehicle attribute values: Location: Attitude: Attitude:pitch=-0.00405988190323,yaw=-0.0973932668567,roll=- 0.00393210304901 Velocity: [0.06, -0.07, 0.0] GPS: GPSInfo:fix=3,num_sat=10 Groundspeed: 0.0 Airspeed: 0.0 Mount status: [None, None, None] Battery: Battery voltage: 12590, current: 0, level: 99 Mode: STABILIZE Armed: False この辺の実行結果
  • 16. Vehicle State(3) print "Set Vehicle.mode=GUIDED (currently: %s)" % v.mode.name v.mode = VehicleMode("GUIDED") v.flush() while not v.mode.name=='GUIDED' and not api.exit: print " Waiting for mode change ..." time.sleep(1) print "Set Vehicle.armed=True (currently: %s)" % v.armed v.armed = True v.flush() while not v.armed and not api.exit: print " Waiting for arming..." time.sleep(1) フライトモードを’GUDED’にします 確実な操作をするために、flushして状態 が変化するまで待ちます ‘armed’にします 同じく確実に操作するためにflushして状 態が変化するまで待ちます 機体を「armed」にします
  • 17. Vehicle State(3) Set Vehicle.mode=GUIDED (currently: STABILIZE) Waiting for mode change ... Got MAVLink msg: COMMAND_ACK {command : 11, result : 0} GUIDED> Mode GUIDED Set Vehicle.armed=True (currently: False) Waiting for arming... APM: ARMING MOTORS APM: Initialising APM... Got MAVLink msg: COMMAND_ACK {command : 400, result : 0} ARMED この辺の実行結果
  • 18. Vehicle State(4) def mode_callback(attribute): print " CALLBACK: Mode changed to: ", v.mode.name print "nAdd mode attribute observer for Vehicle.mode" v.add_attribute_observer('mode', mode_callback) print " Set mode=STABILIZE (currently: %s)" % v.mode.name v.mode = VehicleMode("STABILIZE") v.flush() print " Wait 2s so callback invoked before observer removed" time.sleep(2) v.remove_attribute_observer('mode', mode_callback) オブザーバの内容です。「オブザーバ」と か言ってますが、要するにコールバック です。 モード変更のオブザーバとして登録しま す モードを‘STABILIZE’にします 確実に操作するためにflushして状態が 変化するまで待ちます オブザーバを外すのを2秒待ちます オブザーバを外します オブザーバをつけたり外したりします
  • 19. Vehicle State(4) Add mode attribute observer for Vehicle.mode Set mode=STABILIZE (currently: GUIDED) Wait 2s so callback invoked before observer removed Got MAVLink msg: COMMAND_ACK {command : 11, result : 0} STABILIZE> Mode STABILIZE CALLBACK: Mode changed to: STABILIZE この辺の実行結果
  • 20. Vehicle State(5) print "nGet home location" cmds = v.commands cmds.download() cmds.wait_valid() print " Home WP: %s" % cmds[0] 現在のミッションの通過点(waypoint)をダ ウンロードします ダウンロードが完了するまで待ちます 一番最初の通過点は初期位置です 機体の初期位置(home location)を得ます
  • 21. Vehicle State(5) Get home location Requesting 0 waypoints t=Fri May 15 11:35:58 2015 now=Fri May 15 11:35:58 2015 Home WP: MISSION_ITEM {target_system : 255, target_component : 0, seq : 0, frame : 0, command : 16, current : 0, autocontinue : 1, param1 : 0.0, param2 : 0.0, param3 : 0.0, param4 : 0.0, x : -35.3632621765, y : 149.165237427, z : 583.729980469} この辺の実行結果
  • 22. Vehicle State(6) print "nRead vehicle param 'THR_MIN': %s" % v.parameters['THR_MIN'] print "Write vehicle param 'THR_MIN' : 10" v.parameters['THR_MIN']=10 v.flush() print "Read new value of param 'THR_MIN': %s" % v.parameters['THR_MIN'] パラメータ‘THR_MIN’を読みます。 パラメータ’THR_MIN’を10に設定します 完了するまで待ちます あらためてパラメータ’THR_MIN’を読み ます なお、’THR_MIN’とはストットルの最小値 を意味します。 機体のパラメータの読み出し書き込みをします
  • 23. Vehicle State(6) Read vehicle param 'THR_MIN': 130.0 Write vehicle param 'THR_MIN' : 10 timeout setting THR_MIN to 10.000000 Read new value of param 'THR_MIN': 10.0 この辺の実行結果
  • 24. Vehicle State(7) print "nOverriding RC channels for roll and yaw" v.channel_override = { "1" : 900, "4" : 1000 } v.flush() print " Current overrides are:", v.channel_override print " Channel default values:", v.channel_readback # All channel values before override # Cancel override by setting channels to 0 print " Cancelling override" v.channel_override = { "1" : 0, "4" : 0 } v.flush() チャネルの値を変更します 反映させます 上書きされた値を表示します 元の値を表示します 上書きをやめてコントローラの値に戻し ます(0を設定するのはそういう意味) 反映させます RCチャンネルの上書き
  • 25. Vehicle State(7) Overriding RC channels for roll and yaw Current overrides are: {'1': 900, '4': 1000} Channel default values: {'1': 1500, '3': 1000, '2': 1500, '5': 1800, '4': 1500, '7': 1000, '6': 1000, '8': 1800} Cancelling override この辺の実行結果
  • 26. Vehicle State(8) print "nReset vehicle atributes/parameters and exit“ v.mode = VehicleMode("STABILIZE") v.armed = False v.parameters['THR_MIN']=130 v.flush() 機体モードを’STABILIZE’に armedをFalseに スロットル最小値を130に 反映させます ヤバそうな値は元に戻しておきます
  • 27. Vehicle State(8) Reset vehicle atributes/parameters and exit Got MAVLink msg: COMMAND_ACK {command : 11, result : 0} APM: DISARMING MOTORS Got MAVLink msg: COMMAND_ACK {command : 400, result : 0} DISARMED timeout setting THR_MIN to 130.000000 APIThread-0 exiting... この辺の実行結果
  • 28. Simple Go To (Copter) (1) import time from droneapi.lib import VehicleMode from pymavlink import mavutil api = local_connect() v = api.get_vehicles()[0] ライブラリのインポート コネクションの確立 コネクション配下にある最初の機体の情 報の取得 目的の場所に移動させるサンプルです
  • 29. Simple Go To (Copter) (2) def arm_and_takeoff(aTargetAltitude): print "Basic pre-arm checks" if vehicle.mode.name == "INITIALISING": print "Waiting for vehicle to initialise“ time.sleep(1) while vehicle.gps_0.fix_type < 2: print “Waiting for GPS...:”, vehicle. gps_0. fix_type time.sleep(1) armedにし、目的の高度まで飛び上がる 関数(手続)を定義します メッセージを出します モードが’INITIALISING’であれば、 「初期化待ち」を表示して 1秒待ちます GPSが有効になるまで メッセージを出して 1秒待ちます 機体とGPSの初期化をします GPSのfix_typeが2次元未満の場合は、 GPSは無効の状態です
  • 30. Simple Go To (Copter) (3) print "Arming motors“ vehicle.mode = VehicleMode("GUIDED") vehicle.armed = True vehicle.flush() while not vehicle.armed and not api.exit: print " Waiting for arming...“ time.sleep(1) メッセージを出します モードが’GUIDED’にして armedにします 変更を反映させて、 armedになるまで メッセージを出して 1秒待ちます armedにします モードの’GUIDED’とは、通過点通りに飛 行する以外のモードです
  • 31. Simple Go To (Copter) (4) print "Taking off!“ vehicle.commands.takeoff(aTargetAltitude) vehicle.flush() メッセージを出します 目的の高度まで飛行するコマンドを出し 反映させます 飛び立ちます
  • 32. Simple Go To (Copter) (5) while not api.exit: print " Altitude: ", vehicle.location.alt if vehicle.location.alt >= aTargetAltitude * 0.95: print "Reached target altitude“ break; time.sleep(1) APIが生きている限り 高度を表示します 目的の高度であるか調べ、 目的の高度であればメッセー ジを出して、 ループを抜けます そうでなければ1秒待ちます 目的の高度になるまで処理を待ちます
  • 33. Simple Go To (Copter) (6) arm_and_takeoff(20) print "Going to first point..." point1 = Location(-35.361354, 149.165218, 20, is_relative=True) vehicle.commands.goto(point1) vehicle.flush() time.sleep(30) print "Going to second point..." point2 = Location(-35.363244, 149.168801, 20, is_relative=True) vehicle.commands.goto(point2) vehicle.flush() time.sleep(20) print "Returning to Launch" vehicle.mode = VehicleMode("RTL") vehicle.flush() 目的高度まで飛び立たせます 最初のポイントに飛行します 最初の点のLocationを作ります 移動するよう指示して 反映させます 30秒待ちます(多分その間に飛行する) 次のポイントに飛行します 次のポイントのLocationを作ります 移動するよう指示して 反映させます 20秒待ちます(多分その間に飛行する) 帰投モードにします 反映させます メインのコントロールです
  • 34. Follow Me(1) import gps import socket import time from droneapi.lib import VehicleMode, Location ライブラリのインポート このサンプルでは、GPSデーモンと通信し て、その位置に移動させるために、今ま でとはちょっと違うライブラリもインポート しています 「付いて来る」
  • 35. Follow Me(2) def followme(): try: api = local_connect() v = api.get_vehicles()[0] if v.mode.name == "INITIALISING": print "Vehicle still booting, try again later" return cmds = v.commands is_guided = False gpsd = gps. gps ( mode = gps. WATCH_ENABLE) 「付いて来る」関数を定義します 例外処理を考慮します いつもの準備 モードが’INITIALISING’であれば、 「後にしろ」を表示して おしまい Commandを取得します GPSが取得出来るようにしま す 機体とGPSの初期化をします
  • 36. Follow Me(3) while not api.exit: gpsd.next() if is_guided and v.mode.name != "GUIDED": print "User has changed flight modes - aborting follow-me“ break if (gpsd.valid & gps.LATLON_SET) != 0: altitude = 30 dest = Location(gpsd.fix.latitude, gpsd.fix.longitude, altitude, is_relative=True) print "Going to: %s" % dest cmds.goto(dest) is_guided = True v.flush() time.sleep(2) APIが生きている間 GPSデータを取得します モードに矛盾があったら停止 GPSデータが有効であれば 高さを30mにして GPSから取得した位置で Locationを作り、 Locationを表示し Locationに行くように指示 反映させて 2秒待ちます 「付いて来る」の本体
  • 37. Follow Me(4) except socket.error: print "Error: gpsd service does not seem to be running, plug in USB GPS or run run-fake- gps.sh" socketの例外の場合 メッセージを出します 例外処理
  • 38. おまけ(DroneKitのbuild) git clone git://github.com/diydrones/ardupilot.git sudo apt-get install python-matplotlib python- serial python-wxgtk2.8 python-lxml sudo apt-get install python-scipy python-opencv ccache gawk git python-pip python-pexpect sudo pip install pymavlink MAVProxy cd ardupilot export PATH=$PATH:$HOME/ardupilot/jsbsim/src export PATH=$PATH:$HOME/ardupilot/Tools/autotest sim_vehicle.sh -w ソースを取得 いろいろ必要なものをインストール 環境変数作る Buildもこの中で勝手にしてくれる IA64、RaspberryPi上で可能(Ubuntu 14)