Номер PRN в файлах TLE совпадает с файлами RINEX? (в созвездии GPS)

Я хочу сравнить позицию, рассчитанную с файлами Pyephem и TLE , с файлами RINEX и библиотекой GPSTK в конкретную дату и время, но у меня нет уверенности, что имя спутника "PRN ##" одинаково в обоих файлах ( ТЛЭ и РИНЭКС)?

например, в Celestrak (файл TLE) для созвездия GPS идентификатор или имя спутника:

GPS BIIF-1 (PRN 25)
1 26690C 01004A 17096.69312500 -.00000000 00000-0 00000-0 0 966 2 26690 53.0252 160.8176 0181123 256.091566 20.3285 40

но в файлах RINEX есть только буква, присоединенная к числу, например:

17 01 12 00 00 0,0000000 0 21G05G16G20G21 G25 G26G27G29G31R01R02R09 R15R16R17R18R19E01E26S20S36

где буква — это созвездие G для созвездия GPS , а R — для созвездия ГЛОНАСС , S — для SBAS и т. д. Рядом с буквой — число, например, G25 , номер этого спутника — 25 для файла RINEX.

Я работал с созвездием GPS. Я тестирую код на python, но я не уверен, что PRN 25 совпадает с G25?, потому что расчет высоты спутника с ID 25 в лунный день отличается во времени, которое показывает файл RINEX. сравнение с файлами TLE... или может быть что-то не так в моем коде.

obsHeader, obsData = gpstk.readRinex3Obs(obsfile)
navHeader, navData = gpstk.readRinex3Nav(navfile)
# setup ephemeris store to look for satellite positions
bcestore = gpstk.GPSEphemerisStore()
for navDataObj in navData:
    ephem = navDataObj.toGPSEphemeris()
    bcestore.addEphemeris(ephem)
bcestore.SearchNear()
navData.close()
#look each satellite
for obsObject in obsData: #round the data
    for satID, datumList in obsObject.obs.iteritems():
        if satID.systemGPS == satID.system and satID.id == NumSatellite:
            time=obsObject.time #satellite time from the observation
            CivilTime = gpstk.CivilTime(obsObject.time)
            #break
            eph   = bcestore.findEphemeris(satID, obsObject.time)
            svXvt = eph.svXvt(obsObject.time)
            elev = obsHeader.antennaPosition.elvAngle(svXvt.getPos())
            azim    = obsHeader.antennaPosition.azAngle(svXvt.getPos())
            
            SecondsTime.append(obsObject.time.getSecondOfDay())
            TimesSatRin.append(CivilTime)
            AziSatRin.append(azim)
            ElevSatRin.append(elev)
#for each observation day.
DateTimeRinex = CivilTime2datetime(TimesSatRin)
for t in DateTimeRinex:
    #for each Time of the rinex (for the specific Satellite)
    print 'next time: ', t

    names,elevs,azs,types = GetPositionELAZ(t,Longitude_obs,Latitude_obs,1) #just GPS with TLE files
    print names
    for i in range (0,len(names)):
        number = int(filter(str.isdigit, names[i]))
        #print number,' number sat of the TLE'
        if number == NumSatellite:
            print 'GOT',number,' number sat of the TLE'
            TimeTLE.append(t)
            ElevTLE.append(elevs)
            AzimTLE.append(azs)

Положение (долгота, широта) совпадает с наземной станцией хранилища файлов RINEX. Спасибо.

ОБНОВЛЕНИЕ 1:
я тестирую свой код, одно транспортное средство за другим, и я могу видеть сравнение высот каждого спутника в течение дня. Для файлов RINEX я пытаюсь использовать 4 дня, день года 101, 100, 80 и 10. И для этих дней всегда TLS PRN 10 , результаты аналогичны RINEX PRN 12 ; Я сказал похожие, потому что это не те же результаты. Я все еще проверяю.

20 апреля

20 апреля

19 апреля

19 апреля

21 марта

21 марта

10 января

10 января

По-видимому, существует идентификатор PRN для RINEX для каждого идентификатора PRN для TLE, в этом случае RINEX PRN 12 = TLE PRN 10. Но это не точный ответ, поэтому я позволю открыть вопрос.

ОБНОВЛЕНИЕ 2:

Расчет положения с помощью TLE очень точен. но у меня ошибка, я получил позицию в долготе/широте, но это была неправильная позиция, обязательно, вы должны взять позицию для сравнения, по файлу RINEX (файл наблюдения), в шапке; файл имеет позицию в X, Y, Z, поэтому необходимо преобразовать в позицию долгота-широта.введите описание изображения здесь

для получения долготы-широты:

def Get_latitude(x, y, z):
    #radius earth
    r = 6371000.
    return np.arcsin(z/r)*(180/np.pi)

def Get_longitude(x, y, z):
    #radius earth
    r = 6371000.
    if (x > 0):
        return np.arctan(y/x)*(180./np.pi)
    elif y > 0:
        return np.arctan(y/x)*(180./np.pi) + 180.
    else:
        return np.arctan(y/x)*(180./np.pi) - 180.
Я не уверен, правильно ли я понял проблему, но номер PRN предназначен для спутника GPS, поэтому он не должен меняться между разными источниками. О какой разнице вы говорите?
Идентификатор файла TLS для каждого спутника, например, GPS BIIRM-3 (PRN 12) , а в файле RINEX, например, G12 , я пытаюсь сравнить один и тот же спутник, например, _12/03/2017 - 12:34 _ тест, это не один и тот же спутник (PRN12 и G12) так что же такое один и тот же спутник в файлах TLE и RINEX? (или может быть мой тест неверен)
Побочный комментарий: Skyfield — это еще один пакет Python, некоторые функции которого перекрываются с pyephem. Оба поддерживаются одним и тем же человеком, но в будущем Skyfield может стать более полезным для спутников и космических полетов в Солнечной системе, поскольку он построен непосредственно на эфемеридах JPL, в то время как pyephem выполняет множество специализированных вычислений, но не использует эфемериды JPL.
Спасибо @uhoh, тестирую Skyfield , не знал, а так интересно. Пока сравниваю положение спутника по азимуту и ​​по высоте, так что обе библиотеки у меня работают, но вижу Skyfield тоже использует TLE. неправильно сравнивать файлы RINEX с файлами TLE в определенную дату?
На орбите очень много объектов и мало кто держит в голове все их названия. Чтобы повысить свои шансы на получение ответа, опубликуйте конкретные примеры того, о чем вы говорите. Я просмотрел загрузку с сайта CelesTrak и нигде не вижу «BIIRM». Что такое «Идентификатор файла TLS»? Пожалуйста, измените свой вопрос и добавьте четкие, конкретные примеры того, о чем вы говорите. Не ждите, что люди будут искать для вас ответ. На что вы смотрели до сих пор , чтобы попытаться получить ответ? Я думаю, что @VolkanOzcan, возможно, имел в виду именно это.
PRN периодически переназначаются, поэтому конкретный SV может иметь несколько разных PRN за время своего существования. Вполне возможно, что Celestrak или их поставщик данных не всегда в курсе изменений PRN.

Ответы (1)

Я думаю, что здесь происходит в основном то же самое, что обсуждается в этом вопросе , где два ответа: «они используют разные системы координат» и «они означают разные вещи под одними и теми же именами элементов». Даже если у ОП правильное вращение кадра, различия в этом масштабе меня совсем не удивляют. По одной причине, спецификации для GPS и для TLE определяют разные уравнения для моделирования краткосрочного неэллиптического поведения орбит, поэтому при детальном сравнении результатов в диапазоне времен формы кривых будут просто одинаковыми. быть немного другим.

Что уникально в этом вопросе, так это то, как идентификатор спутника (ну, псевдослучайный идентификатор последовательности шума) входит в картину. Здесь я просто догадываюсь о коде ОП, но я думаю, что это может происходить из-за того, что спутников GPS много, и все они поддерживают очень похожие орбиты. Это, вероятно, означает, что если вы неправильно обрабатываете поворот кадра и просматриваете достаточно данных, вам повезет найти несколько примеров, в которых вы систематически искали не в том месте спутник, который хотели найти, но когда вы посмотрел туда, вы действительно нашли другой спутник того же созвездия почти в том месте, где вы смотрели.