Пример #1
0
        /**
         * Get the look angle for the observers position to the object
         * @param[in] eci the object to find the look angle to
         * @returns the lookup angle
         */
        public CoordTopocentric GetLookAngle(Eci eci)
        {
            /*
             * update the observers Eci to match the time of the Eci passed in
             * if necessary
             */
            Update(eci.GetDateTime());

            /*
             * calculate differences
             */
            Vector range_rate = eci.Velocity() - m_eci.Velocity();
            Vector range      = eci.Position() - m_eci.Position();

            range.w = range.Magnitude();

            /*
             * Calculate Local Mean Sidereal Time for observers longitude
             */
            double theta = eci.GetDateTime().ToLocalMeanSiderealTime(m_geo.longitude);

            double sin_lat   = Math.Sin(m_geo.latitude);
            double cos_lat   = Math.Cos(m_geo.latitude);
            double sin_theta = Math.Sin(theta);
            double cos_theta = Math.Cos(theta);

            double top_s = sin_lat * cos_theta * range.x
                           + sin_lat * sin_theta * range.y - cos_lat * range.z;
            double top_e = -sin_theta * range.x
                           + cos_theta * range.y;
            double top_z = cos_lat * cos_theta * range.x
                           + cos_lat * sin_theta * range.y + sin_lat * range.z;
            double az = Math.Atan(-top_e / top_s);

            if (top_s > 0.0)
            {
                az += Global.kPI;
            }

            if (az < 0.0)
            {
                az += 2.0 * Global.kPI;
            }

            double el   = Math.Asin(top_z / range.w);
            double rate = range.Dot(range_rate) / range.w;

            /*
             * azimuth in radians
             * elevation in radians
             * range in km
             * range rate in km/s
             */
            return(new CoordTopocentric(az, el, range.w, rate));
        }
Пример #2
0
 /**
  * Constructor
  * @param[in] geo the observers position
  */
 public Observer(CoordGeodetic geo)
 {
     m_geo = new CoordGeodetic(geo);
     m_eci = new Eci(new DateTime(), geo);
 }
Пример #3
0
 /**
  * ructor
  * @param[in] latitude observers latitude in degrees
  * @param[in] longitude observers longitude in degrees
  * @param[in] altitude observers altitude in kilometers
  */
 public Observer(double latitude, double longitude, double altitude)
 {
     m_geo = new CoordGeodetic(latitude, longitude, altitude);
     m_eci = new Eci(new DateTime(), m_geo);
 }
Пример #4
0
        public static DateTime FindCrossingPoint(CoordGeodetic user_geo, SGP4 sgp4, DateTime initial_time1, DateTime initial_time2, bool finding_aos)
        {
            Observer obs = new Observer(user_geo);

            bool running;
            int  cnt;

            DateTime time1       = new DateTime(initial_time1.Ticks());
            DateTime time2       = new DateTime(initial_time2.Ticks());
            DateTime middle_time = null;

            running = true;
            cnt     = 0;
            while (running && cnt++ < 16)
            {
                middle_time = time1.AddSeconds((time2 - time1).TotalSeconds() / 2.0);

                /*
                 * calculate satellite position
                 */
                Eci eci = sgp4.FindPosition(middle_time);
                CoordTopocentric topo = obs.GetLookAngle(eci);

                if (topo.elevation > 0.0)
                {
                    /*
                     * satellite above horizon
                     */
                    if (finding_aos)
                    {
                        time2 = middle_time;
                    }
                    else
                    {
                        time1 = middle_time;
                    }
                }
                else
                {
                    if (finding_aos)
                    {
                        time1 = middle_time;
                    }
                    else
                    {
                        time2 = middle_time;
                    }
                }

                if ((time2 - time1).TotalSeconds() < 1.0)
                {
                    /*
                     * two times are within a second, stop
                     */
                    running = false;

                    /*
                     * remove microseconds
                     */
                    int us = middle_time.Microsecond();
                    middle_time = middle_time.AddMicroseconds(-us);

                    /*
                     * step back into the pass by 1 second
                     */
                    middle_time = middle_time.AddSeconds(finding_aos ? 1 : -1);
                }
            }

            /*
             * go back/forward 1second until below the horizon
             */
            running = true;
            cnt     = 0;
            while (running && cnt++ < 6)
            {
                Eci eci = sgp4.FindPosition(middle_time);
                CoordTopocentric topo = obs.GetLookAngle(eci);
                if (topo.elevation > 0)
                {
                    middle_time = middle_time.AddSeconds(finding_aos ? -1 : 1);
                }
                else
                {
                    running = false;
                }
            }

            return(middle_time);
        }
Пример #5
0
        public static double FindMaxElevation(CoordGeodetic user_geo, SGP4 sgp4, DateTime aos, DateTime los)
        {
            Observer obs = new Observer(user_geo);

            bool running;

            double   time_step    = (los - aos).TotalSeconds() / 9.0;
            DateTime current_time = aos; //! current time
            DateTime time1        = aos; //! start time of search period
            DateTime time2        = los; //! end time of search period
            double   max_elevation;      //! max elevation

            running = true;

            do
            {
                running       = true;
                max_elevation = -99999999999999.0;
                while (running && current_time < time2)
                {
                    /*
                     * find position
                     */
                    Eci eci = sgp4.FindPosition(current_time);
                    CoordTopocentric topo = obs.GetLookAngle(eci);

                    if (topo.elevation > max_elevation)
                    {
                        /*
                         * still going up
                         */
                        max_elevation = topo.elevation;

                        /*
                         * move time along
                         */
                        current_time = current_time.AddSeconds(time_step);
                        if (current_time > time2)
                        {
                            /*
                             * dont go past end time
                             */
                            current_time = time2;
                        }
                    }
                    else
                    {
                        /*
                         * stop
                         */
                        running = false;
                    }
                }

                /*
                 * make start time to 2 time steps back
                 */
                time1 = current_time.AddSeconds(-2.0 * time_step);

                /*
                 * make end time to current time
                 */
                time2 = current_time;

                /*
                 * current time to start time
                 */
                current_time = time1;

                /*
                 * recalculate time step
                 */
                time_step = (time2 - time1).TotalSeconds() / 9.0;
            } while (time_step > 1.0);


            return(max_elevation);
        }
Пример #6
0
        public static List <PassDetails> GeneratePassList(CoordGeodetic user_geo, SGP4 sgp4, DateTime start_time, DateTime end_time, int time_step)
        {
            List <PassDetails> pass_list = new List <PassDetails>();

            Observer obs = new Observer(user_geo);

            DateTime aos_time = null;
            DateTime los_time = null;

            bool found_aos = false;

            DateTime previous_time = new DateTime(start_time.Ticks());
            DateTime current_time  = new DateTime(start_time.Ticks());

            while (current_time < end_time)
            {
                bool end_of_pass = false;

                /*
                 * calculate satellite position
                 */
                Eci eci = sgp4.FindPosition(current_time);

                CoordTopocentric topo = obs.GetLookAngle(eci);

                if (!found_aos && topo.elevation > 0.0)
                {
                    /*
                     * aos hasnt occured yet, but the satellite is now above horizon
                     * this must have occured within the last time_step
                     */
                    if (start_time == current_time)
                    {
                        /*
                         * satellite was already above the horizon at the start,
                         * so use the start time
                         */
                        aos_time = start_time;
                    }
                    else
                    {
                        /*
                         * find the point at which the satellite crossed the horizon
                         */
                        aos_time = FindCrossingPoint(
                            user_geo,
                            sgp4,
                            previous_time,
                            current_time,
                            true);
                    }
                    found_aos = true;
                }
                else if (found_aos && topo.elevation < 0.0)
                {
                    found_aos = false;

                    /*
                     * end of pass, so move along more than time_step
                     */
                    end_of_pass = true;

                    /*
                     * already have the aos, but now the satellite is below the horizon,
                     * so find the los
                     */
                    los_time = FindCrossingPoint(user_geo, sgp4, previous_time, current_time, false);

                    PassDetails pd = new PassDetails();
                    pd.aos           = aos_time;
                    pd.los           = los_time;
                    pd.max_elevation = FindMaxElevation(user_geo, sgp4, aos_time, los_time);

                    pass_list.Add(pd);
                }

                /*
                 * save current time
                 */
                previous_time = current_time;

                if (end_of_pass)
                {
                    /*
                     * at the end of the pass move the time along by 30mins
                     */
                    current_time = current_time.AddMinutes(30);
                }
                else
                {
                    /*
                     * move the time along by the time step value
                     */
                    current_time = current_time.AddSeconds(180);
                }

                if (current_time > end_time)
                {
                    /*
                     * dont go past end time
                     */
                    current_time = end_time;
                }
            }
            ;

            if (found_aos)
            {
                /*
                 * satellite still above horizon at end of search period, so use end
                 * time as los
                 */
                PassDetails pd = new PassDetails();
                pd.aos           = aos_time;
                pd.los           = end_time;
                pd.max_elevation = FindMaxElevation(user_geo, sgp4, aos_time, end_time);

                pass_list.Add(pd);
            }

            return(pass_list);
        }