Tools: autotest: add test for fence Avoidance
This commit is contained in:
parent
78f3265f27
commit
6e13adb43c
@ -555,6 +555,81 @@ class AutoTestCopter(AutoTest):
|
|||||||
self.progress("Armed")
|
self.progress("Armed")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def wait_distance_from_home(self, distance_min, distance_max, timeout=10):
|
||||||
|
tstart = self.get_sim_time()
|
||||||
|
while True:
|
||||||
|
if self.get_sim_time() - tstart > timeout:
|
||||||
|
raise NotAchievedException("Did not achieve distance from home")
|
||||||
|
distance = self.distance_to_home(use_cached_home=True)
|
||||||
|
self.progress("Distance from home: now=%f %f<want<%f" %
|
||||||
|
(distance, distance_min, distance_max))
|
||||||
|
if distance >= distance_min and distance <= distance_max:
|
||||||
|
return
|
||||||
|
|
||||||
|
# fly_fence_test - fly east until you hit the horizontal circular fence
|
||||||
|
avoid_behave_slide = 0
|
||||||
|
def fly_fence_avoid_test_radius_check(self, timeout=180, avoid_behave=avoid_behave_slide):
|
||||||
|
using_mode = "LOITER" # must be something which adjusts velocity!
|
||||||
|
self.change_mode(using_mode)
|
||||||
|
self.set_parameter("FENCE_ENABLE", 1) # fence
|
||||||
|
self.set_parameter("FENCE_TYPE", 2) # circle
|
||||||
|
fence_radius = 15
|
||||||
|
self.set_parameter("FENCE_RADIUS", fence_radius)
|
||||||
|
fence_margin = 3
|
||||||
|
self.set_parameter("FENCE_MARGIN", fence_margin)
|
||||||
|
self.set_parameter("AVOID_ENABLE", 1)
|
||||||
|
self.set_parameter("AVOID_BEHAVE", avoid_behave)
|
||||||
|
self.set_parameter("RC10_OPTION", 40) # avoid-enable
|
||||||
|
self.wait_ready_to_arm()
|
||||||
|
self.set_rc(10, 2000)
|
||||||
|
home_distance = self.distance_to_home(use_cached_home=True)
|
||||||
|
if home_distance > 5:
|
||||||
|
raise PreconditionFailedException("Expected to be within 5m of home")
|
||||||
|
self.zero_throttle()
|
||||||
|
self.arm_vehicle()
|
||||||
|
self.set_rc(3, 1700)
|
||||||
|
self.wait_altitude(10, 100, relative=True)
|
||||||
|
self.set_rc(3, 1500)
|
||||||
|
self.set_rc(2, 1400)
|
||||||
|
self.wait_distance_from_home(12, 20)
|
||||||
|
tstart = self.get_sim_time()
|
||||||
|
push_time = 70 # push against barrier for 60 seconds
|
||||||
|
failed_max = False
|
||||||
|
failed_min = False
|
||||||
|
while True:
|
||||||
|
if self.get_sim_time() - tstart > push_time:
|
||||||
|
self.progress("Push time up")
|
||||||
|
break
|
||||||
|
# make sure we don't RTL:
|
||||||
|
if not self.mode_is(using_mode):
|
||||||
|
raise NotAchievedException("Changed mode away from %s" % using_mode)
|
||||||
|
distance = self.distance_to_home(use_cached_home=True)
|
||||||
|
inner_radius = fence_radius - fence_margin
|
||||||
|
want_min = inner_radius - 1 # allow 1m either way
|
||||||
|
want_max = inner_radius + 1 # allow 1m either way
|
||||||
|
self.progress("Push: distance=%f %f<want<%f" %
|
||||||
|
(distance, want_min, want_max))
|
||||||
|
if distance < want_min:
|
||||||
|
if failed_min is False:
|
||||||
|
self.progress("Failed min")
|
||||||
|
failed_min = True
|
||||||
|
if distance > want_max:
|
||||||
|
if failed_max is False:
|
||||||
|
self.progress("Failed max")
|
||||||
|
failed_max = True
|
||||||
|
if failed_min and failed_max:
|
||||||
|
raise NotAchievedException("Failed both min and max checks. Clever")
|
||||||
|
if failed_min:
|
||||||
|
raise NotAchievedException("Failed min")
|
||||||
|
if failed_max:
|
||||||
|
raise NotAchievedException("Failed max")
|
||||||
|
self.set_rc(2, 1500)
|
||||||
|
self.do_RTL()
|
||||||
|
|
||||||
|
def fly_fence_avoid_test(self, timeout=180):
|
||||||
|
self.fly_fence_avoid_test_radius_check(avoid_behave=1, timeout=timeout)
|
||||||
|
self.fly_fence_avoid_test_radius_check(avoid_behave=0, timeout=timeout)
|
||||||
|
|
||||||
# fly_fence_test - fly east until you hit the horizontal circular fence
|
# fly_fence_test - fly east until you hit the horizontal circular fence
|
||||||
def fly_fence_test(self, timeout=180):
|
def fly_fence_test(self, timeout=180):
|
||||||
# enable fence, disable avoidance
|
# enable fence, disable avoidance
|
||||||
@ -3331,6 +3406,10 @@ class AutoTestCopter(AutoTest):
|
|||||||
"Test horizontal fence",
|
"Test horizontal fence",
|
||||||
self.fly_fence_test),
|
self.fly_fence_test),
|
||||||
|
|
||||||
|
("HorizontalAvoidFence",
|
||||||
|
"Test horizontal Avoidance fence",
|
||||||
|
self.fly_fence_avoid_test),
|
||||||
|
|
||||||
("MaxAltFence",
|
("MaxAltFence",
|
||||||
"Test Max Alt Fence",
|
"Test Max Alt Fence",
|
||||||
self.fly_alt_max_fence_test),
|
self.fly_alt_max_fence_test),
|
||||||
|
Loading…
Reference in New Issue
Block a user