Skip to content

Commit

Permalink
autotest: fix fence autotests
Browse files Browse the repository at this point in the history
add Plane.FenceMinAltEnableAutoland
test that vehicle can be landed manually after descending below fence floor
  • Loading branch information
andyp1per committed Jun 23, 2024
1 parent aa51fc0 commit 9507a4b
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 18 deletions.
28 changes: 18 additions & 10 deletions Tools/autotest/arducopter.py
Original file line number Diff line number Diff line change
Expand Up @@ -1417,7 +1417,7 @@ def fly_fence_avoid_test_radius_check(self, timeout=180, avoid_behave=avoid_beha
self.wait_altitude(10, 100, relative=True)
self.set_rc(3, 1500)
self.set_rc(2, 1400)
self.wait_distance_to_home(12, 20)
self.wait_distance_to_home(12, 20, timeout=30)
tstart = self.get_sim_time()
push_time = 70 # push against barrier for 60 seconds
failed_max = False
Expand Down Expand Up @@ -1476,7 +1476,7 @@ def HorizontalFence(self, timeout=180):
self.load_fence("fence-in-middle-of-nowhere.txt")

self.delay_sim_time(5) # let fence check run so it loads-from-eeprom
self.assert_prearm_failure("vehicle outside fence")
self.assert_prearm_failure("vehicle outside Polygon fence")
self.progress("Failed to arm outside fence (good!)")
self.clear_fence()
self.delay_sim_time(5) # let fence breach clear
Expand All @@ -1486,7 +1486,7 @@ def HorizontalFence(self, timeout=180):
self.start_subtest("ensure we can't arm with bad radius")
self.context_push()
self.set_parameter("FENCE_RADIUS", -1)
self.assert_prearm_failure("Invalid FENCE_RADIUS value")
self.assert_prearm_failure("Invalid Circle FENCE_RADIUS value")
self.context_pop()
self.progress("Failed to arm with bad radius")
self.drain_mav()
Expand Down Expand Up @@ -1704,14 +1704,14 @@ def FenceFloorEnabledLanding(self):
"AVOID_ENABLE": 0,
"FENCE_ENABLE" : 1,
"FENCE_TYPE": 15,
"FENCE_ALT_MIN": 10,
"FENCE_ALT_MAX": 20,
"FENCE_ALT_MIN": 20,
"FENCE_ALT_MAX": 30,
})

self.change_mode("GUIDED")
self.wait_ready_to_arm()
self.arm_vehicle()
self.user_takeoff(alt_min=15)
self.user_takeoff(alt_min=25)

# Check fence is enabled
self.do_fence_enable()
Expand All @@ -1723,8 +1723,19 @@ def FenceFloorEnabledLanding(self):
self.set_rc(3, 1800)

self.wait_mode('RTL', timeout=120)
# center throttle
self.set_rc(3, 1500)

self.wait_landed_and_disarmed()
# wait until we are below the fence floor and re-enter loiter
self.wait_altitude(5, 15, relative=True)
self.change_mode('LOITER')
# wait for manual recovery to expire
self.delay_sim_time(15)

# lower throttle and try and land
self.set_rc(3, 1300)
self.wait_altitude(0, 2, relative=True)
self.wait_disarmed()
self.assert_fence_enabled()

# Assert fence is not healthy since it was enabled manually
Expand Down Expand Up @@ -1762,8 +1773,6 @@ def FenceFloorAutoDisableLanding(self):
self.set_rc(3, 1800)

self.wait_mode('RTL', timeout=120)
# Assert fence is not healthy now that we are in RTL
self.assert_sensor_state(fence_bit, healthy=False)

self.wait_landed_and_disarmed(0)
# the breach should have cleared since we auto-disable the
Expand Down Expand Up @@ -11839,7 +11848,6 @@ def tests(self):
def disabled_tests(self):
return {
"Parachute": "See https://github.com/ArduPilot/ardupilot/issues/4702",
"HorizontalAvoidFence": "See https://github.com/ArduPilot/ardupilot/issues/11525",
"AltEstimation": "See https://github.com/ArduPilot/ardupilot/issues/15191",
"GroundEffectCompensation_takeOffExpected": "Flapping",
"GroundEffectCompensation_touchDownExpected": "Flapping",
Expand Down
50 changes: 47 additions & 3 deletions Tools/autotest/arduplane.py
Original file line number Diff line number Diff line change
Expand Up @@ -1602,7 +1602,7 @@ def FenceStatic(self):
self.delay_sim_time(2) # Allow breach to propagate
self.assert_fence_enabled()

self.try_arm(False, "vehicle outside fence")
self.try_arm(False, "vehicle outside Min Alt fence")
self.do_fence_disable()
self.set_parameter("FENCE_ALT_MIN", default_fence_alt_min)

Expand All @@ -1625,7 +1625,7 @@ def FenceStatic(self):
self.do_fence_enable()
self.assert_fence_enabled()
self.delay_sim_time(2) # Allow breach to propagate
self.try_arm(False, "vehicle outside fence")
self.try_arm(False, "vehicle outside Polygon fence")
self.do_fence_disable()
self.clear_fence()

Expand All @@ -1648,7 +1648,7 @@ def FenceStatic(self):
self.do_fence_enable()
self.assert_fence_enabled()
self.delay_sim_time(2) # Allow breach to propagate
self.try_arm(False, "vehicle outside fence")
self.try_arm(False, "vehicle outside Polygon fence")
self.do_fence_disable()
self.clear_fence()

Expand Down Expand Up @@ -3772,6 +3772,49 @@ def FenceMinAltAutoEnable(self):
self.set_current_waypoint(0, check_afterwards=False)
self.set_rc(3, 1000) # lower throttle

def FenceMinAltEnableAutoland(self):
'''Tests autolanding when alt min fence is enabled'''
self.set_parameters({
"FENCE_TYPE": 12, # Set fence type to min alt and max alt
"FENCE_ACTION": 1, # Set action to RTL
"FENCE_ALT_MIN": 20,
"FENCE_AUTOENABLE": 0,
"FENCE_ENABLE" : 1,
"RTL_AUTOLAND" : 2,
})

# Grab Home Position
self.mav.recv_match(type='HOME_POSITION', blocking=True)
self.homeloc = self.mav.location()

self.wait_ready_to_arm()
self.arm_vehicle()

self.takeoff(alt=50, mode='TAKEOFF')
self.change_mode("FBWA")
self.set_rc(3, 1100) # lower throttle

self.progress("Waiting for RTL")
tstart = self.get_sim_time()
mode = "RTL"
while not self.mode_is(mode, drain_mav=False):
self.mav.messages['HEARTBEAT'].custom_mode
self.progress("mav.flightmode=%s Want=%s Alt=%f" % (
self.mav.flightmode, mode, self.get_altitude(relative=True)))
if (self.get_sim_time_cached() > tstart + 120):
raise WaitModeTimeout("Did not change mode")
self.progress("Got mode %s" % mode)
# switch to FBWA
self.change_mode("FBWA")
self.set_rc(3, 1500) # raise throttle
self.wait_altitude(25, 35, timeout=50, relative=True)
self.set_rc(3, 1000) # lower throttle
# Now check we can land
self.fly_home_land_and_disarm()
self.clear_mission(mavutil.mavlink.MAV_MISSION_TYPE_ALL)
self.set_current_waypoint(0, check_afterwards=False)
self.set_rc(3, 1000) # lower throttle

def FenceMinAltAutoEnableAbort(self):
'''Tests autoenablement of the alt min fence and fences on arming'''
self.set_parameters({
Expand Down Expand Up @@ -5756,6 +5799,7 @@ def tests(self):
self.FenceRetRally,
self.FenceAltCeilFloor,
self.FenceMinAltAutoEnable,
self.FenceMinAltEnableAutoland,
self.FenceMinAltAutoEnableAbort,
self.FenceAutoEnableDisableSwitch,
self.FenceEnableDisableSwitch,
Expand Down
10 changes: 5 additions & 5 deletions Tools/autotest/rover.py
Original file line number Diff line number Diff line change
Expand Up @@ -6864,10 +6864,10 @@ def MissionPolyEnabledPreArm(self):
]
)

self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False)
self.assert_prearm_failure('vehicle outside Polygon fence', other_prearm_failures_fatal=False)
self.reboot_sitl()

self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120)
self.assert_prearm_failure('vehicle outside Polygon fence', other_prearm_failures_fatal=False, timeout=120)

self.progress("Ensure we can arm when a polyfence fence is cleared when we've previously been in breach")
self.clear_fence()
Expand All @@ -6885,7 +6885,7 @@ def MissionPolyEnabledPreArm(self):
]
)
self.reboot_sitl()
self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120)
self.assert_prearm_failure('vehicle outside Polygon fence', other_prearm_failures_fatal=False, timeout=120)
self.clear_fence()
self.wait_ready_to_arm()

Expand All @@ -6901,11 +6901,11 @@ def MissionPolyEnabledPreArm(self):
]
]
)
self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120)
self.assert_prearm_failure('vehicle outside Polygon fence', other_prearm_failures_fatal=False, timeout=120)
self.set_parameter('FENCE_TYPE', 2)
self.wait_ready_to_arm()
self.set_parameter('FENCE_TYPE', 6)
self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120)
self.assert_prearm_failure('vehicle outside Polygon fence', other_prearm_failures_fatal=False, timeout=120)

def OpticalFlow(self):
'''lightly test OpticalFlow'''
Expand Down

0 comments on commit 9507a4b

Please sign in to comment.