Ejemplo n.º 1
0
    def test_appr_actTypeB(self, value):

        torque_req = np.asarray(value[0])
        magfield_b = np.asarray(value[1])
        app_torque_exp = np.asarray(value[2])

        vel = np.array([5, 6, 7])
        pos = np.array([3, 4, 5])

        q_BI = np.array([0.5, -0.5, 0.5, -0.5])
        q_IB = quatInv(q_BI)
        q_BO = qBI2qBO(q_BI, pos, vel)

        magfield_i = quatRotate(q_IB, magfield_b)

        w_BO_b = np.array([8, 6, 7])
        state = np.hstack((q_BO, w_BO_b))
        t0 = 0
        s = sat.Satellite(state, t0)
        s.setVel(vel)
        s.setPos(pos)
        s.setMag_i(magfield_i)
        s.setControl_b(torque_req)

        app_torque = act.actuatorTypeB(s)

        self.assertTrue(np.allclose(app_torque, app_torque_exp))
Ejemplo n.º 2
0
	def test_data(self):
		qIB = 0.5 * np.array([0,-1,0,np.sqrt(3)])
		r = np.array([0.,0.,7.07e6])
		v = np.array([0.,7.0e3,0.])
		expectedInv = (0.5/np.sqrt(2.))*np.array([np.sqrt(3.),np.sqrt(3.),1.,1.])
		result = fr.qBI2qBO(qnv.quatInv(qIB),r,v)
		
		self.assertTrue(np.allclose(qnv.quatInv(expectedInv) ,result))
Ejemplo n.º 3
0
    def test_south_pole_ideal(self):
        #above south pole, body frame, orbit frame and eci frame have same attitude wrt each other
        r = np.array([0., 0., -7.07e6])
        v = np.array([7.0e3, 0., 0.])
        qBI = np.array([1., 0., 0., 0.])
        expected = np.array([1., 0., 0., 0.])
        result = fr.qBI2qBO(qBI, r, v)

        self.assertTrue(np.allclose(expected, result))
    def test_magmeter(self, value):
        qBI = np.asarray(value[0])
        v_sv_i = np.asarray(value[1])

        v_pos_i = np.array([1e6, -2.03, -3.0])
        v_vel_i = np.array([2.0e3, 2.8, -73.2])
        qBO = frames.qBI2qBO(qBI, v_pos_i, v_vel_i)
        state = np.hstack((qBO, np.zeros(3)))
        mySat = satellite.Satellite(state, 12.0)
        mySat.setQ_BI(qBI)
        result = defblock.magmeter(mySat, v_sv_i)
        v_expected = value[2], value[3]
        self.assertTrue(np.allclose(result, v_expected))
Ejemplo n.º 5
0
	def test_gg_data_type(self):
		qBI = np.array([0.,0.,0.,1.])
		wBIb = np.array([0.,0.,0.])
		v_pos_i = np.array([7070e3,0.,0.])
		v_vel_i = np.array([2.0e3,2.8,-73.2])
		qBO = fs.qBI2qBO(qBI,v_pos_i,v_vel_i)
		wBOB = fs.wBIb2wBOb(wBIb,qBO,v_w_IO_o)
		sat = Satellite(np.hstack((qBO,wBOB)),13.)
		sat.setPos(np.array([7070e3,0.,0.]))  
		sat.setQ_BI(qBI)
		dist.ggTorqueb(sat)
		result = sat.getggDisturbance_b()        
		self.assertEqual(type(result),np.ndarray)
Ejemplo n.º 6
0
    def test_aero_type(self):
        qBI = np.array([-np.sqrt(0.5), 0., 0., np.sqrt(0.5)])
        wBIb = np.array([0.1, 0.23, 0.])
        v_pos_i = np.array([0., 0., 7e6])
        v_vel_i = np.array([0, 2e3, 6e3])
        qBO = fs.qBI2qBO(qBI, v_pos_i, v_vel_i)
        wBOB = fs.wBIb2wBOb(wBIb, qBO, v_w_IO_o)
        sat = Satellite(np.hstack((qBO, wBOB)), 13.)
        sat.setPos(np.array([0., 0., 7e6]))
        sat.setVel(np.array([0, 2e3, 6e3]))
        dist.aeroTorqueb(sat)
        result = sat.getaeroDisturbance_b()

        self.assertEqual(type(result), np.ndarray)
Ejemplo n.º 7
0
    def test_inertia_eigenvec(self, value):

        qBI = np.array([0., 0., 0., 1.])
        wBIb = np.array([0.1, -0.02, -0.2])
        v_pos_i = value
        v_vel_i = np.array([5.60, -5.0, 0.0])
        qBO = fs.qBI2qBO(qBI, v_pos_i, v_vel_i)
        wBOB = fs.wBIb2wBOb(wBIb, qBO, v_w_IO_o)
        sat = Satellite(np.hstack((qBO, wBOB)), 13.)
        sat.setPos(value)
        sat.setVel(v_vel_i)
        dist.ggTorqueb(sat)
        result = sat.getggDisturbance_b()
        self.assertTrue(np.allclose(result, [0., 0., 0.]))
Ejemplo n.º 8
0
	def test_aero_value(self):
		qBI = np.array([-np.sqrt(0.5),0.,0.,np.sqrt(0.5)])
		wBIb = np.array([0.1,0.23,0.])
		v_pos_i = np.array([0.,0.,7e6])
		v_vel_i = np.array([0,2e3,6e3])
		qBO = fs.qBI2qBO(qBI,v_pos_i,v_vel_i)
		wBOB = fs.wBIb2wBOb(wBIb,qBO,v_w_IO_o)
		sat = Satellite(np.hstack((qBO,wBOB)),13.)
		sat.setQ_BI(qBI)
		sat.setPos(np.array([0.,0.,7e6]))
		sat.setVel(np.array([0,2e3,6e3]))
		dist.aeroTorqueb(sat)
		result = sat.getaeroDisturbance_b()
		self.assertTrue(np.allclose(result, [2.99654080e-10,-2.57065600e-11,-7.71196800e-11]))
Ejemplo n.º 9
0
	def test_magmeter(self,value): 
		qBI = np.asarray(value[0])
		v_B_i=np.asarray(value[1])
		v_pos_i = np.array([1e6,-2.03,-3.0])
		v_vel_i = np.array([2.0e3,2.8,-73.2])
		qBO = frames.qBI2qBO(qBI,v_pos_i,v_vel_i)
		state = np.hstack((qBO,np.zeros(3)))
		mySat = satellite.Satellite(state,12.0)
		mySat.setMag_i(v_B_i)
		mySat.setPos(v_pos_i)
		mySat.setVel(v_vel_i)
		qOI = qnv.quatMultiplyNorm(qnv.quatInv(qBO),qBI)
		result = defblock.magnetometer(mySat)
		v_expected = value[2];
		self.assertTrue(np.allclose(result,v_expected))
Ejemplo n.º 10
0
    def test_data(self):
        qBI = np.array([
            0.5 * np.sqrt(1 + 0.5 * np.sqrt(3.)),
            -0.5 * np.sqrt(1 + 0.5 * np.sqrt(3.)),
            -0.25 * np.sqrt(2 / (2 + np.sqrt(3))),
            0.25 * np.sqrt(2 / (2 + np.sqrt(3)))
        ])

        r = np.array([0., 0., 7.07e6])
        v = np.array([0., 7.0e3, 0.])
        expected = (0.5 / np.sqrt(2.)) * np.array(
            [np.sqrt(3.), np.sqrt(3.), 1., 1.])
        result = fr.qBI2qBO(qBI, r, v)

        self.assertTrue(np.allclose(expected, result))
Ejemplo n.º 11
0
	def test_solar_torque_value(self):
		qBI = np.array([0.,0.,0.,1.])
		wBIb = np.array([0.1,-0.02,-0.2])
		v_pos_i = np.array([7070e3,0.,0.])
		v_vel_i = np.array([0,2e3,6e3])
		qBO = fs.qBI2qBO(qBI,v_pos_i,v_vel_i)
		wBOB = fs.wBIb2wBOb(wBIb,qBO,v_w_IO_o)
		sat = Satellite(np.hstack((qBO,wBOB)),13.)
		sat.setQ_BI(qBI)			   		
		v_sv_i=np.array([1.0,0.0,0.0])            #sun vector in eci frame
		sat.setSun_i(v_sv_i)
		sat.setLight(1)
		dist.solarTorqueb(sat)
		result = sat.getsolarDisturbance_b()        
		self.assertTrue(np.allclose(result,[  0.00000000e+00,-3.66624000e-11,3.17376000e-10]))
Ejemplo n.º 12
0
	def test_solar_torque_type(self):
		qBI = np.array([0.,0.,0.,1.])
		wBIb = np.array([0.,0.,0.])
		v_pos_i = np.array([7070e3,0.,0.])
		v_vel_i = np.array([0,2e3,6e3])
		qBO = fs.qBI2qBO(qBI,v_pos_i,v_vel_i)
		wBOB = fs.wBIb2wBOb(wBIb,qBO,v_w_IO_o)
		sat = Satellite(np.hstack((qBO,wBOB)),13.)
		sat.setQ_BI(qBI)			   		
		sat.setPos(np.array([7070e3,0.,0.]))
		v_sv_i=np.array([1.0,0.0,0.0])
		sat.setSun_i(v_sv_i)
		sat.setLight(1)  
		dist.solarTorqueb(sat)
		result = sat.getsolarDisturbance_b()        
		self.assertEqual(type(result),np.ndarray)
    m_torque_dist[i, :] = v_torque_total_b.copy()

    v_state_next = np.zeros((1, 7))

    #Use rk4 solver to calculate the state for next step
    for j in range(0, int(MODEL_STEP / h)):
        v_state_next = sol.rk4Quaternion(Advitiy, x_dot, h)
        Advitiy.setState(v_state_next.copy())
        Advitiy.setTime(t0 + i * MODEL_STEP + (j + 1) * h)

    m_state[i + 1, :] = v_state_next.copy()

    #Calculate observable quantities

    m_q_BO[i + 1, :] = fs.qBI2qBO(v_state_next[0:4], m_sgp_output_i[i + 1,
                                                                    1:4],
                                  m_sgp_output_i[i + 1, 4:7])
    m_w_BO_b[i + 1, :] = fs.wBIb2wBOb(v_state_next[4:7], m_q_BO[i + 1, :],
                                      v_w_IO_o)
    m_euler_BO[i + 1, :] = qnv.quat2euler(m_q_BO[i + 1, :])

#save the data files
os.chdir('Logs/')
os.mkdir('polar-identity-no-dist')
os.chdir('polar-identity-no-dist')
np.savetxt('position.csv', m_sgp_output_i[:, 1:4], delimiter=",")
np.savetxt('velocity.csv', m_sgp_output_i[:, 4:7], delimiter=",")

np.savetxt('time.csv', m_sgp_output_i[:, 0] - t0, delimiter=",")
np.savetxt('w_BOB.csv', m_w_BO_b, delimiter=",")
np.savetxt('q_BO.csv', m_q_BO, delimiter=",")