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) if azElRange[1] > np.deg2rad(10): # Elevation Mask 10 deg return True else: return 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]) print (range_rate - observations[i][1]) print obs_time_vec print observers
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]) print(range_rate - observations[i][1]) print obs_time_vec print observers print observations