В этой статье разберем, как релятивистские поправки влияют на точность определения координат по GPS‑спутникам. Для наших тестов будем использовать симулятор сигнала спутников gps‑sdr‑sim и утилиту gnss‑sdr для геолокации.
Устанавливаем утилиту gnss‑sdr:
sudo apt install gnss-sdr
Скачиваем и собираем gps‑sdr‑sim:
git clone https://github.com/osqzss/gps-sdr-sim.gitcd gps-sdr-simgcc gpssim.c -lm -O3 -o gps-sdr-sim
В исходном коде файла gpssim.h — никаких релятивистских поправок нет. Теперь посмотрим файл gpssim.c, здесь находим поправку (строка 434):
relativistic = -4.442807633E-10*eph.ecc*eph.sqrta*sek;
далее эта поправка добавляется к часам спутника:
clk[0] = eph.af0 + tk*(eph.af1 + tk*eph.af2) + relativistic - eph.tgd;
Чтобы собрать «нерелятивистский» симулятор, достаточно обнулить эту поправку и пересобрать gps‑sdr‑sim:
sed-i "434s|.*|\trelativistic =0;// -4.442807633E-10*eph.ecc*eph.sqrta*sek;|"gcc gpssim.c -lm -O3 -o gps-sdr-sim-no-rel
Теперь можно записать файлы с моделью сигналов, которые бы принял GPS‑ приемник. Координаты приемника задаются через параметр ‑l. Для запуска симулятора нужен файл эфимерид (он содержит параметры орбиты и поправки часов спутников). Файл эфимерид можно скачать с официального сайта НАСА, или использовать файл brdc0010.22n из архива gps‑sdr‑sim:
./gps-sdr-sim -e brdc2580.26n -l 56.46958800001232,84.94677100122212 -o gpssim_true.iq -s 2500000 -d 1800 -b 8./gps-sdr-sim-no-rel -e brdc2580.26n -l 56.46958800001232,84.94677100122212 -o gpssim_norel.iq -s 2500000 -d 1800 -b 8
Для работы с gnss‑sdr будем использовать конфигурационные файлы. Создаем файл «gps_analyze_true.conf» и копируем туда настройки:
[GNSS-SDR];######### GLOBAL OPTIONS ##################GNSS-SDR.internal_fs_sps=2500000;######### SIGNAL_SOURCE CONFIG ############SignalSource.implementation=File_Signal_Source# Укажите путь к вашему .bin файлуSignalSource.filename=gpssim_true.iq# Тип данных ishort означает знаковые 8-битные целые (int8)SignalSource.item_type=ibyte# Укажите реальную частоту дискретизации вашего файла SignalSource.sampling_frequency=2500000SignalSource.samples=0;######### SIGNAL_CONDITIONER CONFIG ############SignalConditioner.implementation=Signal_Conditioner# Преобразование чередующихся int8 (I и Q) в комплексный формат floatDataTypeAdapter.implementation=Ibyte_To_ComplexInputFilter.implementation=Pass_ThroughInputFilter.item_type=gr_complex;######### CHANNELS GLOBAL CONFIG ############Channels_1C.count=8Channels.in_acquisition=8Channel.signal=1C;######### ACQUISITION GLOBAL CONFIG ############Acquisition_1C.implementation=GPS_L1_CA_PCPS_AcquisitionAcquisition_1C.item_type=gr_complexAcquisition_1C.pfa=0.01# Диапазон поиска Доплера увеличен до +-10000 Гц на случай сильного сдвига частотыAcquisition_1C.doppler_max=10000Acquisition_1C.doppler_step=250Acquisition_1C.blocking=true;######### TRACKING GLOBAL CONFIG ############Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_TrackingTracking_1C.item_type=gr_complex# Полоса PLL (фаза) — 40 Гц, полоса DLL (код) — 4 Гц для стабильного удержанияTracking_1C.pll_bw_hz=40.0Tracking_1C.dll_bw_hz=4.0Tracking_1C.dump=false# Путь, куда будут сохраняться файлы (папка должна существовать);######### TELEMETRY DECODER GPS CONFIG ############TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder;######### OBSERVABLES CONFIG ############Observables.implementation=Hybrid_Observables;######### PVT CONFIG ############PVT.enable_monitor=truePVT.monitor_client_addresses=127.0.0.1PVT.monitor_udp_port=1111PVT.implementation=RTKLIB_PVTPVT.positioning_mode=SinglePVT.output_rate_ms=100PVT.display_rate_ms=500PVT.iono_model=BroadcastPVT.trop_model=SaastamoinenPVT.flag_rtcm_server=truePVT.flag_rtcm_tty_port=falsePVT.rtcm_dump_devname=/dev/pts/1PVT.rtcm_tcp_port=2101PVT.rtcm_MT1019_rate_ms=5000PVT.rtcm_MT1077_rate_ms=1000Monitor.enable_monitor=trueMonitor.decimation_factor=1Monitor.client_addresses=127.0.0.1Monitor.udp_port=1112GNSS-SDR.telecommand_enabled=trueGNSS-SDR.telecommand_tcp_port=3333
Создаем файл «gps_analyze_norel.conf», копируем те же настройки, изменив имя файла на gpssim_norel.iq(10 строка).
Запускаем утилиту gnss‑sdr:
gnss-sdr --config_file='gps_analyze_true.conf'gnss-sdr --config_file='gps_analyze_norel.conf'
Координаты записываются в форматах.kml,.gpx и.geojson с частотой обновления 10 Гц (каждые 0,1 с). На рисунке представлены результаты сравнения двух симуляторов за период 30 минут.
Как видно из сравнения, отсутствие релятивистских поправок в симуляторе приводит к ошибке геолокации: облако точек смещается на несколько метров относительно эталонной позиции.
Теперь попробуем разобраться с физическим смыслом релятивистской поправки. В работе Нила Ашби «Relativity in the Global Positioning System» (2003) приводится полное выражение для относительного сдвига частоты:
-
— скорость спутника в инерциальной системе отсчета (ECI), м/с;
-
— расстояние от центра Земли до спутника, м;
-
м
/с
— гравитационный параметр Земли;
-
Дж/кг — гравитационный потенциал на геоиде;
-
м/с — скорость света.
Исключая расстояние через уравнение живой силы
— большая полуось орбиты, преобразуем исходное выражение:
Постоянная часть сдвига:
Переменная:
— средняя скорость спутника.
Таким образом, можно рассматривать как эффект Доплера второго порядка
Получить поправку relativistic =, где
-
— эксцентриситет орбиты;
-
— эксцентрическая аномалия,угол, который определяет текущее положение спутника на орбите.
можно путем интегрированияс момента времени
, когда спутник находится в
апогее орбиты. Как видно из определения, поправка relativistic периодична (период соответствует обороту спутника вокруг орбиты) и имеет нулевое среднее.
Постоянная часть сдвига в симуляторе gps‑sdr‑sim не учитывается, так как
считается, что она уже скомпенсирована настройкой часов спутника. Именно
принято «обвинять» в накоплении ошибок по 10 км в день.
Литература
-
Ashby, N. (2003). Relativity in the Global Positioning System. Living Reviews in Relativity, 6(1), 1. https://doi.org/10.12942/lrr-2003-1
ссылка на оригинал статьи https://habr.com/ru/articles/1089582/