OpenSolo/shotmanager/Test/TestVectorPathHandler.py

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)