RTKlib/постпроцессинг

Буду очень Вам благодарен если Вы сбросите этот файл с модификацией под СДКМ мне на e-mail :slight_smile:
Именно sbas.c с той же целью я сейчас ковыряю.

К сожалению, выслать ничего не могу. Могу объяснить, по мере возможности, что и где в RTKLIB дописать/подправить для соответствия ИКД СДКМ/DO-229.

Спасибо, извиняюсь за задержку с ответом :slight_smile:
Пытался сам выяснить что к чему и где основные глюки.
Самый главный глюк в RTKLIB это использование sbs->lcorr.iode в satpos_sbas,
для GPS это правильно.
Однако IODE от SDCM для GLONASS всегда бывает или 0 (типа не получили) или 252 :
1 satpos_sbas : time=2020/07/29 08:01:09.725 sat=35 iode= 0
1 satpos_sbas : time=2020/07/29 08:01:09.728 sat=36 iode= 0
1 satpos_sbas : time=2020/07/29 08:01:09.721 sat=37 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.727 sat=41 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.732 sat=42 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.726 sat=43 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.730 sat=51 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.735 sat=52 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.722 sat=53 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.925 sat=35 iode=252
1 satpos_sbas : time=2020/07/29 08:01:09.928 sat=36 iode=252

естественно от 0 или 252
if (!ephpos(time,teph,sat,nav,sbs->lcorr.iode,rs,dts,var,svh)) return 0;
всегда заканчивает return 0 т.е. режим SBAS для GLONASS не реализован.

Что необходимо использовать вместо 252, -1 или ?

Посмотрите страницу 41 в ИКД СДКМ, там приведён алгоритм. 252 это два под-поля (время действия и время запаздывания). Также для работы с поправками SBAS вам необходимо хранить текущие и предыдущие эфемериды для каждого НКА. При передачи спутниками новых эфемерид, системы SBAS продолжают использовать старые эфемериды для определения долгосрочных и быстрых поправок от 2 до 4 мин.

да смотрел я её много раз, алгоритма не увидел :roll_eyes:
Со спутников все время идет неизменно 252, т.е. два под-поля,
“время действия” ВСЕГДА максимально 960c и “время запаздывания” ВСЕГДА 0.
Специально посмотрел логи длиной более 3-х часов.

Как использовать константу 252 непонятно, вернее понятно что если отлична от нуля то идут данные и больше ничего :confused:


static int useglosbas(const int sat, const int iode, const sbssat_t *sbs, const geph_t* eph) {
   const sbssatp_t *p=NULL;
   for (p=sbs->sat; p<sbs->sat+sbs->nsat; p++) {
      if (p->sat!=sat || p->lcorr.t0.time==0) 
         continue;
      const int L=30*(iode&0x7);
      const int V=60*(iode>>3);
      return (p->lcorr.t0.time-L-V<=eph->tof.time && eph->tof.time<=p->lcorr.t0.time-L);
   } 
   return 0;
}

static geph_t *selgeph(gtime_t time, int sat, int iode, const nav_t *nav) {
...
   if (iode>=0 && !useglosbas(sat, iode, &nav->sbssat, &nav->geph[i])) 
       continue;
...
}

к сожалению поскольку iode всегда 252 то будет вечное continue

за useglosbas спасибо, возможно пригодится :slight_smile:

похоже есть еще большой глюк в sbsfastcorr …

Ошибаетесь, вечного continue не будет :). continue будет если iode больше нуля (т.е. для данного спутника есть поправки к эфемеридам) и useglosbas вернёт 0 (т.е. не найдены эфемериды, к которым можно применить поправки).

поскольку
1 selgeph : time=2020/07/29 09:00:33.195 sat=43 iode=-1 useglosbas= 0 i=10 iode_i=49 sat_i=43
1 selgeph : time=2020/07/29 09:00:33.195 sat=43 iode=-1 useglosbas= 0 i=37 iode_i=47 sat_i=43
1 selgeph : time=2020/07/29 09:00:33.195 sat=43 iode=252 useglosbas= 0 i=10 iode_i=49 sat_i=43
1 selgeph : time=2020/07/29 09:00:33.195 sat=43 iode=252 useglosbas= 1 i=37 iode_i=47 sat_i=43
1 selgeph : time=2020/07/29 09:00:33.195 sat=44 iode=-1 useglosbas= 0 i=11 iode_i=49 sat_i=44
1 selgeph : time=2020/07/29 09:00:33.195 sat=44 iode=-1 useglosbas= 0 i=38 iode_i=47 sat_i=44
1 selgeph : time=2020/07/29 09:00:33.195 sat=44 iode=252 useglosbas= 0 i=11 iode_i=49 sat_i=44
1 selgeph : time=2020/07/29 09:00:33.195 sat=44 iode=252 useglosbas= 1 i=38 iode_i=47 sat_i=44
1 selgeph : time=2020/07/29 09:00:33.195 sat=51 iode=-1 useglosbas= 0 i=18 iode_i=49 sat_i=51
1 selgeph : time=2020/07/29 09:00:33.195 sat=51 iode=-1 useglosbas= 0 i=45 iode_i=47 sat_i=51
1 selgeph : time=2020/07/29 09:00:33.195 sat=51 iode=252 useglosbas= 0 i=18 iode_i=49 sat_i=51
1 selgeph : time=2020/07/29 09:00:33.195 sat=51 iode=252 useglosbas= 1 i=45 iode_i=47 sat_i=51
1 selgeph : time=2020/07/29 09:00:33.195 sat=52 iode=-1 useglosbas= 0 i=19 iode_i=49 sat_i=52
1 selgeph : time=2020/07/29 09:00:33.195 sat=52 iode=-1 useglosbas= 0 i=46 iode_i=47 sat_i=52
1 selgeph : time=2020/07/29 09:00:33.195 sat=52 iode=252 useglosbas= 0 i=19 iode_i=49 sat_i=52
1 selgeph : time=2020/07/29 09:00:33.195 sat=52 iode=252 useglosbas= 1 i=46 iode_i=47 sat_i=52
1 selgeph : time=2020/07/29 09:00:33.195 sat=53 iode=-1 useglosbas= 0 i=20 iode_i=49 sat_i=53
1 selgeph : time=2020/07/29 09:00:33.195 sat=53 iode=-1 useglosbas= 0 i=47 iode_i=47 sat_i=53
1 selgeph : time=2020/07/29 09:00:33.195 sat=53 iode=252 useglosbas= 0 i=20 iode_i=49 sat_i=53
1 selgeph : time=2020/07/29 09:00:33.195 sat=53 iode=252 useglosbas= 1 i=47 iode_i=47 sat_i=53

а в тексте имеется

if (iode>=0 && nav->geph[i].iode != iode) continue;

то вечное continue гарантировано :slight_smile:

если убрать в общем то лишённую смысла эту строчку (непонятно зачем её вообще вставили)
то вечного continue нет и useglosbas работает :smiley:
За что отдельное спасибо ! :slight_smile:

Отлично :slight_smile: Если будет возможность, покажите, пожалуйста, какая в итоге у вас будет точность местоопределения.

diff в итоге какой?

самому интересно какая в итоге будет точность :smiley:
пока ничего особо интересного, по GLONASS поиски очередных глюков RTKLIB,
ибо SDCM c GLONASS у меня фактически не работает :frowning:
вернее работает если закомментировать (убрать) в sbas.c

		*var=varfcorr(p->fcorr.udre)+degfcorr(p->fcorr.ai)*t*t/2.0;

но это же неправильно :slight_smile:

SDCM c GPS работает без проблем, спутники от 5 градусов:
GPS без SDCM

GPS с тропо и ионо от SDCM

GPS с полной коррекцией от SDCM

до этого еще надо дойти :smiley:

Взял ваш лог PRN125+PRN140+GPS+GLONASS и посчитал в своей версии RTKLIB. Вот результаты:
GPS+СДКМ

ГЛОНАСС+СДКМ

Ну и на выходе значения ICB/cIFB по литере:
-1 0.42
0 2.32
1 0.57
2 1.89
4 2.66
6 3.98

на https://github.com/ более 160 версий RTKLIB :slight_smile: этой, насколько понимаю, там нет :frowning:

красивая картинка после сглаживания :smiley:
мне больше нравится без сглаживания, эталоном служит картинка того что умеет этот приемник от моего GPS симулятора

нормальная картинка, правда сдвинута на юг на 0.5 … 0.7 метра

Это самое чудесное в этой версии :slight_smile:
Без этого про ГЛОНАСС можно забыть.
но даже с этим и сдвигом 0.5 … 0.7 м тоже можно забыть :expressionless:

Сейчас планово увеличил скорость солнечный ветер и ГЛОНАСС
унесло за 2 часа наблюдений на ~ 20 метров

Увы :frowning:

Да, кодовые измерения были сглажены фазовыми (т.е. уменьшен шум кодовых измерений и эффект многопутности). В результате мы видим более-менее реальную точность СДКМ. А так из-за кодовых шумов был бы круг с радиусом 1-1.5м.

В идеальных условиях выглядит красиво :), но на практике шумы в несколько раз выше.

Тут надо разбираться. В том файле, что вы предоставили, некоторые измерения псевдодальностей ГЛОНАСС явно были аномальными. Есть предположение, что этот приёмник некорректно работает с ГЛОНАСС + непонятно, что там с фазовым центром антенны. Во всяком случае, это смещение никак не связано с поправками СДКМ. На тех приёмниках, что есть в моём распоряжении, точность ГЛОНАСС+СДКМ ничем не хуже точности GPS+СДКМ.

Скорее всего это просто некорректная работа вашего приёмника и солнечный ветер тут не причём.

в логе https://github.com/IvanKor/Accuracy-GNSS/blob/master/tt8_125_140_com9.ubx
используется больше спутников


1 rxmrawx: -7  10 0.000000
1 rxmrawx: -6  26 0.000000
1 rxmrawx: -4   6 0.000000
1 rxmrawx: -2  13 0.000000
1 rxmrawx: -1  12 0.420000
1 rxmrawx:  0  11 2.320000
1 rxmrawx:  1   5 0.570000
1 rxmrawx:  2  20 1.890000
1 rxmrawx:  3  19 0.000000
1 rxmrawx:  4  21 2.660000
1 rxmrawx:  6   4 3.980000

приведенных значений совершенно недостаточно для коррекции, дайте пожалуйста остальные значения :slight_smile:

и если возможно полные значения ICB/cIFB по литере для лога
https://github.com/IvanKor/Accuracy-GNSS/blob/master/tt8_gal_125_136_140_com9.ubx
который снят во время солнечного ветра.

какие именно были аномальными ?

Про фазовый центр антенны имеет смысл говорить когда зайдет речь о невязках меньше 0.2 метра :confused:
Поскольку используется широкополосная полногабаритная антенна то в отличие от керамических (укороченных) этот параметр у антенны лучше не бывает :smiley:


-7  -8,8906
-4  -7,9115
-2  -5,0944
 0   2,3176
 1   0,5421
 2   2,7396
 3   3,8922
 4   5,1772
 5   3,3453
 6   3,1348


Похоже, смещение в 20 метров возникает из-за сильного разброса ICB, а не из-за солнечного ветра. Но центр ГЛОНАСС и GPS сильно смещен. Почему так непонятно, может все дело в антенне.

GPS+СДКМ

ГЛОНАСС+СДКМ

Спасибо ! :slight_smile:
для ясности, если возможно, дайте значения ICB/cIFB по всем спутникам для этого лога
https://github.com/IvanKor/Accuracy-GNSS/blob/master/tt8_125_140_com9.ubx

это когда солн. ветра нет а оборудование полностью идентичное.

в обоих случаях снималось с заводской калибровкой см. таблицу Pseudo-range correction table
которая выполнялась при помощи симулятора.