autotest: added Plane.TerrainRally test

reproduces the issue from
https://github.com/ArduPilot/ardupilot/issues/25157
This commit is contained in:
Andrew Tridgell 2023-10-13 09:54:15 +11:00
parent 8b67775673
commit 823a917ae1
2 changed files with 106 additions and 0 deletions

View File

@ -1836,6 +1836,82 @@ class AutoTestPlane(AutoTest):
self.do_fence_disable() # Disable fence so we can land
self.fly_home_land_and_disarm() # Pack it up, we're going home.
def TerrainRally(self):
""" Tests terrain follow with a rally point """
self.context_push()
self.install_terrain_handlers_context()
def terrain_following_above_80m(mav, m):
if m.get_type() == 'TERRAIN_REPORT':
if m.current_height < 50:
raise NotAchievedException(
"TERRAIN_REPORT.current_height below 50m %fm" % m.current_height)
if m.get_type() == 'VFR_HUD':
if m.groundspeed < 2:
raise NotAchievedException("hit ground")
def terrain_wait_path(loc1, loc2, steps):
'''wait till we have terrain for N steps from loc1 to loc2'''
tstart = self.get_sim_time_cached()
self.progress("Waiting for terrain data")
while True:
now = self.get_sim_time_cached()
if now - tstart > 60:
raise NotAchievedException("Did not get correct required terrain")
for i in range(steps):
lat = loc1.lat + i * (loc2.lat-loc1.lat)/steps
lon = loc1.lng + i * (loc2.lng-loc1.lng)/steps
self.mav.mav.terrain_check_send(int(lat*1.0e7), int(lon*1.0e7))
report = self.assert_receive_message('TERRAIN_REPORT', timeout=60)
self.progress("Terrain pending=%u" % report.pending)
if report.pending == 0:
break
self.progress("Got required terrain")
self.wait_ready_to_arm()
self.homeloc = self.mav.location()
guided_loc = mavutil.location(-35.39723762, 149.07284612, 99.0, 0)
rally_loc = mavutil.location(-35.3654952000, 149.1558698000, 100, 0)
terrain_wait_path(self.homeloc, rally_loc, 10)
# set a rally point to the west of home
self.upload_rally_points_from_locations([rally_loc])
self.set_parameter("TKOFF_ALT", 100)
self.change_mode("TAKEOFF")
self.wait_ready_to_arm()
self.arm_vehicle()
self.set_parameter("TERRAIN_FOLLOW", 1)
self.wait_altitude(90, 120, timeout=30, relative=True)
self.progress("Done takeoff")
self.install_message_hook_context(terrain_following_above_80m)
self.change_mode("GUIDED")
self.do_reposition(guided_loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL_TERRAIN_ALT)
self.progress("Flying to guided location")
self.wait_location(guided_loc,
accuracy=200,
target_altitude=None,
timeout=600)
self.progress("Reached guided location")
self.set_parameter("RALLY_LIMIT_KM", 50)
self.change_mode("RTL")
self.progress("Flying to rally point")
self.wait_location(rally_loc,
accuracy=200,
target_altitude=None,
timeout=600)
self.progress("Reached rally point")
self.context_pop()
self.disarm_vehicle(force=True)
self.reboot_sitl()
def Parachute(self):
'''Test Parachute'''
self.set_rc(9, 1000)
@ -5125,6 +5201,7 @@ class AutoTestPlane(AutoTest):
self.MAV_CMD_DO_LAND_START,
self.InteractTest,
self.MAV_CMD_MISSION_START,
self.TerrainRally,
])
return ret

View File

@ -7085,6 +7085,35 @@ class AutoTest(ABC):
raise NotAchievedException("Expected %s to be %u got %u" %
(channel, value, m_value))
def do_reposition(self,
loc,
frame=mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT):
'''send a DO_REPOSITION command for a location'''
self.run_cmd_int(
mavutil.mavlink.MAV_CMD_DO_REPOSITION,
0,
0,
0,
0,
int(loc.lat*1e7), # lat* 1e7
int(loc.lng*1e7), # lon* 1e7
loc.alt,
frame=frame
)
def add_rally_point(self, loc, seq, total):
'''add a rally point at the given location'''
self.mav.mav.rally_point_send(1, # target system
0, # target component
seq, # sequence number
total, # total count
int(loc.lat * 1e7),
int(loc.lng * 1e7),
loc.alt, # relative alt
0, # "break" alt?!
0, # "land dir"
0) # flags
def wait_location(self,
loc,
accuracy=5.0,