diff --git a/Tools/autotest/arducopter.py b/Tools/autotest/arducopter.py index 0b5f28d188..344035b197 100644 --- a/Tools/autotest/arducopter.py +++ b/Tools/autotest/arducopter.py @@ -2875,8 +2875,7 @@ class AutoTestCopter(AutoTest): self.upload_simple_relhome_mission(items) - start_speed_ms = 1 - self.set_parameter('WPNAV_SPEED', start_speed_ms*100) + start_speed_ms = self.get_parameter('WPNAV_SPEED') / 100.0 self.takeoff(20) self.change_mode('AUTO') @@ -2887,6 +2886,56 @@ class AutoTestCopter(AutoTest): self.wait_groundspeed(speed_ms-1, speed_ms+1, minimum_duration=10) self.do_RTL() + def WPNAV_SPEED_UP(self): + '''ensure resetting WPNAV_SPEED_UP works''' + + items = [] + + # 1 waypoint a long way up + items.append((mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 20000),) + + items.append((mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH, 0, 0, 0)) + + self.upload_simple_relhome_mission(items) + + start_speed_ms = self.get_parameter('WPNAV_SPEED_UP') / 100.0 + + minimum_duration = 5 + + self.takeoff(20) + self.change_mode('AUTO') + self.wait_climbrate(start_speed_ms-1, start_speed_ms+1, minimum_duration=minimum_duration) + + for speed_ms in 7, 8, 7, 8, 6, 2: + self.set_parameter('WPNAV_SPEED_UP', speed_ms*100) + self.wait_climbrate(speed_ms-1, speed_ms+1, minimum_duration=minimum_duration) + self.do_RTL(timeout=240) + + def WPNAV_SPEED_DN(self): + '''ensure resetting WPNAV_SPEED_DN works''' + + items = [] + + # 1 waypoint a long way back down + items.append((mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 10),) + + items.append((mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH, 0, 0, 0)) + + self.upload_simple_relhome_mission(items) + + minimum_duration = 5 + + self.takeoff(500, timeout=60) + self.change_mode('AUTO') + + start_speed_ms = self.get_parameter('WPNAV_SPEED_DN') / 100.0 + self.wait_climbrate(-start_speed_ms-1, -start_speed_ms+1, minimum_duration=minimum_duration) + + for speed_ms in 7, 8, 7, 8, 6, 2: + self.set_parameter('WPNAV_SPEED_DN', speed_ms*100) + self.wait_climbrate(-speed_ms-1, -speed_ms+1, minimum_duration=minimum_duration) + self.do_RTL() + def fly_mission(self, filename, strict=True): num_wp = self.load_mission(filename, strict=strict) self.set_parameter("AUTO_OPTIONS", 3) @@ -7834,6 +7883,14 @@ class AutoTestCopter(AutoTest): "Change speed during misison", self.WPNAV_SPEED), + Test("WPNAV_SPEED_UP", + "Change speed (up) during misison", + self.WPNAV_SPEED_UP), + + Test("WPNAV_SPEED_DN", + "Change speed (down) during misison", + self.WPNAV_SPEED_DN), + Test("LogUpload", "Log upload", self.log_upload), diff --git a/Tools/autotest/common.py b/Tools/autotest/common.py index b446a51a5a..31020b2c21 100644 --- a/Tools/autotest/common.py +++ b/Tools/autotest/common.py @@ -4940,6 +4940,32 @@ class AutoTest(ABC): **kwargs ) + def wait_climbrate(self, speed_min, speed_max, timeout=30, **kwargs): + """Wait for a given vertical rate.""" + assert speed_min <= speed_max, "Minimum speed should be less than maximum speed." + + def get_climbrate(timeout2): + msg = self.mav.recv_match(type='VFR_HUD', blocking=True, timeout=timeout2) + if msg: + return msg.climb + raise MsgRcvTimeoutException("Failed to get climb rate") + + def validator(value2, target2=None): + if speed_min <= value2 <= speed_max: + return True + else: + return False + + self.wait_and_maintain( + value_name="Climbrate", + target=speed_min, + current_value_getter=lambda: get_climbrate(timeout), + accuracy=(speed_max - speed_min), + validator=lambda value2, target2: validator(value2, target2), + timeout=timeout, + **kwargs + ) + def wait_groundspeed(self, speed_min, speed_max, timeout=30, **kwargs): """Wait for a given ground speed range.""" assert speed_min <= speed_max, "Minimum speed should be less than maximum speed."