コード例 #1
0
    def process(self,gnssRaw):
        # clean invalid data in gnssRaw
        gnssRaw = self.filterValid(gnssRaw)
        # gnssRaw : dict
        allRxMilliseconds = gnssRaw['allRxMillis'].astype(np.float64)
        self.FctSeconds   = np.unique(allRxMilliseconds) * 1e-3
        self.Svid         = gnssRaw['Svid']
        nmeas = len(self.Svid)
        self._prepData(nmeas,gnssRaw)
        
        # GPS week number
        weekNumber = np.floor( - gnssRaw['FullBiasNanos'] * 1e-9 / GnssConstants.WEEKSEC)
        # GPS day number 
        # dayNumber = np.floor( - gnssRaw['FullBiasNanos']*1e-9 / GnssConstants.DAYSEC)
        # GPS time of week
        towSeconds = (gnssRaw['TimeNanos'] - gnssRaw['BiasNanos']) * 1e-9
        
        # compute time of measurement relative to start of week
        # subtract big longs (i.e. time from 1980) before casting time of week as double
        weekNumberNanos = np.int64(weekNumber * GnssConstants.WEEKSEC * 1e9)
        
        # compute tRxNanos using gnssRaw.FullBiasNanos(1), so that
        # tRxNanos includes rx clock drift since the first epoch:
        tRxNanos = gnssRaw['TimeNanos'] - self.fullBiasNanos - weekNumberNanos
        gnssRaw['State'] = gnssRaw['State'].astype(np.int)
        State = gnssRaw['State'][0]
        if not ((State & 2**3) or (State & 2**7)) :
            raise Exception('gnssRaw.State[0] must have bits 0 and (3 or 7) before calling Process')
        if not(np.all(tRxNanos >= 0)):
            raise Exception('tRxNanos should be >= 0')
        tRxGnssSeconds = tRxNanos - gnssRaw['TimeOffsetNanos'] - gnssRaw['BiasNanos']
        tRxSeconds = np.zeros(tRxGnssSeconds.shape)
        # tRx at positions of GPS
        gpspos = ((gnssRaw['ConstellationType'] == 1) * (gnssRaw['State'] & 2**3))!=0
        tRxSeconds[gpspos] = np.mod(tRxGnssSeconds[gpspos],GnssConstants.WEEKSEC*1e9)*1e-9
        # tRx at position of BDS
        bdspos = ((gnssRaw['ConstellationType'] == 5) * (gnssRaw['State'] & 2**3))!=0
        tRxSeconds[bdspos] = np.mod(tRxGnssSeconds[bdspos],GnssConstants.WEEKSEC*1e9)*1e-9 - 14
        # tRx at position of GEO
        galpos = ((gnssRaw['ConstellationType'] == 6) * (gnssRaw['State'] & 2**3))!=0
        tRxSeconds[galpos] = np.mod(tRxGnssSeconds[galpos],GnssConstants.MILLISEC*1e9)*1e-9
        # tRx at positions of GLO
        glspos = ((gnssRaw['ConstellationType'] == 3) * (gnssRaw['State'] & 2**7))!=0
        utctime = Time.Gps2Utc(weekNumber,towSeconds,allRxMilliseconds*1e-3)
        leapsecs = Time.LeapSeconds(utctime)
        tRxSeconds[glspos] = np.mod(tRxGnssSeconds[glspos],GnssConstants.DAYSEC*1e9)*1e-9 + (3*60*60 - leapsecs[glspos])
        
        tTxSeconds  = (gnssRaw['ReceivedSvTimeNanos'] + gnssRaw['TimeOffsetNanos'])*1e-9
        prSeconds = tRxSeconds - tTxSeconds
        
        tRxSeconds[glspos==0],prSeconds[glspos==0] = self.checkGpsTimeRollover(tRxSeconds[glspos==0],prSeconds[glspos==0],'week')
        tRxSeconds[glspos],prSeconds[glspos]       = self.checkGpsTimeRollover(tRxSeconds[glspos],prSeconds[glspos],'day')
        
        PrM         = prSeconds * GnssConstants.LIGHTSPEED
        PrSigmaM    = gnssRaw['ReceivedSvTimeUncertaintyNanos'] * 1e-9 * GnssConstants.LIGHTSPEED
        PrrMps      = gnssRaw['PseudorangeRateMetersPerSecond']
        PrrSigmaMps = gnssRaw['PseudorangeRateUncertaintyMetersPerSecond']
        AdrM        = gnssRaw['AccumulatedDeltaRangeMeters']
        AdrSigmaM   = gnssRaw["AccumulatedDeltaRangeUncertaintyMeters"]
        AdrState    = gnssRaw['AccumulatedDeltaRangeState']
        Cn0DbHz     = gnssRaw['Cn0DbHz']
        ConstellationType  = gnssRaw['ConstellationType']
        CarrierFrequencyHz = gnssRaw['CarrierFrequencyHz']
        
        self.fctTime    = weekNumber[0] * GnssConstants.WEEKSEC + tRxSeconds[gpspos][0]
        self.GpsTime    = Time.Fct2Ymdhms(np.array([self.fctTime]))[0]
        self.tRxSeconds = tRxSeconds
        self.tTxSeconds = tTxSeconds
        self.PrM        = PrM
        self.PrSigmaM   = PrSigmaM
        self.PrrMps     = PrrMps
        self.PrrSigmaMps= PrrSigmaMps
        self.AdrM       = AdrM
        self.AdrSigmaM  = AdrSigmaM
        self.AdrState   = AdrState
        self.Cn0DbHz    = Cn0DbHz
        self.ConstellationType = ConstellationType
        self.CarrierFrequencyHz = CarrierFrequencyHz
            
        self.ClkDCount = gnssRaw['HardwareClockDiscontinuityCount'][0]
        
        if gnssRaw['HardwareClockDiscontinuityCount'][0] != gnssRaw['HardwareClockDiscontinuityCount'][-1]:
            raise Exception('HardwareClockDiscontinuityCount changed within the same epoch')
        self.freqSign(gnssRaw)
        self.DelPrM = self._getDelPr()
#        self.PhaseMeas = self._getPhaseMeas()
#        self.PhaseMeas = self.AdrM / AdrMconstBias.getStandardWaveL(self.freqNum,self.ConstellationType,self.CarrierFrequencyHz)
        self.PhaseMeas = self.AdrM / AdrMconstBias.getStandardWaveL(self.freqNum,self.ConstellationType,self.Svid)
        self.PhaseMeas[(self.AdrState & 2**0) == 0] = np.nan
        self.iepoch += 1
        return None