data/method/mavlink/pymavlink/tests/test_wp.py

256 lines
8.8 KiB
Python
Raw Normal View History

2024-07-24 18:30:46 +08:00
#!/usr/bin/env python
"""
regression tests for mavwp.py
"""
from __future__ import absolute_import, print_function
import unittest
import os
import pkg_resources
import sys
os.environ["MAVLINK20"] = "1"
from pymavlink import mavwp
from pymavlink import mavutil
class MAVWPTest(unittest.TestCase):
"""
Class to test mavwp
"""
def __init__(self, *args, **kwargs):
"""Constructor, set up some data that is reused in many tests"""
super(MAVWPTest, self).__init__(*args, **kwargs)
def makewp(self, seq):
return mavutil.mavlink.MAVLink_mission_item_int_message(
1, # wp.target_system,
1, # wp.target_component,
0, # wp.seq,
0, # wp.frame,
0, # wp.command,
0, # wp.current,
1, # wp.autocontinue,
0, # wp.param1,
0, # wp.param2,
0, # wp.param3,
0, # wp.param4,
0, # int(wp.x*1.0e7),
0, # int(wp.y*1.0e7),
seq, # wp.z
)
def make_wps(self):
# create waypoints
count = 4
waypoints = []
for i in range(count):
waypoints.append(self.makewp(i))
return waypoints
def test_add_remove(self):
"""Test we can add/remove waypoints to/from mavwp"""
loader = mavwp.MAVWPLoader()
self.assertEqual(loader.mav_mission_type(),
mavutil.mavlink.MAV_MISSION_TYPE_MISSION)
waypoints = self.make_wps()
# make sure basic addition works
for i in range(len(waypoints)):
self.assertEqual(loader.count(), i)
loader.add(waypoints[i])
self.assertEqual(loader.count(), i+1)
self.assertEqual(loader.wp(0).seq, 0)
self.assertEqual(loader.wp(1).seq, 1)
self.assertEqual(loader.wp(2).seq, 2)
self.assertEqual(loader.wp(0).z, 0)
self.assertEqual(loader.wp(1).z, 1)
self.assertEqual(loader.wp(2).z, 2)
# short test for the new item() method:
self.assertEqual(loader.item(0).z, 0)
self.assertEqual(loader.item(1).z, 1)
self.assertEqual(loader.item(2).z, 2)
# remove a middle one, make sure things get renumbered
loader.remove(waypoints[0])
self.assertEqual(loader.wp(0).seq, 0)
self.assertEqual(loader.wp(1).seq, 1)
self.assertEqual(loader.wp(2).seq, 2)
self.assertEqual(loader.wp(0).z, 1)
self.assertEqual(loader.wp(1).z, 2)
self.assertEqual(loader.wp(2).z, 3)
loader.clear()
self.assertEqual(loader.count(), 0)
def test_insert(self):
"""Test we can insert waypoints into mavwp"""
loader = mavwp.MAVWPLoader()
waypoints = self.make_wps()
loader.add(waypoints[0])
loader.add(waypoints[2])
self.assertEqual(loader.wp(0).seq, 0)
self.assertEqual(loader.wp(1).seq, 1)
self.assertEqual(loader.wp(0).z, 0)
self.assertEqual(loader.wp(1).z, 2)
loader.insert(1, waypoints[3])
self.assertEqual(loader.count(), 3)
self.assertEqual(loader.wp(0).seq, 0)
self.assertEqual(loader.wp(1).seq, 1)
self.assertEqual(loader.wp(2).seq, 2)
self.assertEqual(loader.wp(0).z, 0)
self.assertEqual(loader.wp(1).z, 3)
self.assertEqual(loader.wp(2).z, 2)
def test_set(self):
"""Test we set waypoints in mavwp"""
loader = mavwp.MAVWPLoader()
waypoints = self.make_wps()
loader.add(waypoints[0])
loader.add(waypoints[2])
self.assertEqual(loader.wp(0).seq, 0)
self.assertEqual(loader.wp(1).seq, 1)
self.assertEqual(loader.wp(0).z, 0)
self.assertEqual(loader.wp(1).z, 2)
loader.set(waypoints[3], 1)
self.assertEqual(loader.count(), 2)
self.assertEqual(loader.wp(0).seq, 0)
self.assertEqual(loader.wp(1).seq, 1)
self.assertEqual(loader.wp(0).z, 0)
self.assertEqual(loader.wp(1).z, 3)
# setting at the end of the list extends the list:
loader.set(waypoints[1], 2)
def test_add_latlonalt(self):
'''test add_latlonalt method'''
loader = mavwp.MAVWPLoader()
waypoints = self.make_wps()
loader.add(waypoints[0])
loader.add(waypoints[2])
loader.add_latlonalt(5, 6, 7, terrain_alt=True)
loader.add_latlonalt(10, 11, 12, terrain_alt=False)
wp1 = loader.wp(2)
self.assertEqual(wp1.x, 5)
self.assertEqual(wp1.y, 6)
self.assertEqual(wp1.z, 7)
self.assertEqual(wp1.frame, mavutil.mavlink.MAV_FRAME_GLOBAL_TERRAIN_ALT)
wp1 = loader.wp(3)
self.assertEqual(wp1.x, 10)
self.assertEqual(wp1.y, 11)
self.assertEqual(wp1.z, 12)
self.assertEqual(wp1.frame, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT)
def test_save(self):
'''test load/save in default format'''
loader = mavwp.MAVWPLoader()
waypoints = self.make_wps()
for wp in waypoints:
loader.add(wp)
outfile = "test_wp-wp.txt"
loader.save(outfile)
loader2 = mavwp.MAVWPLoader()
loader2.load(outfile)
outfile2 = "test_wp-wp2.txt"
loader.save(outfile2)
self.assertEqual(loader.count(), loader2.count())
for i in range(loader.count()):
self.assertEqual(loader.wp(i).z, loader2.wp(i).z)
def test_wp_is_loiter(self):
'''test is_loiter method'''
loader = mavwp.MAVWPLoader()
wp = self.makewp(1)
wp.command = mavutil.mavlink.MAV_CMD_NAV_LOITER_TURNS
loader.add(wp)
wp = self.makewp(2)
wp.command = mavutil.mavlink.MAV_CMD_NAV_WAYPOINT
loader.add(wp)
wp = self.makewp(2)
wp.command = mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH
loader.add(wp)
self.assertTrue(loader.wp_is_loiter(0))
self.assertFalse(loader.wp_is_loiter(1))
self.assertFalse(loader.wp_is_loiter(2))
assert True
def test_is_location_command(self):
loader = mavwp.MAVWPLoader()
self.assertFalse(loader.is_location_command(mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH))
self.assertTrue(loader.is_location_command(mavutil.mavlink.MAV_CMD_NAV_WAYPOINT))
self.assertTrue(loader.is_location_command(mavutil.mavlink.MAV_CMD_NAV_LOITER_TURNS))
class RallyTest(unittest.TestCase):
'''tests functions related to loading waypoints and transfering them
via the mission-item-protocol'''
def test_rally_load(self):
'''test loading rally points from old RALLY style file'''
loader = mavwp.MissionItemProtocol_Rally()
self.assertEqual(loader.mav_mission_type(),
mavutil.mavlink.MAV_MISSION_TYPE_RALLY)
self.assertTrue(loader.is_location_command(mavutil.mavlink.MAV_CMD_NAV_RALLY_POINT))
# test loading a QGC WPL 110 file:
rally_filepath = pkg_resources.resource_filename(__name__, "rally-110.txt")
loader.load(rally_filepath)
self.assertEqual(loader.count(), 2)
self.assertEqual(loader.wp(0).command, mavutil.mavlink.MAV_CMD_NAV_RALLY_POINT)
# test loading tradition "RALLY" style format:
rally_filepath = pkg_resources.resource_filename(__name__, "rally.txt")
loader.load(rally_filepath)
self.assertEqual(loader.count(), 2)
self.assertEqual(loader.wp(0).command, mavutil.mavlink.MAV_CMD_NAV_RALLY_POINT)
class FenceTest(unittest.TestCase):
def test_fence_load(self):
'''test loading rally points from old RALLY style file'''
loader = mavwp.MissionItemProtocol_Fence()
self.assertEqual(loader.mav_mission_type(),
mavutil.mavlink.MAV_MISSION_TYPE_FENCE)
self.assertTrue(loader.is_location_command(mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION))
# test loading a QGC WPL 110 file:
fence_filepath = pkg_resources.resource_filename(__name__,
"fence-110.txt")
loader.load(fence_filepath)
self.assertEqual(loader.count(), 10)
self.assertEqual(loader.wp(3).command, mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION)
# test loading tradition lat/lng-pair style format:
fence_filepath = pkg_resources.resource_filename(__name__,
"fence.txt")
loader.load(fence_filepath)
# there are 6 lines in the file - one return point, four fence
# points and a "fence closing point". We don't store the
# fence closing point.
self.assertEqual(loader.count(), 5)
self.assertEqual(loader.wp(0).command, mavutil.mavlink.MAV_CMD_NAV_FENCE_RETURN_POINT)
self.assertEqual(loader.wp(3).command, mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION)
if __name__ == '__main__':
unittest.main()