Ejemplo n.º 1
0
    def isObservable(self, X, t, params):
        """
        Method that decides if a state is observable for a given time and GS coordinates.
        :param X: State.
        :param t: Time.
        :param params: Dynamic parameters (GS coordinates).
        :return: Boolean indicating if it is visible.
        """
        x = X[0]
        y = X[1]
        z = X[2]

        theta_0 = self._params[0]
        theta_dot = self._params[1]
        R_eq = self._params[2]
        e_planet = self._params[3]

        GS_number = params[0]

        GS_coord = self.getObserverCoordinates()

        r_gs_ecef = GS_coord[GS_number]

        r_eci_vec = np.array([x,y,z])
        GMST = theta_dot * t + theta_0 # Greenwhich Mean Sidereal Time

        r_ecef_vec = coordinateTransformations.eci2ecef(r_eci_vec, GMST)

        azElRange = coordinateTransformations.ecef2AzElRange(r_ecef_vec, r_gs_ecef, R_eq, e_planet)

        raDecRange = coordinateTransformations.eci2RightAscensionDeclinationRange(r_eci_vec)

        if azElRange[1] > np.deg2rad(10): # Elevation Mask 10 deg
            if (raDecRange[1] < np.deg2rad(70) and raDecRange[1] > np.deg2rad(-70)) : # declination not near to 90 deg (azimuth undefined)
                return True
            else:
                return False
        else:
            return False
Ejemplo n.º 2
0
plt.figure()
plt.hold(True)
plt.plot(state_time_vec/3600, state_list.getTrueAnomalyVector()*180/np.pi, 'b')
plt.xlim([0, state_time_vec[-1]/3600])
ax = plt.gca()
ax.ticklabel_format(useOffset=False)
plt.xlabel('Simulation Time [h]')
plt.ylabel('Right ascension of ascending node [deg]')
plt.savefig('../report/include/true_anomaly.png', bbox_inches='tight', dpi=300)


for i in range(0, obs_time_vec.size):
    if select_obs == RA_DEC:
        r_eci = obs_states_vec[i][0:3]
        (rightAs, dec, rang) = coordinateTransformations.eci2RightAscensionDeclinationRange(r_eci)
        print (rightAs - observations[i][0])
        print (dec - observations[i][1])
    else:
        GMST = theta_0 + theta_dot * obs_time_vec[i]
        r_eci = obs_states_vec[i][0:3]
        v_eci = obs_states_vec[i][3:6]
        range_vec = coordinateTransformations.eci2ecef(r_eci, GMST) - GS_coord[observers[i]]
        range_norm = np.linalg.norm(range_vec)

        R_EN = coordinateTransformations.ROT3(GMST)
        range_rate_vec = -w_matrix.dot(R_EN).dot(r_eci) + R_EN.dot(v_eci)

        range_rate = range_vec.dot(range_rate_vec)/range_norm

        print (range_norm - observations[i][0])
Ejemplo n.º 3
0
plt.figure()
plt.hold(True)
plt.plot(state_time_vec / 3600,
         state_list.getTrueAnomalyVector() * 180 / np.pi, 'b')
plt.xlim([0, state_time_vec[-1] / 3600])
ax = plt.gca()
ax.ticklabel_format(useOffset=False)
plt.xlabel('Simulation Time [h]')
plt.ylabel('Right ascension of ascending node [deg]')
plt.savefig('../report/include/true_anomaly.png', bbox_inches='tight', dpi=300)

for i in range(0, obs_time_vec.size):
    if select_obs == RA_DEC:
        r_eci = obs_states_vec[i][0:3]
        (rightAs, dec,
         rang) = coordinateTransformations.eci2RightAscensionDeclinationRange(
             r_eci)
        print(rightAs - observations[i][0])
        print(dec - observations[i][1])
    else:
        GMST = theta_0 + theta_dot * obs_time_vec[i]
        r_eci = obs_states_vec[i][0:3]
        v_eci = obs_states_vec[i][3:6]
        range_vec = coordinateTransformations.eci2ecef(
            r_eci, GMST) - GS_coord[observers[i]]
        range_norm = np.linalg.norm(range_vec)

        R_EN = coordinateTransformations.ROT3(GMST)
        range_rate_vec = -w_matrix.dot(R_EN).dot(r_eci) + R_EN.dot(v_eci)

        range_rate = range_vec.dot(range_rate_vec) / range_norm