13. Vehicle State(1)
from droneapi.lib import VehicleMode
from pymavlink import mavutil
import time
api = local_connect()
v = api.get_vehicles()[0]
ライブラリのインポート
コネクションの確立
コネクション配下にある最初の機体の情
報の取得
値の出力をします
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
この辺の実行結果
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の例外の場合
メッセージを出します
例外処理