autotest: add rangefinder convenience functions, fix wait_alt handling
autotest: add test for rangefinders outside their maxalt
This commit is contained in:
parent
8843c17f9d
commit
a7aa74ab20
@ -122,7 +122,7 @@ class AutoTestCopter(AutoTest):
|
||||
def set_autodisarm_delay(self, delay):
|
||||
self.set_parameter("DISARM_DELAY", delay)
|
||||
|
||||
def user_takeoff(self, alt_min=30):
|
||||
def user_takeoff(self, alt_min=30, timeout=30, max_err=5):
|
||||
'''takeoff using mavlink takeoff command'''
|
||||
self.run_cmd(mavutil.mavlink.MAV_CMD_NAV_TAKEOFF,
|
||||
0, # param1
|
||||
@ -133,15 +133,15 @@ class AutoTestCopter(AutoTest):
|
||||
0, # param6
|
||||
alt_min # param7
|
||||
)
|
||||
self.progress("Ran command")
|
||||
self.wait_for_alt(alt_min)
|
||||
self.wait_for_alt(alt_min, timeout=timeout, max_err=max_err)
|
||||
|
||||
def takeoff(self,
|
||||
alt_min=30,
|
||||
takeoff_throttle=1700,
|
||||
require_absolute=True,
|
||||
mode="STABILIZE",
|
||||
timeout=120):
|
||||
timeout=120,
|
||||
max_err=5):
|
||||
"""Takeoff get to 30m altitude."""
|
||||
self.progress("TAKEOFF")
|
||||
self.change_mode(mode)
|
||||
@ -150,10 +150,10 @@ class AutoTestCopter(AutoTest):
|
||||
self.zero_throttle()
|
||||
self.arm_vehicle()
|
||||
if mode == 'GUIDED':
|
||||
self.user_takeoff(alt_min=alt_min)
|
||||
self.user_takeoff(alt_min=alt_min, timeout=timeout, max_err=max_err)
|
||||
else:
|
||||
self.set_rc(3, takeoff_throttle)
|
||||
self.wait_for_alt(alt_min=alt_min, timeout=timeout)
|
||||
self.wait_for_alt(alt_min=alt_min, timeout=timeout, max_err=max_err)
|
||||
self.hover()
|
||||
self.progress("TAKEOFF COMPLETE")
|
||||
|
||||
@ -202,7 +202,7 @@ class AutoTestCopter(AutoTest):
|
||||
3: 1000,
|
||||
4: 1500,
|
||||
})
|
||||
self.takeoff(alt_min=dAlt)
|
||||
self.takeoff(alt_min=dAlt, mode='GUIDED')
|
||||
self.change_mode("ALT_HOLD")
|
||||
|
||||
self.progress("Yaw to east")
|
||||
@ -905,6 +905,7 @@ class AutoTestCopter(AutoTest):
|
||||
self.test_battery_failsafe(timeout=timeout)
|
||||
except Exception as e:
|
||||
self.print_exception_caught(e)
|
||||
self.disarm_vehicle(force=True)
|
||||
ex = e
|
||||
|
||||
self.set_parameter('BATT_LOW_VOLT', 0)
|
||||
@ -6573,6 +6574,37 @@ class AutoTestCopter(AutoTest):
|
||||
self.reboot_sitl()
|
||||
self.fly_rangefinder_drivers_fly([x[0] for x in do_drivers])
|
||||
|
||||
def fly_rangefinder_drivers_maxalt(self):
|
||||
'''test max-height behaviour'''
|
||||
# lightwareserial goes to 130m when out of range
|
||||
self.set_parameters({
|
||||
"SERIAL4_PROTOCOL": 9,
|
||||
"RNGFND1_TYPE": 8,
|
||||
"WPNAV_SPEED_UP": 1000, # cm/s
|
||||
})
|
||||
self.customise_SITL_commandline([
|
||||
"--uartE=sim:lightwareserial",
|
||||
])
|
||||
self.takeoff(95, mode='GUIDED', timeout=240, max_err=0.5)
|
||||
self.assert_rangefinder_distance_between(90, 100)
|
||||
|
||||
self.wait_rangefinder_distance(90, 100)
|
||||
|
||||
rf_bit = mavutil.mavlink.MAV_SYS_STATUS_SENSOR_LASER_POSITION
|
||||
|
||||
self.assert_sensor_state(rf_bit, present=True, enabled=True, healthy=True)
|
||||
self.assert_distance_sensor_quality(100)
|
||||
|
||||
self.progress("Moving higher to be out of max rangefinder range")
|
||||
self.fly_guided_move_local(0, 0, 150)
|
||||
|
||||
# sensor remains healthy even out-of-range
|
||||
self.assert_sensor_state(rf_bit, present=True, enabled=True, healthy=True)
|
||||
|
||||
self.assert_distance_sensor_quality(1)
|
||||
|
||||
self.do_RTL()
|
||||
|
||||
def fly_ship_takeoff(self):
|
||||
# test ship takeoff
|
||||
self.wait_groundspeed(0, 2)
|
||||
@ -7838,6 +7870,10 @@ class AutoTestCopter(AutoTest):
|
||||
"Test rangefinder drivers",
|
||||
self.fly_rangefinder_drivers), # 62s
|
||||
|
||||
("RangeFinderDriversMaxAlt",
|
||||
"Test rangefinder drivers - test max alt",
|
||||
self.fly_rangefinder_drivers_maxalt), # 25s
|
||||
|
||||
("MaxBotixI2CXL",
|
||||
"Test maxbotix rangefinder drivers",
|
||||
self.fly_rangefinder_driver_maxbotix), # 62s
|
||||
|
@ -5206,6 +5206,51 @@ class AutoTest(ABC):
|
||||
return msg.relative_alt / 1000.0 # mm -> m
|
||||
return msg.alt / 1000.0 # mm -> m
|
||||
|
||||
def assert_rangefinder_distance_between(self, dist_min, dist_max):
|
||||
m = self.assert_receive_message('RANGEFINDER')
|
||||
|
||||
if m.distance < dist_min:
|
||||
raise NotAchievedException("below min height (%f < %f)" %
|
||||
(m.distance, dist_min))
|
||||
|
||||
if m.distance > dist_max:
|
||||
raise NotAchievedException("above max height (%f > %f)" %
|
||||
(m.distance, dist_max))
|
||||
|
||||
def assert_distance_sensor_quality(self, quality):
|
||||
m = self.assert_receive_message('DISTANCE_SENSOR')
|
||||
|
||||
if m.signal_quality != quality:
|
||||
raise NotAchievedException("Unexpected quality; want=%f got=%f" %
|
||||
(quality, m.signal_quality))
|
||||
|
||||
def get_rangefinder_distance(self):
|
||||
m = self.mav.recv_match(type='RANGEFINDER',
|
||||
blocking=True,
|
||||
timeout=5)
|
||||
if m is None:
|
||||
raise NotAchievedException("Did not get RANGEFINDER message")
|
||||
|
||||
return m.distance
|
||||
|
||||
def wait_rangefinder_distance(self, dist_min, dist_max, timeout=30, **kwargs):
|
||||
'''wait for RANGEFINDER distance'''
|
||||
def validator(value2, target2=None):
|
||||
if dist_min <= value2 <= dist_max:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
self.wait_and_maintain(
|
||||
value_name="RageFinderDistance",
|
||||
target=dist_min,
|
||||
current_value_getter=lambda: self.get_rangefinder_distance(),
|
||||
accuracy=(dist_max - dist_min),
|
||||
validator=lambda value2, target2: validator(value2, target2),
|
||||
timeout=timeout,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
def get_esc_rpm(self, esc):
|
||||
if esc > 4:
|
||||
raise ValueError("Only does 1-4")
|
||||
|
Loading…
Reference in New Issue
Block a user