Example #1
0
        public static List <Pass> CalculatePasses(Coordinate position, Tle satellite, EpochTime startTime, int accuracy = 15,
                                                  int maxNumberOfDays = 5, Sgp4.wgsConstant wgs = Sgp4.wgsConstant.WGS_84)
        {
            List <Pass> results = new List <Pass>();
            EpochTime   epoch   = new EpochTime(startTime);
            EpochTime   end     = new EpochTime(startTime);

            end.addDays(maxNumberOfDays);
            while (epoch < end)
            {
                Sgp4Data satPos = getSatPositionAtTime(satellite, epoch, wgs);
                if (SatFunctions.isSatVisible(position, 0.0, epoch, satPos))
                {
                    EpochTime passStart    = new EpochTime(epoch);
                    Point3d   spherical    = SatFunctions.calcSphericalCoordinate(position, epoch, satPos);
                    double    maxElevation = spherical.z;
                    epoch.addTick(accuracy);
                    satPos = getSatPositionAtTime(satellite, epoch, wgs);
                    while (SatFunctions.isSatVisible(position, 0.0, epoch, satPos))
                    {
                        spherical = SatFunctions.calcSphericalCoordinate(position, epoch, satPos);
                        if (maxElevation < spherical.z)
                        {
                            maxElevation = spherical.z;
                        }
                        epoch.addTick(accuracy);
                    }
                    results.Add(new One_Sgp4.Pass(position, passStart, new EpochTime(epoch), maxElevation * 180.0 / pi));
                }
                epoch.addTick(accuracy);
            }
            return(results);
        }
Example #2
0
        public double range;     //!< double range to satellite in km

        //! Constructor

        /*!
         * \param EpochTime timepoint
         * \param double elevation at timepoint
         * \param double azimuth at timepoint
         * \pram double range at timepoint
         */
        public PassDetail(EpochTime timepoint, double elevation, double azimuth, double range)
        {
            this.time      = timepoint;
            this.elevation = elevation;
            this.azimuth   = azimuth;
            this.range     = range;
        }
Example #3
0
        //! Calculate Range, Azimuth and elevation for satellite
        //! for given time point and satellite position

        /*!
         *  \param Station to calcuate if satellite is in View
         *  \param TimeDate start time
         *  \param List<Sgp4Data> satellite position vector
         *  \return Point3d containing range(km), azimuth(degrees), elevation(degrees)
         */
        public static Point3d calcSphericalCoordinate(Coordinate coordinate,
                                                      EpochTime time, Sgp4Data satPosData)
        {
            double lsr = time.getLocalSiderealTime(coordinate.getLongitude());

            Point3d groundLocation = coordinate.toECI(lsr);
            Point3d result         = new Point3d();

            Point3d r = new Point3d();

            r.x = satPosData.getX() - groundLocation.x;
            r.y = satPosData.getY() - groundLocation.y;
            r.z = satPosData.getZ() - groundLocation.z;

            double r_lat = coordinate.getLatetude() * toRadians;

            double sin_lat   = Math.Sin(r_lat);
            double cos_lat   = Math.Cos(r_lat);
            double sin_theta = Math.Sin(lsr);
            double cos_theta = Math.Cos(lsr);

            double rs = sin_lat * cos_theta * r.x + sin_lat * sin_theta * r.y - cos_lat * r.z;
            double re = -sin_theta * r.x + cos_theta * r.y;
            double rz = cos_lat * cos_theta * r.x + cos_lat * sin_theta * r.y + sin_lat * r.z;

            result.x = Math.Sqrt((rs * rs) + (re * re) + (rz * rz));
            result.y = AcTan(-re, rs);
            result.z = Math.Asin(rz / result.x);

            result.y = (result.y + pi) * toDegrees;
            result.z = result.z * toDegrees;

            return(result);
        }
Example #4
0
        //! Calculate satellite position at a single point in time

        /*!
         *  \param tle of satellite
         *  \param EpochTime to calculate position
         *  \param int WGS-Data to use 0 = WGS_72; 1 = WGS_84
         *  \return SGP4Data containing satellite position data
         */
        public static Sgp4Data getSatPositionAtTime(Tle satellite, EpochTime atTime, Sgp4.wgsConstant wgs)
        {
            Sgp4 sgp4Propagator = new Sgp4(satellite, wgs);

            sgp4Propagator.runSgp4Cal(atTime, atTime, 1 / 60.0);
            return(sgp4Propagator.getResults()[0]);
        }
Example #5
0
        //! EpochTime constructor.

        /*!
         * \param EpochTime
         * Contructs EpochTime from EpochTime Object
         */
        public EpochTime(EpochTime _EpochTime)
        {
            hour    = _EpochTime.getHour();
            minutes = _EpochTime.getMin();
            seconds = _EpochTime.getSec();

            year  = _EpochTime.getYear();
            month = _EpochTime.getMonth();
            day   = _EpochTime.getDay();

            epoch = _EpochTime.getEpoch();
        }
Example #6
0
        //! Calculate Latitude, longitude and height for satellite on Earth
        //! at given time point and position of the satellite

        /*!
         *  \param TimeDate start time
         *  \param List<Sgp4Data> satellite position vector
         *  \param int WGS-Data to use 0 = WGS_72; 1 = WGS_84
         *  \param int Nr of iterations used to calculate the latetude
         *  \return Coordinate containing longitude, latitude, altitude/height
         */
        public static Coordinate calcSatSubPoint(EpochTime time, Sgp4Data satPosData,
                                                 One_Sgp4.Sgp4.wgsConstant wgs)
        {
            double sat_X = satPosData.getX();
            double sat_Y = satPosData.getY();
            double sat_Z = satPosData.getZ();

            double f     = WGS_72.f;
            double wgs_R = WGS_72.radiusEarthKM;

            if (wgs == Sgp4.wgsConstant.WGS_84)
            {
                f     = WGS_84.f;
                wgs_R = WGS_84.radiusEarthKM;
            }
            double delta = 1.0e-07;
            double f_2   = f * f;
            double e     = 2 * f - f_2;

            double r        = Math.Sqrt((sat_X * sat_X) + (sat_Y * sat_Y));
            double latitude = AcTan(sat_Z, r);
            double c        = 1.0;
            double height   = 0.0;

            double phi;

            do
            {
                phi      = latitude;
                c        = 1.0 / (Math.Sqrt(1.0 - e * (Math.Sin(latitude) * Math.Sin(latitude))));
                latitude = AcTan(sat_Z + (wgs_R * c * e * Math.Sin(latitude)), r);
            }while (Math.Abs(latitude - phi) > delta);

            double longitude = AcTan(sat_Y, sat_X) - time.getLocalSiderealTime();

            height = (r / Math.Cos(latitude)) - (wgs_R * c);

            if (longitude < pi)
            {
                longitude += twoPi;
            }
            if (longitude > pi)
            {
                longitude -= twoPi;
            }

            latitude  = toDegrees * latitude;
            longitude = toDegrees * longitude;

            return(new Coordinate(latitude, longitude, height));
        }
Example #7
0
        //! Calculate visibility of a satellite from a point on Earth

        /*!
         *  \param Station to calcuate if satellite is in View
         *  \param TimeDate start time
         *  \param List<Sgp4Data> satellite position vector
         *  \param string name of the satellite
         *  \param double tick in witch time is increased by each step
         *  \return true if object is visible at given time and current location
         */
        public static bool isSatVisible(Coordinate coordinate,
                                        double minElevation, EpochTime time, Sgp4Data satPosData)
        {
            double  lsr            = time.getLocalSiderealTime(coordinate.getLongitude());
            Point3d groundLocation = coordinate.toECI(lsr);

            Point3d v = new Point3d();

            v.x = satPosData.getX() - groundLocation.x;
            v.y = satPosData.getY() - groundLocation.y;
            v.z = satPosData.getZ() - groundLocation.z;

            double r_lat = coordinate.getLatetude() * toRadians;

            double sin_lat = Math.Sin(r_lat);
            double cos_lat = Math.Cos(r_lat);
            double sin_srt = Math.Sin(lsr);
            double cos_srt = Math.Cos(lsr);


            double rs = sin_lat * cos_srt * v.x
                        + sin_lat * sin_srt * v.y
                        - cos_lat * v.z;
            double re = -sin_srt * v.x
                        + cos_srt * v.y;
            double rz = cos_lat * cos_srt * v.x
                        + cos_lat * sin_srt * v.y + sin_lat * v.z;

            double range     = Math.Sqrt(rs * rs + re * re + rz * rz);
            double elevation = Math.Asin(rz / range);
            double azimuth   = Math.Atan(-re / rs);

            if (rs > 0.0)
            {
                azimuth += pi;
            }
            if (azimuth < 0.0)
            {
                azimuth += twoPi;
            }

            if (elevation >= minElevation)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Example #8
0
        //! Calculate visibility of a satellite from a point on Earth

        /*!
         *  \param Station to calcuate if satellite is in View
         *  \param TimeDate start time
         *  \param List<Sgp4Data> satellite position vector
         *  \param string name of the satellite
         *  \param double tick in witch time is increased by each step
         *  \return true if object is visible at given time and current location
         */
        public static bool isSatVisible(Coordinate coordinate,
                                        double minElevation, EpochTime time, Sgp4Data satPosData)
        {
            Point3d res       = calcSphericalCoordinate(coordinate, time, satPosData);
            double  elevation = res.z;

            if (elevation >= minElevation)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Example #9
0
        //! Calculate Range, Azimuth and elevation for satellite
        //! for given time point and satellite position

        /*!
         *  \param Station to calcuate if satellite is in View
         *  \param TimeDate start time
         *  \param List<Sgp4Data> satellite position vector
         *  \return Point3d containing range, azimuth, elevation
         */
        public static Point3d calcSphericalCoordinate(Coordinate coordinate,
                                                      EpochTime time, Sgp4Data satPosData)
        {
            double  lsr            = time.getLocalSiderealTime(coordinate.getLongitude());
            Point3d groundLocation = coordinate.toECI(lsr);
            Point3d result         = new Point3d();

            Point3d v = new Point3d();

            v.x = satPosData.getX() - groundLocation.x;
            v.y = satPosData.getY() - groundLocation.y;
            v.z = satPosData.getZ() - groundLocation.z;

            double r_lat = coordinate.getLatetude() * toRadians;

            double sin_lat = Math.Sin(r_lat);
            double cos_lat = Math.Cos(r_lat);
            double sin_srt = Math.Sin(lsr);
            double cos_srt = Math.Cos(lsr);


            double rs = sin_lat * cos_srt * v.x
                        + sin_lat * sin_srt * v.y
                        - cos_lat * v.z;
            double re = -sin_srt * v.x
                        + cos_srt * v.y;
            double rz = cos_lat * cos_srt * v.x
                        + cos_lat * sin_srt * v.y + sin_lat * v.z;

            result.x = Math.Sqrt(rs * rs + re * re + rz * rz);
            result.y = Math.Atan(-re / rs);
            result.z = Math.Asin(rz / result.x);

            if (rs > 0.0)
            {
                result.y += pi;
            }
            if (result.y < 0.0)
            {
                result.y += twoPi;
            }

            return(result);
        }
Example #10
0
        //! Calculate Latitude, longitude and height for satellite on Earth
        //! at given time point and position of the satellite

        /*!
         *  \param TimeDate start time
         *  \param List<Sgp4Data> satellite position vector
         *  \param int WGS-Data to use 0 = WGS_72; 1 = WGS_84
         *  \param int Nr of iterations used to calculate the latetude
         *  \return Coordinate containing longitude, latitude, altitude/height
         */
        public static Coordinate calcSatSubPoint(EpochTime time, Sgp4Data satPosData,
                                                 int wgsID = 0)
        {
            double sat_X = satPosData.getX();
            double sat_Y = satPosData.getY();
            double sat_Z = satPosData.getZ();

            //calculat Longitude
            double latitude = Math.Atan((sat_Z / (Math.Sqrt(
                                                      sat_X * sat_X + sat_Y * sat_Y))));

            double longitude = AcTan(sat_Y, sat_X) - time.getLocalSiderealTime();
            double height    = Math.Sqrt(sat_X * sat_X + sat_Y * sat_Y + sat_Z * sat_Z) - 6378.135;

            latitude  = toDegrees * latitude;
            longitude = toDegrees * longitude;

            return(new Coordinate(latitude, longitude, height));
        }
Example #11
0
        //! Calculate Latitude, longitude and height for satellite on Earth
        //! at given time point and position of the satellite
        /*!
            \param TimeDate start time
            \param List<Sgp4Data> satellite position vector
            \param int WGS-Data to use 0 = WGS_72; 1 = WGS_84
            \param int Nr of iterations used to calculate the latetude
            \return Coordinate containing longitude, latitude, altitude/height
        */
        public static Coordinate calcSatSubPoint(EpochTime time, Sgp4Data satPosData,
            int wgsID = 0)
        {
            double sat_X = satPosData.getX();
            double sat_Y = satPosData.getY();
            double sat_Z = satPosData.getZ();

            //calculat Longitude
            double latitude = Math.Atan((sat_Z / (Math.Sqrt(
                                sat_X * sat_X + sat_Y * sat_Y))));

            double longitude = AcTan(sat_Y, sat_X) - time.getLocalSiderealTime();
            double height = Math.Sqrt(sat_X * sat_X + sat_Y * sat_Y + sat_Z * sat_Z) - 6378.135;

            latitude = toDegrees * latitude;
            longitude = toDegrees * longitude;

            return new Coordinate(latitude, longitude, height);
        }
Example #12
0
        //! Calculate Passes of a satellite for ceratin number of days from a starting time

        /*!
         *  \param Coordinate position of observer
         *  \param Tle satellite data
         *  \param EpochTime of startpoint
         *  \param int accuracy time between calculations default 15 seconds
         *  \param int number of days to calculate default 5 days
         *  \param int WGS-Data to use 0 = WGS_72; 1 = WGS_84 default WGS 84
         *  \return List<Pass> List of passes satellite is visible
         */
        public static List <Pass> CalculatePasses(Coordinate position, Tle satellite, EpochTime startTime, int accuracy = 15,
                                                  int maxNumberOfDays = 5, Sgp4.wgsConstant wgs = Sgp4.wgsConstant.WGS_84)
        {
            List <Pass> results = new List <Pass>();
            EpochTime   epoch   = new EpochTime(startTime);
            EpochTime   end     = new EpochTime(startTime);

            end.addDays(maxNumberOfDays);

            while (epoch < end)
            {
                Sgp4Data satPos = getSatPositionAtTime(satellite, epoch, wgs);
                if (SatFunctions.isSatVisible(position, 0.0, epoch, satPos))
                {
                    Point3d    spherical     = SatFunctions.calcSphericalCoordinate(position, epoch, satPos);
                    PassDetail startDetails  = new PassDetail(new EpochTime(epoch), spherical.z, spherical.y, spherical.x);
                    PassDetail maxEleDetails = new PassDetail(new EpochTime(epoch), spherical.z, spherical.y, spherical.x);
                    //double maxElevation = spherical.z;
                    epoch.addTick(accuracy);
                    satPos = getSatPositionAtTime(satellite, epoch, wgs);
                    while (spherical.z >= 0)
                    //while (SatFunctions.isSatVisible(position, 0.0, epoch, satPos))
                    {
                        spherical = SatFunctions.calcSphericalCoordinate(position, epoch, satPos);
                        if (maxEleDetails.elevation < spherical.z)
                        {
                            maxEleDetails = new PassDetail(new EpochTime(epoch), spherical.z, spherical.y, spherical.x);
                        }
                        epoch.addTick(accuracy);
                        satPos = getSatPositionAtTime(satellite, epoch, wgs);
                    }
                    PassDetail endDetails = new PassDetail(new EpochTime(epoch), spherical.z, spherical.y, spherical.x);
                    results.Add(new One_Sgp4.Pass(position, startDetails, maxEleDetails, endDetails));
                }
                epoch.addTick(accuracy);
            }
            return(results);
        }
Example #13
0
        //! SGP4 constructor.
        /*!
        \param tle Two Line Elements
        \param int GravConst 0 = WGS72, 1 = WGS82
        initializes the Orbit-Calculation model
        */
        public Sgp4(Tle data, int wgsConstant)
        {
            setGrav(wgsConstant);

            tleElementData = data;
            satCalcData = new Sgp4Rec();

            resultOrbitData = new List<Sgp4Data>();

            //Load TLE Data in sg4Rec Class for calculation
            satCalcData.rec_satnum = data.getSatNumber();
            satCalcData.rec_epochyr = data.getEpochYear();
            satCalcData.rec_epochdays = data.getEpochDay();
            satCalcData.rec_bstar = data.getDrag();
            satCalcData.rec_inclo = data.getInclination();
            satCalcData.rec_omegao = data.getRightAscendingNode();
            satCalcData.rec_ecco = data.getEccentriciy();
            satCalcData.rec_argpo = data.getPerigee();
            satCalcData.rec_mo = data.getMeanAnomoly();
            satCalcData.rec_no = data.getMeanMotion();

            satCalcData.rec_no = satCalcData.rec_no / xpdotp;

            satCalcData.rec_a = Math.Pow(satCalcData.rec_no * tumin, (-2.0 / 3.0));
            satCalcData.rec_ndot = satCalcData.rec_ndot / (xpdotp * 1440.0);
            satCalcData.rec_nddot = satCalcData.rec_nddot / (xpdotp * 1440.0 * 1440);

            satCalcData.rec_inclo = satCalcData.rec_inclo / rad;
            satCalcData.rec_omegao = satCalcData.rec_omegao / rad;
            satCalcData.rec_argpo = satCalcData.rec_argpo / rad;
            satCalcData.rec_mo = satCalcData.rec_mo / rad;

            //Initalize newton rhapson iteration
            newtonm(satCalcData.rec_ecco, satCalcData.rec_mo, e1, nuo);

            satCalcData.rec_alta = satCalcData.rec_a *
                (1.0 + satCalcData.rec_ecco * satCalcData.rec_ecco) - 1.0;
            satCalcData.rec_altp = satCalcData.rec_a *
                (1.0 - satCalcData.rec_ecco * satCalcData.rec_ecco) - 1.0;

            //check Yeahr to find the the right Date
            //Currently will only work until 2058
            //Currently oldest man made object Vangard1 Launched 1958
            if (satCalcData.rec_epochyr < 58)
                year = satCalcData.rec_epochyr + 2000;
            else
                year = satCalcData.rec_epochyr + 1900;

            // Epoch time
            satCalcData.rec_eptime = (year - 1950) * 365 + (year - 1949) / 4
                    + satCalcData.rec_epochdays;

            EpochTime satTime = new EpochTime(satCalcData.rec_epochyr,
                satCalcData.rec_epochdays);

            satCalcData.rec_mjdsatepoch = satTime.toJulianDate();
            satCalcData.rec_mjdsatepoch = satCalcData.rec_mjdsatepoch - 2400000.5;

            satCalcData.rec_init = 1;
            satCalcData.neo.neo_t = 0.0;

            sgp4Init(satCalcData.rec_satnum, year, satCalcData.rec_mjdsatepoch - 33281.0);
            //end;
        }
Example #14
0
        //! Run the sgp4 calculations
        /*!
        \param EpochTime starttime
        \param EpochTime stoptime
        \param double step in minutes
        calculates the orbit of the satellite starting from start to stoptime
        */
        public void runSgp4Cal(EpochTime starttime, EpochTime stoptime, double step)
        {
            EpochTime time = starttime;
            int startY = starttime.getYear();
            int stopY = stoptime.getYear();
            if (startY < 1900)
            {
                if (startY < 50)
                    startY = startY + 2000;
                else
                    startY = startY + 1900;
            }
            if (stopY < 1900)
            {
                if (stopY < 50)
                    stopY = stopY + 2000;
                else
                    stopY = stopY + 1900;
            }
            double starD = starttime.getEpoch();
            double stopD = stoptime.getEpoch();

            satCalcData.rec_srtime = (startY - 1950) * 365 + (startY - 1949) / 4 + starD;
            satCalcData.rec_sptime = (stopY - 1950) * 365 + (stopY - 1949) / 4 + stopD;
            satCalcData.rec_deltamin = step;

            double temp_t = (satCalcData.rec_srtime - satCalcData.rec_eptime) * 1440.0;
            satCalcData.neo.neo_t = temp_t;

            double stopTime = (satCalcData.rec_sptime - satCalcData.rec_eptime) * 1440.0 +
                satCalcData.rec_deltamin;

            while (temp_t < stopTime)
            {
                resultOrbitData.Add(calcSgp4());
                temp_t = temp_t + satCalcData.rec_deltamin;
                satCalcData.neo.neo_t = temp_t;
            }
        }
Example #15
0
        //! EpochTime constructor.
        /*!
        \param EpochTime
        Contructs EpochTime from EpochTime Object
        */
        public EpochTime(EpochTime _EpochTime)
        {
            hour = _EpochTime.getHour();
            minutes = _EpochTime.getMin();
            seconds = _EpochTime.getSec();

            year = _EpochTime.getYear();
            month = _EpochTime.getMonth();
            day = _EpochTime.getDay();

            epoch = _EpochTime.getEpoch();
        }
Example #16
0
        //! Calculate visibility of a satellite from a point on Earth
        /*!
            \param Station to calcuate if satellite is in View
            \param TimeDate start time
            \param List<Sgp4Data> satellite position vector
            \param string name of the satellite
            \param double tick in witch time is increased by each step
            \return true if object is visible at given time and current location
        */
        public static bool isSatVisible(Coordinate coordinate, 
            double minElevation, EpochTime time, Sgp4Data satPosData)
        {
            double lsr = time.getLocalSiderealTime(coordinate.getLongitude());
                Point3d groundLocation = coordinate.toECI(lsr);

                Point3d v = new Point3d();
                v.x = satPosData.getX() - groundLocation.x;
                v.y = satPosData.getY() - groundLocation.y;
                v.z = satPosData.getZ() - groundLocation.z;

                double r_lat = coordinate.getLatetude() * toRadians;

                double sin_lat = Math.Sin(r_lat);
                double cos_lat = Math.Cos(r_lat);
                double sin_srt = Math.Sin(lsr);
                double cos_srt = Math.Cos(lsr);

                double rs = sin_lat * cos_srt * v.x
                          + sin_lat * sin_srt * v.y
                          - cos_lat * v.z;
                double re = - sin_srt * v.x
                            + cos_srt * v.y;
                double rz = cos_lat * cos_srt * v.x
                            + cos_lat * sin_srt * v.y + sin_lat * v.z;

                double range = Math.Sqrt(rs * rs + re * re + rz * rz);
                double elevation = Math.Asin(rz / range);
                double azimuth = Math.Atan(-re / rs);

                if (rs > 0.0)
                {
                    azimuth += pi;
                }
                if (azimuth < 0.0)
                {
                    azimuth += twoPi;
                }

                if (elevation >= minElevation)
                {
                    return true;
                }
                else
                {
                    return false;
                }
        }
Example #17
0
        //! Calculate Range, Azimuth and elevation for satellite
        //! for given time point and satellite position
        /*!
            \param Station to calcuate if satellite is in View
            \param TimeDate start time
            \param List<Sgp4Data> satellite position vector
            \return Point3d containing range, azimuth, elevation
        */
        public static Point3d calcSphericalCoordinate(Coordinate coordinate,
            EpochTime time, Sgp4Data satPosData)
        {
            double lsr = time.getLocalSiderealTime(coordinate.getLongitude());
            Point3d groundLocation = coordinate.toECI(lsr);
            Point3d result = new Point3d();

            Point3d v = new Point3d();
            v.x = satPosData.getX() - groundLocation.x;
            v.y = satPosData.getY() - groundLocation.y;
            v.z = satPosData.getZ() - groundLocation.z;

            double r_lat = coordinate.getLatetude() * toRadians;

            double sin_lat = Math.Sin(r_lat);
            double cos_lat = Math.Cos(r_lat);
            double sin_srt = Math.Sin(lsr);
            double cos_srt = Math.Cos(lsr);

            double rs = sin_lat * cos_srt * v.x
                      + sin_lat * sin_srt * v.y
                      - cos_lat * v.z;
            double re = -sin_srt * v.x
                        + cos_srt * v.y;
            double rz = cos_lat * cos_srt * v.x
                        + cos_lat * sin_srt * v.y + sin_lat * v.z;

            result.x = Math.Sqrt(rs * rs + re * re + rz * rz);
            result.y = Math.Atan(-re / rs);
            result.z = Math.Asin(rz / result.x);

            if (rs > 0.0)
            {
                result.y += pi;
            }
            if (result.y < 0.0)
            {
                result.y += twoPi;
            }

            return result;
        }
Example #18
0
 public void setStart(EpochTime starttime, EpochTime stoptime, double tick)
 {
     _startTime = starttime;
     _stopTime = stoptime;
     _tick = tick;
 }