mirror of
https://github.com/OpenSolo/OpenSolo.git
synced 2025-04-29 22:24:32 +02:00
134 lines
5.6 KiB
Python
134 lines
5.6 KiB
Python
# Unit tests for ROI
|
|
import mock
|
|
from mock import Mock
|
|
import os
|
|
from os import sys, path
|
|
from pymavlink import mavutil
|
|
from shotManagerConstants import *
|
|
import unittest
|
|
import random
|
|
import math
|
|
|
|
from dronekit import Vehicle, LocationGlobalRelative
|
|
|
|
sys.path.append(os.path.realpath('..'))
|
|
import pathHandler
|
|
from shotManager import ShotManager
|
|
import shots
|
|
import vectorPathHandler
|
|
|
|
#Random number generator seed
|
|
SEED = 94739473
|
|
|
|
#Number of tests to run
|
|
REPEAT = 10
|
|
|
|
class TestMove(unittest.TestCase):
|
|
def setUp(self):
|
|
mgr = mock.create_autospec(ShotManager)
|
|
#mgr.currentShot = shots.APP_SHOT_ZIPLINE
|
|
v = mock.create_autospec(Vehicle)
|
|
v.message_factory = Mock()
|
|
v.commands = Mock()
|
|
self.handler = vectorPathHandler.VectorPathHandler(v, mgr, 0, 0)
|
|
random.seed(SEED)
|
|
|
|
def testTogglePauseShouldPause(self):
|
|
'''If cruiseSpeed != 0 then pause() should be executed'''
|
|
self.handler.pause = Mock()
|
|
self.handler.cruiseSpeed = 4.0
|
|
self.handler.togglePause()
|
|
self.handler.pause.assert_called_with()
|
|
|
|
def testTogglePauseShouldResume(self):
|
|
'''If cruiseSpeed == 0 then resume() should be executed'''
|
|
self.handler.resume = Mock()
|
|
self.handler.cruiseSpeed = 0.0
|
|
self.handler.togglePause()
|
|
self.handler.resume.assert_called_with()
|
|
|
|
def testSpotLock(self):
|
|
''' test accurcy of spot lock'''
|
|
vect = self.handler.getUnitVectorFromHeadingAndTilt(0, -45)
|
|
self.assertEqual(int(vect.y*1000), 0)
|
|
self.assertEqual(int(vect.x*1000), 707)
|
|
self.assertEqual(int(vect.z*1000), -707)
|
|
vect = self.handler.getUnitVectorFromHeadingAndTilt(90, -15)
|
|
self.assertEqual(int(vect.y*1000), 965)
|
|
self.assertEqual(int(vect.x*1000), 0)
|
|
self.assertEqual(int(vect.z*1000), -258)
|
|
vect = self.handler.getUnitVectorFromHeadingAndTilt(180, 0)
|
|
self.assertEqual(int(vect.y*1000), 0)
|
|
self.assertEqual(int(vect.x*1000), -1000)
|
|
self.assertEqual(int(vect.z*1000), 0)
|
|
|
|
def testNoCruiseForwardsFullStick(self):
|
|
""" Command should reach (and not exceed) MAX_SPEED [Flying in forwards (+) direction, full stick in positive direction] """
|
|
for test in range(REPEAT): #test REPEAT times with random values based on SEED
|
|
self.handler.cruiseSpeed = 0.0 #No cruise
|
|
initialSpeed = random.uniform(0.0,vectorPathHandler.MAX_PATH_SPEED) #Start at a random positive speed within acceptable limits
|
|
self.handler.accel = 0.136000
|
|
self.handler.currentSpeed = initialSpeed #set currentSpeed to initial
|
|
channels = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] #Full positive stick
|
|
channels[ROLL] = 1.0
|
|
#calculate number of ticks required to reach MAX_SPEED
|
|
deltaSpeed = vectorPathHandler.MAX_PATH_SPEED - self.handler.currentSpeed
|
|
ticksRequired = int(math.ceil(deltaSpeed/self.handler.accel))
|
|
|
|
for ticks in range(1,ticksRequired+1):
|
|
#run controller tick
|
|
returnSpeed = self.handler.move( channels )
|
|
#make sure we are targeted to the right loc
|
|
self.assertEqual(returnSpeed, vectorPathHandler.MAX_PATH_SPEED)
|
|
|
|
def testNoCruiseBackwardsFullNegStick(self):
|
|
""" Command should reach (and not exceed) MAX_SPEED [Flying in rewards (-) direction, full stick in negative direction] """
|
|
for test in range(REPEAT): #test REPEAT times with random values based on SEED
|
|
self.handler.cruiseSpeed = 0.0 #No cruise
|
|
self.handler.accel = 0.136000
|
|
initialSpeed = 0
|
|
self.handler.currentSpeed = initialSpeed #set currentSpeed to initial
|
|
channels = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] #Full negative stick
|
|
channels[ROLL] = -1.0
|
|
self.handler.accel = 1.0
|
|
#calculate number of ticks required to reach MAX_SPEED
|
|
deltaSpeed = -vectorPathHandler.MAX_PATH_SPEED - self.handler.currentSpeed
|
|
ticksRequired = int(math.ceil(abs(deltaSpeed/self.handler.accel)))
|
|
|
|
for ticks in range(1,ticksRequired+1):
|
|
#run controller tick
|
|
returnSpeed = self. handler.move( channels )
|
|
#make sure we are targeted to the right loc
|
|
self.assertGreaterEqual(returnSpeed, 0.0)
|
|
self.assertEqual(returnSpeed, vectorPathHandler.MAX_PATH_SPEED)
|
|
|
|
# THROTTLE = 0
|
|
# ROLL = 1
|
|
# PITCH = 2
|
|
# YAW = 3
|
|
# FILTERED_PADDLE = 5
|
|
# RAW_PADDLE = 7
|
|
|
|
def testCruiseSameDir(self):
|
|
""" Cruising with full same stick towards loc 2- should accelerate """
|
|
self.handler.cruiseSpeed = 4.0 #random positive cruise speed
|
|
self.handler.accel = 0.136000
|
|
self.handler.currentSpeed = self.handler.cruiseSpeed #start out at cruise
|
|
channels = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] #Stick forward
|
|
channels[PITCH] = -1.0
|
|
|
|
returnSpeed = self.handler.move( channels )
|
|
self.assertGreaterEqual(returnSpeed, self.handler.cruiseSpeed)
|
|
|
|
|
|
def testCruiseOppositeDir(self):
|
|
""" Cruising towards loc 2 with opposite stick - should decelerate to a steady state speed"""
|
|
self.handler.cruiseSpeed = 4.0 #random positive cruise speed
|
|
self.handler.accel = 0.136000
|
|
self.handler.currentSpeed = self.handler.cruiseSpeed #start out at cruise
|
|
channels = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] #Stick backward
|
|
channels[PITCH] = 1.0
|
|
returnSpeed = self.handler.move( channels )
|
|
self.assertLessEqual(returnSpeed, self.handler.cruiseSpeed)
|
|
|