106 lines
3.8 KiB
Python
106 lines
3.8 KiB
Python
import datetime
|
|
import logging
|
|
import unittest
|
|
from isceobj.Orbit.Orbit import Orbit, StateVector
|
|
|
|
class OrbitTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
logging.basicConfig()
|
|
self.linearOrbit = Orbit()
|
|
self.quadOrbit = Orbit()
|
|
|
|
linpos, linvel = self.generateLinearSV(10,[[1.0,2.0,3.0]],[[1.0/60.0 for j in range(3)]])
|
|
quadpos, quadvel = self.generateQuadraticSV(10,[[1.0,2.0,3.0]],0.1)
|
|
|
|
dt = datetime.datetime(year=2010,month=1,day=1)
|
|
|
|
for i in range(10):
|
|
linsv = StateVector()
|
|
quadsv = StateVector()
|
|
linsv.setTime(dt)
|
|
quadsv.setTime(dt)
|
|
linsv.setPosition(linpos[i])
|
|
linsv.setVelocity(linvel[i])
|
|
quadsv.setPosition(quadpos[i])
|
|
quadsv.setVelocity(quadvel[i])
|
|
self.linearOrbit.addStateVector(linsv)
|
|
self.quadOrbit.addStateVector(quadsv)
|
|
|
|
dt = dt + datetime.timedelta(minutes=1)
|
|
|
|
def tearDown(self):
|
|
del self.linearOrbit
|
|
del self.quadOrbit
|
|
|
|
def generateLinearSV(self,num,pos,vel):
|
|
for i in range(1,num):
|
|
sv = [0.0 for j in range(3)]
|
|
for j in range(3):
|
|
sv[j] = pos[i-1][j]+vel[i-1][j]*60.0
|
|
pos.append(sv)
|
|
vel.append(vel[0])
|
|
return pos,vel
|
|
|
|
def generateQuadraticSV(self,num,pos,rate):
|
|
vel = [[0.0 for j in range(3)]]
|
|
for t in range(1,num):
|
|
newPos = [0.0 for j in range(3)]
|
|
newVel = [0.0 for j in range(3)]
|
|
for j in range(3):
|
|
newPos[j] = pos[0][j] + rate*(t**2)
|
|
newVel[j] = 2.0*rate*t/60.0
|
|
pos.append(newPos)
|
|
vel.append(newVel)
|
|
return pos,vel
|
|
|
|
def testAddStateVector(self):
|
|
a = None
|
|
self.assertRaises(TypeError,self.linearOrbit.addStateVector,a)
|
|
|
|
def testLinearInterpolateOrbit(self):
|
|
ans = [2.5,3.5,4.5]
|
|
sv = self.linearOrbit.interpolateOrbit(datetime.datetime(year=2010,month=1,day=1,hour=0,minute=1,second=30),method='linear')
|
|
pos = sv.getPosition()
|
|
for i in range(3):
|
|
self.assertAlmostEquals(pos[i],ans[i],5)
|
|
|
|
ans = [1.225,2.225,3.225]
|
|
sv = self.quadOrbit.interpolateOrbit(datetime.datetime(year=2010,month=1,day=1,hour=0,minute=1,second=30),method='linear')
|
|
pos = sv.getPosition()
|
|
for i in range(3):
|
|
self.assertAlmostEquals(pos[i],ans[i],5)
|
|
|
|
def testHermiteInterpolateOrbit(self):
|
|
ans = [2.5,3.5,4.5]
|
|
sv = self.linearOrbit.interpolateOrbit(datetime.datetime(year=2010,month=1,day=1,hour=0,minute=1,second=30),method='hermite')
|
|
pos = sv.getPosition()
|
|
for i in range(3):
|
|
self.assertAlmostEquals(pos[i],ans[i],5)
|
|
|
|
ans = [1.225,2.225,3.225]
|
|
sv = self.quadOrbit.interpolateOrbit(datetime.datetime(year=2010,month=1,day=1,hour=0,minute=1,second=30),method='hermite')
|
|
pos = sv.getPosition()
|
|
for i in range(3):
|
|
self.assertAlmostEquals(pos[i],ans[i],5)
|
|
|
|
def testLegendreInterpolateOrbit(self):
|
|
ans = [4.5,5.5,6.5]
|
|
sv = self.linearOrbit.interpolateOrbit(datetime.datetime(year=2010,month=1,day=1,hour=0,minute=3,second=30),method='legendre')
|
|
pos = sv.getPosition()
|
|
for i in range(3):
|
|
self.assertAlmostEquals(pos[i],ans[i],5)
|
|
|
|
ans = [2.225,3.225,4.225]
|
|
sv = self.quadOrbit.interpolateOrbit(datetime.datetime(year=2010,month=1,day=1,hour=0,minute=3,second=30),method='legendre')
|
|
pos = sv.getPosition()
|
|
for i in range(3):
|
|
self.assertAlmostEquals(pos[i],ans[i],5)
|
|
|
|
def testInterpolateOrbitOutOfBounds(self):
|
|
dt = datetime.datetime(year=2010,month=1,day=2)
|
|
self.assertRaises(ValueError,self.linearOrbit.interpolateOrbit,dt)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|