@ -19,51 +19,32 @@ vinfo = vehicleinfo.VehicleInfo()
@@ -19,51 +19,32 @@ vinfo = vehicleinfo.VehicleInfo()
# get location of scripts
testdir = os . path . dirname ( os . path . realpath ( __file__ ) )
#################################################
# CONFIG
#################################################
HOME = mavutil . location ( - 35.362938 , 149.165085 , 584 , 270 )
AVCHOME = mavutil . location ( 40.072842 , - 105.230575 , 1586 , 0 )
homeloc = None
num_wp = 0
def hover ( mavproxy , mav , hover_throttle = 1500 ) :
mavproxy . send ( ' rc 3 %u \n ' % hover_throttle )
return True
def arm_motors ( mavproxy , mav ) :
""" Arm motors. """
progress ( " Arming motors " )
mavproxy . send ( ' switch 6 \n ' ) # stabilize mode
wait_mode ( mav , ' STABILIZE ' )
mavproxy . send ( ' rc 3 1000 \n ' )
mavproxy . send ( ' rc 4 2000 \n ' )
mavproxy . expect ( ' APM: Arming motors ' )
mavproxy . send ( ' rc 4 1500 \n ' )
mav . motors_armed_wait ( )
progress ( " MOTORS ARMED OK " )
return True
def disarm_motors ( mavproxy , mav ) :
""" Disarm motors. """
progress ( " Disarming motors " )
mavproxy . send ( ' switch 6 \n ' ) # stabilize mode
wait_mode ( mav , ' STABILIZE ' )
mavproxy . send ( ' rc 3 1000 \n ' )
mavproxy . send ( ' rc 4 1000 \n ' )
mavproxy . expect ( ' APM: Disarming motors ' )
mavproxy . send ( ' rc 4 1500 \n ' )
mav . motors_disarmed_wait ( )
progress ( " MOTORS DISARMED OK " )
return True
# Flight mode switch positions are set-up in arducopter.param to be
# switch 1 = Circle
# switch 2 = Land
# switch 3 = RTL
# switch 4 = Auto
# switch 5 = Loiter
# switch 6 = Stabilize
#################################################
# UTILITIES
#################################################
def takeoff ( mavproxy , mav , alt_min = 30 , takeoff_throttle = 1700 ) :
""" Takeoff get to 30m altitude. """
mavproxy . send ( ' switch 6 \n ' ) # stabilize mode
wait_mode ( mav , ' STABILIZE ' )
mavproxy . send ( ' rc 3 %u \n ' % takeoff_throttle )
set_rc ( mavproxy , mav , 3 , takeoff_throttle )
m = mav . recv_match ( type = ' VFR_HUD ' , blocking = True )
if ( m . alt < alt_min ) :
wait_altitude ( mav , alt_min , ( alt_min + 5 ) )
@ -72,6 +53,22 @@ def takeoff(mavproxy, mav, alt_min=30, takeoff_throttle=1700):
@@ -72,6 +53,22 @@ def takeoff(mavproxy, mav, alt_min=30, takeoff_throttle=1700):
return True
def land ( mavproxy , mav , timeout = 60 ) :
""" Land the quad. """
progress ( " STARTING LANDING " )
mavproxy . send ( ' switch 2 \n ' ) # land mode
wait_mode ( mav , ' LAND ' )
progress ( " Entered Landing Mode " )
ret = wait_altitude ( mav , - 5 , 1 )
progress ( " LANDING: ok= %s " % ret )
return ret
def hover ( mavproxy , mav , hover_throttle = 1500 ) :
set_rc ( mavproxy , mav , 3 , hover_throttle )
return True
# loiter - fly south west, then hold loiter within 5m position and altitude
def loiter ( mavproxy , mav , holdtime = 10 , maxaltchange = 5 , maxdistchange = 5 ) :
""" Hold loiter position. """
@ -80,16 +77,16 @@ def loiter(mavproxy, mav, holdtime=10, maxaltchange=5, maxdistchange=5):
@@ -80,16 +77,16 @@ def loiter(mavproxy, mav, holdtime=10, maxaltchange=5, maxdistchange=5):
# first aim south east
progress ( " turn south east " )
mavproxy . send ( ' rc 4 1580 \n ' )
set_rc ( mavproxy , mav , 4 , 1580 )
if not wait_heading ( mav , 170 ) :
return False
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 4 , 1500 )
# fly south east 50m
mavproxy . send ( ' rc 2 1100 \n ' )
set_rc ( mavproxy , mav , 2 , 1100 )
if not wait_distance ( mav , 50 ) :
return False
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# wait for copter to slow moving
if not wait_groundspeed ( mav , 0 , 2 ) :
@ -126,16 +123,19 @@ def change_alt(mavproxy, mav, alt_min, climb_throttle=1920, descend_throttle=108
@@ -126,16 +123,19 @@ def change_alt(mavproxy, mav, alt_min, climb_throttle=1920, descend_throttle=108
m = mav . recv_match ( type = ' VFR_HUD ' , blocking = True )
if ( m . alt < alt_min ) :
progress ( " Rise to alt: %u from %u " % ( alt_min , m . alt ) )
mavproxy . send ( ' rc 3 %u \n ' % climb_throttle )
set_rc ( mavproxy , mav , 3 , climb_throttle )
wait_altitude ( mav , alt_min , ( alt_min + 5 ) )
else :
progress ( " Lower to alt: %u from %u " % ( alt_min , m . alt ) )
mavproxy . send ( ' rc 3 %u \n ' % descend_throttle )
set_rc ( mavproxy , mav , 3 , descend_throttle )
wait_altitude ( mav , ( alt_min - 5 ) , alt_min )
hover ( mavproxy , mav )
return True
#################################################
# TESTS FLY
#################################################
# fly a square in stabilize mode
def fly_square ( mavproxy , mav , side = 50 , timeout = 300 ) :
""" Fly a square, flying N then E . """
@ -143,10 +143,10 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
@@ -143,10 +143,10 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
success = True
# ensure all sticks in the middle
mavproxy . send ( ' rc 1 1500 \n ' )
mavproxy . send ( ' rc 2 1500 \n ' )
mavproxy . send ( ' rc 3 1500 \n ' )
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 1 , 1500 )
set_rc ( mavproxy , mav , 2 , 1500 )
set_rc ( mavproxy , mav , 3 , 1500 )
set_rc ( mavproxy , mav , 4 , 1500 )
# switch to loiter mode temporarily to stop us from rising
mavproxy . send ( ' switch 5 \n ' )
@ -154,11 +154,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
@@ -154,11 +154,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
# first aim north
progress ( " turn right towards north " )
mavproxy . send ( ' rc 4 1580 \n ' )
set_rc ( mavproxy , mav , 4 , 1580 )
if not wait_heading ( mav , 10 ) :
progress ( " Failed to reach heading " )
success = False
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 4 , 1500 )
mav . recv_match ( condition = ' RC_CHANNELS.chan4_raw==1500 ' , blocking = True )
# save bottom left corner of box as waypoint
@ -166,17 +166,17 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
@@ -166,17 +166,17 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
save_wp ( mavproxy , mav )
# switch back to stabilize mode
mavproxy . send ( ' rc 3 1500 \n ' )
set_rc ( mavproxy , mav , 3 , 1500 )
mavproxy . send ( ' switch 6 \n ' )
wait_mode ( mav , ' STABILIZE ' )
# pitch forward to fly north
progress ( " Going north %u meters " % side )
mavproxy . send ( ' rc 2 1300 \n ' )
set_rc ( mavproxy , mav , 2 , 1300 )
if not wait_distance ( mav , side ) :
progress ( " Failed to reach distance of %u " % side )
success = False
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# save top left corner of square as waypoint
progress ( " Save WP 3 " )
@ -184,11 +184,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
@@ -184,11 +184,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
# roll right to fly east
progress ( " Going east %u meters " % side )
mavproxy . send ( ' rc 1 1700 \n ' )
set_rc ( mavproxy , mav , 1 , 1700 )
if not wait_distance ( mav , side ) :
progress ( " Failed to reach distance of %u " % side )
success = False
mavproxy . send ( ' rc 1 1500 \n ' )
set_rc ( mavproxy , mav , 1 , 1500 )
# save top right corner of square as waypoint
progress ( " Save WP 4 " )
@ -196,11 +196,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
@@ -196,11 +196,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
# pitch back to fly south
progress ( " Going south %u meters " % side )
mavproxy . send ( ' rc 2 1700 \n ' )
set_rc ( mavproxy , mav , 2 , 1700 )
if not wait_distance ( mav , side ) :
progress ( " Failed to reach distance of %u " % side )
success = False
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# save bottom right corner of square as waypoint
progress ( " Save WP 5 " )
@ -208,11 +208,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
@@ -208,11 +208,11 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
# roll left to fly west
progress ( " Going west %u meters " % side )
mavproxy . send ( ' rc 1 1300 \n ' )
set_rc ( mavproxy , mav , 1 , 1300 )
if not wait_distance ( mav , side ) :
progress ( " Failed to reach distance of %u " % side )
success = False
mavproxy . send ( ' rc 1 1500 \n ' )
set_rc ( mavproxy , mav , 1 , 1500 )
# save bottom left corner of square (should be near home) as waypoint
progress ( " Save WP 6 " )
@ -222,7 +222,7 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
@@ -222,7 +222,7 @@ def fly_square(mavproxy, mav, side=50, timeout=300):
progress ( " Descend to 10m in Loiter " )
mavproxy . send ( ' switch 5 \n ' ) # loiter mode
wait_mode ( mav , ' LOITER ' )
mavproxy . send ( ' rc 3 1300 \n ' )
set_rc ( mavproxy , mav , 3 , 1300 )
time_left = timeout - ( get_sim_time ( mav ) - tstart )
progress ( " timeleft = %u " % time_left )
if time_left < 20 :
@ -259,13 +259,13 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
@@ -259,13 +259,13 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
# first aim east
progress ( " turn east " )
mavproxy . send ( ' rc 4 1580 \n ' )
set_rc ( mavproxy , mav , 4 , 1580 )
if not wait_heading ( mav , 135 ) :
return False
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 4 , 1500 )
# raise throttle slightly to avoid hitting the ground
mavproxy . send ( ' rc 3 1600 \n ' )
set_rc ( mavproxy , mav , 3 , 1600 )
# switch to stabilize mode
mavproxy . send ( ' switch 6 \n ' )
@ -274,14 +274,14 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
@@ -274,14 +274,14 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
# fly east 60 meters
progress ( " # Going forward %u meters " % side )
mavproxy . send ( ' rc 2 1350 \n ' )
set_rc ( mavproxy , mav , 2 , 1350 )
if not wait_distance ( mav , side , 5 , 60 ) :
return False
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# pull throttle low
progress ( " # Enter Failsafe " )
mavproxy . send ( ' rc 3 900 \n ' )
set_rc ( mavproxy , mav , 3 , 900 )
tstart = get_sim_time ( mav )
while get_sim_time ( mav ) < tstart + timeout :
@ -292,7 +292,7 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
@@ -292,7 +292,7 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
# check if we've reached home
if m . alt < = 1 and home_distance < 10 :
# reduce throttle
mavproxy . send ( ' rc 3 1100 \n ' )
set_rc ( mavproxy , mav , 3 , 1100 )
# switch back to stabilize
mavproxy . send ( ' switch 2 \n ' ) # land mode
wait_mode ( mav , ' LAND ' )
@ -301,13 +301,14 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
@@ -301,13 +301,14 @@ def fly_throttle_failsafe(mavproxy, mav, side=60, timeout=180):
progress ( " Reached failsafe home OK " )
mavproxy . send ( ' switch 6 \n ' ) # stabilize mode
wait_mode ( mav , ' STABILIZE ' )
if not arm_motors ( mavproxy , mav ) :
set_rc ( mavproxy , mav , 3 , 1000 )
if not arm_vehicle ( mavproxy , mav ) :
progress ( " Failed to re-arm " )
return False
return True
progress ( " Failed to land on failsafe RTL - timed out after %u seconds " % timeout )
# reduce throttle
mavproxy . send ( ' rc 3 1100 \n ' )
set_rc ( mavproxy , mav , 3 , 1100 )
# switch back to stabilize mode
mavproxy . send ( ' switch 2 \n ' ) # land mode
wait_mode ( mav , ' LAND ' )
@ -356,16 +357,16 @@ def fly_stability_patch(mavproxy, mav, holdtime=30, maxaltchange=5, maxdistchang
@@ -356,16 +357,16 @@ def fly_stability_patch(mavproxy, mav, holdtime=30, maxaltchange=5, maxdistchang
# first south
progress ( " turn south " )
mavproxy . send ( ' rc 4 1580 \n ' )
set_rc ( mavproxy , mav , 4 , 1580 )
if not wait_heading ( mav , 180 ) :
return False
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 4 , 1500 )
# fly west 80m
mavproxy . send ( ' rc 2 1100 \n ' )
set_rc ( mavproxy , mav , 2 , 1100 )
if not wait_distance ( mav , 80 ) :
return False
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# wait for copter to slow moving
if not wait_groundspeed ( mav , 0 , 2 ) :
@ -419,14 +420,14 @@ def fly_fence_test(mavproxy, mav, timeout=180):
@@ -419,14 +420,14 @@ def fly_fence_test(mavproxy, mav, timeout=180):
# first east
progress ( " turn east " )
mavproxy . send ( ' rc 4 1580 \n ' )
set_rc ( mavproxy , mav , 4 , 1580 )
if not wait_heading ( mav , 160 ) :
return False
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 4 , 1500 )
# fly forward (east) at least 20m
pitching_forward = True
mavproxy . send ( ' rc 2 1100 \n ' )
set_rc ( mavproxy , mav , 2 , 1100 )
if not wait_distance ( mav , 20 ) :
return False
@ -440,12 +441,12 @@ def fly_fence_test(mavproxy, mav, timeout=180):
@@ -440,12 +441,12 @@ def fly_fence_test(mavproxy, mav, timeout=180):
# recenter pitch sticks once we reach home so we don't fly off again
if pitching_forward and home_distance < 10 :
pitching_forward = False
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# disable fence
mavproxy . send ( ' param set FENCE_ENABLE 0 \n ' )
if m . alt < = 1 and home_distance < 10 :
# reduce throttle
mavproxy . send ( ' rc 3 1000 \n ' )
set_rc ( mavproxy , mav , 3 , 1000 )
# switch mode to stabilize
mavproxy . send ( ' switch 2 \n ' ) # land mode
wait_mode ( mav , ' LAND ' )
@ -454,12 +455,14 @@ def fly_fence_test(mavproxy, mav, timeout=180):
@@ -454,12 +455,14 @@ def fly_fence_test(mavproxy, mav, timeout=180):
progress ( " Reached home OK " )
mavproxy . send ( ' switch 6 \n ' ) # stabilize mode
wait_mode ( mav , ' STABILIZE ' )
mavproxy . send ( ' arm uncheck all \n ' ) # remove if we ever clear battery failsafe flag on disarm
if not arm_motors ( mavproxy , mav ) :
set_rc ( mavproxy , mav , 3 , 1000 )
mavproxy . send ( ' arm uncheck all \n ' ) # remove if we ever clear battery failsafe flag on disarm
if not arm_vehicle ( mavproxy , mav ) :
progress ( " Failed to re-arm " )
mavproxy . send ( ' arm check all \n ' ) # remove if we ever clear battery failsafe flag on disarm
mavproxy . send ( ' arm check all \n ' ) # remove if we ever clear battery failsafe flag on disarm
return False
mavproxy . send ( ' arm check all \n ' ) # remove if we ever clear battery failsafe flag on disarm
mavproxy . send ( ' arm check all \n ' ) # remove if we ever clear battery failsafe flag on disarm
progress ( " Reached home OK " )
return True
# disable fence, enable avoidance
@ -467,7 +470,7 @@ def fly_fence_test(mavproxy, mav, timeout=180):
@@ -467,7 +470,7 @@ def fly_fence_test(mavproxy, mav, timeout=180):
mavproxy . send ( ' param set AVOID_ENABLE 1 \n ' )
# reduce throttle
mavproxy . send ( ' rc 3 1000 \n ' )
set_rc ( mavproxy , mav , 3 , 1000 )
# switch mode to stabilize
mavproxy . send ( ' switch 2 \n ' ) # land mode
wait_mode ( mav , ' LAND ' )
@ -477,17 +480,6 @@ def fly_fence_test(mavproxy, mav, timeout=180):
@@ -477,17 +480,6 @@ def fly_fence_test(mavproxy, mav, timeout=180):
return False
def show_gps_and_sim_positions ( mavproxy , on_off ) :
if on_off is True :
# turn on simulator display of gps and actual position
mavproxy . send ( ' map set showgpspos 1 \n ' )
mavproxy . send ( ' map set showsimpos 1 \n ' )
else :
# turn off simulator display of gps and actual position
mavproxy . send ( ' map set showgpspos 0 \n ' )
mavproxy . send ( ' map set showsimpos 0 \n ' )
def fly_gps_glitch_loiter_test ( mavproxy , mav , use_map = False , timeout = 30 , max_distance = 20 ) :
""" fly_gps_glitch_loiter_test.
@ -509,20 +501,20 @@ def fly_gps_glitch_loiter_test(mavproxy, mav, use_map=False, timeout=30, max_dis
@@ -509,20 +501,20 @@ def fly_gps_glitch_loiter_test(mavproxy, mav, use_map=False, timeout=30, max_dis
# turn south east
progress ( " turn south east " )
mavproxy . send ( ' rc 4 1580 \n ' )
set_rc ( mavproxy , mav , 4 , 1580 )
if not wait_heading ( mav , 150 ) :
if ( use_map ) :
show_gps_and_sim_positions ( mavproxy , False )
return False
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 4 , 1500 )
# fly forward (south east) at least 60m
mavproxy . send ( ' rc 2 1100 \n ' )
set_rc ( mavproxy , mav , 2 , 1100 )
if not wait_distance ( mav , 60 ) :
if ( use_map ) :
show_gps_and_sim_positions ( mavproxy , False )
return False
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# wait for copter to slow down
if not wait_groundspeed ( mav , 0 , 1 ) :
@ -598,7 +590,11 @@ def fly_gps_glitch_auto_test(mavproxy, mav, use_map=False, timeout=120):
@@ -598,7 +590,11 @@ def fly_gps_glitch_auto_test(mavproxy, mav, use_map=False, timeout=120):
# Fly mission #1
progress ( " # Load copter_glitch_mission " )
if not load_mission_from_file ( mavproxy , mav , os . path . join ( testdir , " copter_glitch_mission.txt " ) ) :
# load the waypoint count
global homeloc
global num_wp
num_wp = load_mission_from_file ( mavproxy , os . path . join ( testdir , " copter_glitch_mission.txt " ) )
if not num_wp :
progress ( " load copter_glitch_mission failed " )
return False
@ -606,16 +602,13 @@ def fly_gps_glitch_auto_test(mavproxy, mav, use_map=False, timeout=120):
@@ -606,16 +602,13 @@ def fly_gps_glitch_auto_test(mavproxy, mav, use_map=False, timeout=120):
if ( use_map ) :
show_gps_and_sim_positions ( mavproxy , True )
# load the waypoint count
global homeloc
global num_wp
progress ( " test: Fly a mission from 1 to %u " % num_wp )
mavproxy . send ( ' wp set 1 \n ' )
# switch into AUTO mode and raise throttle
mavproxy . send ( ' switch 4 \n ' ) # auto mode
wait_mode ( mav , ' AUTO ' )
mavproxy . send ( ' rc 3 1500 \n ' )
set_rc ( mavproxy , mav , 3 , 1500 )
# wait until 100m from home
if not wait_distance ( mav , 100 , 5 , 60 ) :
@ -692,41 +685,41 @@ def fly_simple(mavproxy, mav, side=50, timeout=120):
@@ -692,41 +685,41 @@ def fly_simple(mavproxy, mav, side=50, timeout=120):
# switch to stabilize mode
mavproxy . send ( ' switch 6 \n ' )
wait_mode ( mav , ' STABILIZE ' )
mavproxy . send ( ' rc 3 1500 \n ' )
set_rc ( mavproxy , mav , 3 , 1500 )
# fly south 50m
progress ( " # Flying south %u meters " % side )
mavproxy . send ( ' rc 1 1300 \n ' )
set_rc ( mavproxy , mav , 1 , 1300 )
if not wait_distance ( mav , side , 5 , 60 ) :
failed = True
mavproxy . send ( ' rc 1 1500 \n ' )
set_rc ( mavproxy , mav , 1 , 1500 )
# fly west 8 seconds
progress ( " # Flying west for 8 seconds " )
mavproxy . send ( ' rc 2 1300 \n ' )
set_rc ( mavproxy , mav , 2 , 1300 )
tstart = get_sim_time ( mav )
while get_sim_time ( mav ) < ( tstart + 8 ) :
m = mav . recv_match ( type = ' VFR_HUD ' , blocking = True )
delta = ( get_sim_time ( mav ) - tstart )
# progress("%u" % delta)
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# fly north 25 meters
progress ( " # Flying north %u meters " % ( side / 2.0 ) )
mavproxy . send ( ' rc 1 1700 \n ' )
set_rc ( mavproxy , mav , 1 , 1700 )
if not wait_distance ( mav , side / 2 , 5 , 60 ) :
failed = True
mavproxy . send ( ' rc 1 1500 \n ' )
set_rc ( mavproxy , mav , 1 , 1500 )
# fly east 8 seconds
progress ( " # Flying east for 8 seconds " )
mavproxy . send ( ' rc 2 1700 \n ' )
set_rc ( mavproxy , mav , 2 , 1700 )
tstart = get_sim_time ( mav )
while get_sim_time ( mav ) < ( tstart + 8 ) :
m = mav . recv_match ( type = ' VFR_HUD ' , blocking = True )
delta = ( get_sim_time ( mav ) - tstart )
# progress("%u" % delta)
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# restore to default
mavproxy . send ( ' param set SIMPLE 0 \n ' )
@ -747,10 +740,10 @@ def fly_super_simple(mavproxy, mav, timeout=45):
@@ -747,10 +740,10 @@ def fly_super_simple(mavproxy, mav, timeout=45):
# fly forward 20m
progress ( " # Flying forward 20 meters " )
mavproxy . send ( ' rc 2 1300 \n ' )
set_rc ( mavproxy , mav , 2 , 1300 )
if not wait_distance ( mav , 20 , 5 , 60 ) :
failed = True
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# set SUPER SIMPLE mode for all flight modes
mavproxy . send ( ' param set SUPER_SIMPLE 63 \n ' )
@ -758,22 +751,22 @@ def fly_super_simple(mavproxy, mav, timeout=45):
@@ -758,22 +751,22 @@ def fly_super_simple(mavproxy, mav, timeout=45):
# switch to stabilize mode
mavproxy . send ( ' switch 6 \n ' )
wait_mode ( mav , ' STABILIZE ' )
mavproxy . send ( ' rc 3 1500 \n ' )
set_rc ( mavproxy , mav , 3 , 1500 )
# start copter yawing slowly
mavproxy . send ( ' rc 4 1550 \n ' )
set_rc ( mavproxy , mav , 4 , 1550 )
# roll left for timeout seconds
progress ( " # rolling left from pilot ' s point of view for %u seconds " % timeout )
mavproxy . send ( ' rc 1 1300 \n ' )
set_rc ( mavproxy , mav , 1 , 1300 )
tstart = get_sim_time ( mav )
while get_sim_time ( mav ) < ( tstart + timeout ) :
m = mav . recv_match ( type = ' VFR_HUD ' , blocking = True )
delta = ( get_sim_time ( mav ) - tstart )
# stop rolling and yawing
mavproxy . send ( ' rc 1 1500 \n ' )
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 1 , 1500 )
set_rc ( mavproxy , mav , 4 , 1500 )
# restore simple mode parameters to default
mavproxy . send ( ' param set SUPER_SIMPLE 0 \n ' )
@ -792,21 +785,21 @@ def fly_circle(mavproxy, mav, maxaltchange=10, holdtime=36):
@@ -792,21 +785,21 @@ def fly_circle(mavproxy, mav, maxaltchange=10, holdtime=36):
# face west
progress ( " turn west " )
mavproxy . send ( ' rc 4 1580 \n ' )
set_rc ( mavproxy , mav , 4 , 1580 )
if not wait_heading ( mav , 270 ) :
return False
mavproxy . send ( ' rc 4 1500 \n ' )
set_rc ( mavproxy , mav , 4 , 1500 )
# set CIRCLE radius
mavproxy . send ( ' param set CIRCLE_RADIUS 3000 \n ' )
# fly forward (east) at least 100m
mavproxy . send ( ' rc 2 1100 \n ' )
set_rc ( mavproxy , mav , 2 , 1100 )
if not wait_distance ( mav , 100 ) :
return False
# return pitch stick back to middle
mavproxy . send ( ' rc 2 1500 \n ' )
set_rc ( mavproxy , mav , 2 , 1500 )
# set CIRCLE mode
mavproxy . send ( ' switch 1 \n ' ) # circle mode
@ -831,20 +824,21 @@ def fly_auto_test(mavproxy, mav):
@@ -831,20 +824,21 @@ def fly_auto_test(mavproxy, mav):
# Fly mission #1
progress ( " # Load copter_mission " )
if not load_mission_from_file ( mavproxy , mav , os . path . join ( testdir , " copter_mission.txt " ) ) :
progress ( " load copter_mission failed " )
return False
# load the waypoint count
global homeloc
global num_wp
num_wp = load_mission_from_file ( mavproxy , os . path . join ( testdir , " copter_mission.txt " ) )
if not num_wp :
progress ( " load copter_mission failed " )
return False
progress ( " test: Fly a mission from 1 to %u " % num_wp )
mavproxy . send ( ' wp set 1 \n ' )
# switch into AUTO mode and raise throttle
mavproxy . send ( ' switch 4 \n ' ) # auto mode
wait_mode ( mav , ' AUTO ' )
mavproxy . send ( ' rc 3 1500 \n ' )
set_rc ( mavproxy , mav , 3 , 1500 )
# fly the mission
ret = wait_waypoint ( mav , 0 , num_wp - 1 , timeout = 500 )
@ -854,7 +848,7 @@ def fly_auto_test(mavproxy, mav):
@@ -854,7 +848,7 @@ def fly_auto_test(mavproxy, mav):
land ( mavproxy , mav )
# set throttle to minimum
mavproxy . send ( ' rc 3 1000 \n ' )
set_rc ( mavproxy , mav , 3 , 1000 )
# wait for disarm
mav . motors_disarmed_wait ( )
@ -870,13 +864,14 @@ def fly_avc_test(mavproxy, mav):
@@ -870,13 +864,14 @@ def fly_avc_test(mavproxy, mav):
# upload mission from file
progress ( " # Load copter_AVC2013_mission " )
if not load_mission_from_file ( mavproxy , mav , os . path . join ( testdir , " copter_AVC2013_mission.txt " ) ) :
progress ( " load copter_AVC2013_mission failed " )
return False
# load the waypoint count
global homeloc
global num_wp
num_wp = load_mission_from_file ( mavproxy , os . path . join ( testdir , " copter_AVC2013_mission.txt " ) )
if not num_wp :
progress ( " load copter_AVC2013_mission failed " )
return False
progress ( " Fly AVC mission from 1 to %u " % num_wp )
mavproxy . send ( ' wp set 1 \n ' )
@ -886,13 +881,13 @@ def fly_avc_test(mavproxy, mav):
@@ -886,13 +881,13 @@ def fly_avc_test(mavproxy, mav):
# switch into AUTO mode and raise throttle
mavproxy . send ( ' switch 4 \n ' ) # auto mode
wait_mode ( mav , ' AUTO ' )
mavproxy . send ( ' rc 3 1500 \n ' )
set_rc ( mavproxy , mav , 3 , 1500 )
# fly the mission
ret = wait_waypoint ( mav , 0 , num_wp - 1 , timeout = 500 )
# set throttle to minimum
mavproxy . send ( ' rc 3 1000 \n ' )
set_rc ( mavproxy , mav , 3 , 1000 )
# wait for disarm
mav . motors_disarmed_wait ( )
@ -903,17 +898,6 @@ def fly_avc_test(mavproxy, mav):
@@ -903,17 +898,6 @@ def fly_avc_test(mavproxy, mav):
return ret
def land ( mavproxy , mav , timeout = 60 ) :
""" Land the quad. """
progress ( " STARTING LANDING " )
mavproxy . send ( ' switch 2 \n ' ) # land mode
wait_mode ( mav , ' LAND ' )
progress ( " Entered Landing Mode " )
ret = wait_altitude ( mav , - 5 , 1 )
progress ( " LANDING: ok= %s " % ret )
return ret
def fly_mission ( mavproxy , mav , height_accuracy = - 1.0 , target_altitude = None ) :
""" Fly a mission from a file. """
global homeloc
@ -933,38 +917,6 @@ def fly_mission(mavproxy, mav, height_accuracy=-1.0, target_altitude=None):
@@ -933,38 +917,6 @@ def fly_mission(mavproxy, mav, height_accuracy=-1.0, target_altitude=None):
return ret
def load_mission_from_file ( mavproxy , mav , filename ) :
""" Load a mission from a file to flight controller. """
global num_wp
mavproxy . send ( ' wp load %s \n ' % filename )
mavproxy . expect ( ' Flight plan received ' )
mavproxy . send ( ' wp list \n ' )
mavproxy . expect ( ' Requesting [0-9]+ waypoints ' )
# update num_wp
wploader = mavwp . MAVWPLoader ( )
wploader . load ( filename )
num_wp = wploader . count ( )
return True
def save_mission_to_file ( mavproxy , mav , filename ) :
global num_wp
mavproxy . send ( ' wp save %s \n ' % filename )
mavproxy . expect ( ' Saved ([0-9]+) waypoints ' )
num_wp = int ( mavproxy . match . group ( 1 ) )
progress ( " num_wp: %d " % num_wp )
return True
def setup_rc ( mavproxy ) :
""" Setup RC override control. """
for chan in range ( 1 , 9 ) :
mavproxy . send ( ' rc %u 1500 \n ' % chan )
# zero throttle
mavproxy . send ( ' rc 3 1000 \n ' )
def fly_ArduCopter ( binary , viewerip = None , use_map = False , valgrind = False , gdb = False , frame = None , params = None , gdbserver = False , speedup = 10 ) :
""" Fly ArduCopter in SITL.
@ -978,7 +930,7 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
@@ -978,7 +930,7 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
home = " %f , %f , %u , %u " % ( HOME . lat , HOME . lng , HOME . alt , HOME . heading )
sitl = util . start_SITL ( binary , wipe = True , model = frame , home = home , speedup = speedup )
mavproxy = util . start_MAVProxy_SITL ( ' ArduCopter ' , options = ' --sitl=127.0.0.1:5501 --out=127.0.0.1:19550 --quadcopter ' )
mavproxy = util . start_MAVProxy_SITL ( ' ArduCopter ' )
mavproxy . expect ( ' Received [0-9]+ parameters ' )
# setup test parameters
@ -1041,15 +993,23 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
@@ -1041,15 +993,23 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
failed_test_msg = " None "
try :
progress ( " Waiting for a heartbeat with mavlink protocol %s " % mav . WIRE_PROTOCOL_VERSION )
mav . wait_heartbeat ( )
setup_rc ( mavproxy )
progress ( " Setting up RC parameters " )
set_rc_default ( mavproxy )
set_rc ( mavproxy , mav , 3 , 1000 )
homeloc = mav . location ( )
progress ( " Home location: %s " % homeloc )
mavproxy . send ( ' switch 6 \n ' ) # stabilize mode
mav . wait_heartbeat ( )
wait_mode ( mav , ' STABILIZE ' )
progress ( " Waiting reading for arm " )
wait_ready_to_arm ( mav )
# Arm
progress ( " # Arm motors " )
if not arm_motors ( mavproxy , mav ) :
if not arm_vehicle ( mavproxy , mav ) :
failed_test_msg = " arm_motors failed "
progress ( failed_test_msg )
failed = True
@ -1071,7 +1031,9 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
@@ -1071,7 +1031,9 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
# save the stored mission to file
progress ( " # Save out the CH7 mission to file " )
if not save_mission_to_file ( mavproxy , mav , os . path . join ( testdir , " ch7_mission.txt " ) ) :
global num_wp
num_wp = save_mission_to_file ( mavproxy , os . path . join ( testdir , " ch7_mission.txt " ) )
if not num_wp :
failed_test_msg = " save_mission_to_file failed "
progress ( failed_test_msg )
failed = True
@ -1298,8 +1260,8 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
@@ -1298,8 +1260,8 @@ def fly_ArduCopter(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fal
progress ( failed_test_msg )
failed = True
except pexpect . TIMEOUT as fail ed_test_msg :
failed_test_msg = " Timeout "
except pexpect . TIMEOUT as e :
progress ( " Failed with timeout " )
failed = True
mav . close ( )
@ -1331,7 +1293,7 @@ def fly_CopterAVC(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fals
@@ -1331,7 +1293,7 @@ def fly_CopterAVC(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fals
home = " %f , %f , %u , %u " % ( AVCHOME . lat , AVCHOME . lng , AVCHOME . alt , AVCHOME . heading )
sitl = util . start_SITL ( binary , wipe = True , model = frame , home = home , speedup = speedup )
mavproxy = util . start_MAVProxy_SITL ( ' ArduCopter ' , options = ' --sitl=127.0.0.1:5501 --out=127.0.0.1:19550 ' )
mavproxy = util . start_MAVProxy_SITL ( ' ArduCopter ' )
mavproxy . expect ( ' Received [0-9]+ parameters ' )
# setup test parameters
@ -1397,23 +1359,26 @@ def fly_CopterAVC(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fals
@@ -1397,23 +1359,26 @@ def fly_CopterAVC(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fals
try :
mav . wait_heartbeat ( )
setup_rc ( mavproxy )
set_rc_default ( mavproxy )
set_rc ( mavproxy , mav , 3 , 1000 )
homeloc = mav . location ( )
progress ( " Lowering rotor speed " )
mavproxy . send ( ' rc 8 1000 \n ' )
set_rc ( mavproxy , mav , 8 , 1000 )
mavproxy . send ( ' switch 6 \n ' ) # stabilize mode
wait_mode ( mav , ' STABILIZE ' )
wait_ready_to_arm ( mav )
# Arm
progress ( " # Arm motors " )
if not arm_motors ( mavproxy , mav ) :
if not arm_vehicle ( mavproxy , mav ) :
failed_test_msg = " arm_motors failed "
progress ( failed_test_msg )
failed = True
progress ( " Raising rotor speed " )
mavproxy . send ( ' rc 8 2000 \n ' )
set_rc ( mavproxy , mav , 8 , 2000 )
progress ( " # Fly AVC mission " )
if not fly_avc_test ( mavproxy , mav ) :
@ -1424,7 +1389,7 @@ def fly_CopterAVC(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fals
@@ -1424,7 +1389,7 @@ def fly_CopterAVC(binary, viewerip=None, use_map=False, valgrind=False, gdb=Fals
progress ( " Flew AVC mission OK " )
progress ( " Lowering rotor speed " )
mavproxy . send ( ' rc 8 1000 \n ' )
set_rc ( mavproxy , mav , 8 , 1000 )
# mission includes disarm at end so should be ok to download logs now
if not log_download ( mavproxy , mav , util . reltopdir ( " ../buildlogs/CopterAVC-log.bin " ) ) :