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

Все заработало, Galileo-only по 4 спутникам (SDU конечно не радует)
и Galileo+Beidou.
Можно пробовать запустить RTK, но с нормальной антенной.


% program   : RTKLIB ver.2.4.3
% inp file  : /tmp/GAL_E9.obs
% inp file  : /tmp/GAL_E9.nav
% obs start : 2016/02/18 11:13:00.0 GPST (week1884 385980.0s)
% obs end   : 2016/02/19 23:39:00.0 GPST (week1884 517140.0s)
% pos mode  : single
% elev mask : 10.0 deg
% ionos opt : broadcast
% tropo opt : saastamoinen
% ephemeris : broadcast
% navi sys  : galileo
%
% (lat/lon/height=WGS84/ellipsoidal,Q=1:fix,2:float,3:sbas,4:dgps,5:single,6:ppp,ns=# of satellites)
%  GPST                  latitude(deg) longitude(deg)  height(m)   Q  ns   sdn(m)   sde(m)   sdu(m)  sdne(m)  sdeu(m)  sdun(m) age(s)  ratio
2016/02/19 08:37:00.000   --.------121   --.------492    --.7636   5   4   4.4957   5.9851  38.3681  -4.8945 -14.9237  12.6063   0.00    0.0

Работает (технически) и в Galileo RTK:


% program   : RTKLIB ver.2.4.3
% inp file  : /tmp/GAL_E9.obs
% inp file  : /tmp/GAL_E9.nav
% inp file  : ----0500.16d
% obs start : 2016/02/18 11:13:00.0 GPST (week1884 385980.0s)
% obs end   : 2016/02/19 23:39:00.0 GPST (week1884 517140.0s)
% pos mode  : static
% freqs     : L1
% solution  : combined
% elev mask : 10.0 deg
% dynamics  : off
% tidecorr  : off
% ionos opt : broadcast
% tropo opt : saastamoinen
% ephemeris : broadcast
% navi sys  : galileo
% amb res   : continuous
% val thres : 5.0
% antenna1  :                       ( 0.0000  0.0000  0.0000)
% antenna2  : JAV_RINGANT_G3T NONE  ( 0.0000  0.0000  0.0000)

Коммерческие люди что-то в последнее время засуетились и выложили программу Kinematica.jar
https://www.advancednavigation.com.au
но у меня это чудо из “ограниченной во времени явы” не работает:


$ java -jar ~/Downloads/Kinematica.jar 
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/advancednavigation/kinemeticPostProcessor/Main : Unsupported major.minor version 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

Честно говоря достали.
Буду тоже сам писать GUI на Qt.

Запустилась, но что за файлы (.ANPP) она кушает я не знаю.

Тут https://www.advancednavigation.com.au/sites/advancednavigation.com.au/files/Spatial%20Dual%20Reference%20Manual.pdf кое-как описан

У Вас в 2.4.3b8 работает режим PPP? В 2.4.2 решается, а тут никак :frowning:

Попробовал с ‘-p 6’ и Galileo-only , тоже не работает.

Лидер испытаний u-blox8, но в советских модулях используется измерение фазы. Я плакал :sunglasses:


Преимущество отечественных модулей заключается в том, что вроссийских модулях 
ГеоС-3 и NV-08C в отличие от зарубежных, 
используется измерение фазы несущей навигационного сигнала, 
и тем самым возможно построение систем высокоточной навигации.
 
Однако, по критерию цены конкурировать с зарубежными аналогами может только ГеоС-3. 
Стоимость такого приемника для крупных партий составит 7-7,5$ 
(в отличие от NV-08C при цене 35-40 $/шт). 
 
Однако, стоит признать, что цена ГеоС-3 выше зарубежного аналога – 
лидера испытаний uBlox М8, стоимость которого 4-5 $/шт.

http://www.i-mash.ru/news/nov_otrasl/76960-izvestny-rezultaty-ispytanijj-navigacionnykh.html

В чем отличия TRK-MEAS v3 от v5 кроме шифрования?Мне удалось получить v5 ,но
rtklib не понимает v5…

В v5 нет поля mesQi (оно пустое), поэтому надо убирать проверки связанные с
U1(p+1):


        if (U1(p+1)<4||ubx_sys(U1(p+4))!=SYS_GPS) continue;
...
        /* quality indicator (0:idle,1:search,2:aquired,3:unusable, */
        /*                    4:code lock,5,6,7:code/carrier lock) */
        qi=U1(p+1);
        if (qi<4||7<qi) continue;


Шифрование пока не проблема, интересно будет, когда в Q2 появятся модули
с ROM 3.01

Добавил к rtklib поддержку файлов геоида в форматах Leica GEM, Javad BIN и Trimble GGF,
но пока не до конца протестировал. Думаю что текстовый формат
Carlson GSF добавлять не стоит,
так это будет работать слишком медленно, либо придется в opengeoid()
положить его в буфер в памяти. Для маленьких файлов это нормально,
для больших и для тех девайсов, где мало RAM не очень.

Каких только “неконвенциональных” академиев не бывает


Для этого использовалась методика точного дифференциального позиционирования (ТДП), 
имеющая также англоязычное название «Precise Point Positioning» (PPP). 
Обработка велась в модуле GrafNav версии 8.3 программного комплекса
Waypoint GPS компании NovAtel (Канада).

UNCONVENTIONAL APPROACH TO THE ISSUE OF THE COORDINATES OF
GEODETIC POINTS UPDATING IN THE GLOBAL GEOCENTRIC REFERENCE
SYSTEM
Andrey V. Voitenko
Siberian Automobile and Highway Academy, 644080, Russia, Omsk, 5 Prospekt Mira, Ph. D. in
Engineering (Russian Scientific Degree "Candidate of Technical Sciences"), 
Head of the Department of Geodesy

Я написал патч к ublox.c который получает полностью все сырые данные только из
нешифрованного/дешифрованного пакета SEC-0 (0x2700, contains TRK-MEAS(v5) и TRK-SFRBX),
никаких других сообщений не надо.

Что-то я по-облизывался на всякие галилео и бедоу и тоже заказал ublox-8, благо рубль чуток подорожал :slight_smile:
Вот только из последних сообщения не понял я, победили вы защиту или нет. И другая проблема - обновить мобильное приложение gpslib+

Для M8N (и совместимых вроде Navilock) она легко отключается,
а устройств с ROM 3.01+ пока нет, как появятся, будем думать :sunglasses:

В конце концов протестировал работу с Leica GEM, Javad BIN и Carlson GSF,
на моих тестовых файлах проблем нет.

А где используется геоидная высота?

Если не лезть в детали, то на всех топографических картах и в OSM tag .

.conf файл нарушает общепринятую терминологию
(без геоида=geodetic, с геоидом=orthometric, с квазигеоидом=normal)
и запутывает дело:


out-height         =geodetic   # (0:ellipsoidal,1:geodetic)
out-geoid          =internal   # (0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000)
file-geoidfile     =

Правильнее было бы написать


out-height         =1   # 0:ellipsoidal(geodetic), 1:orthometric or normal (using geoid or quasigeoid file)
...

Я также сильно сомневаюсь в целесообразости наличия ‘internal’ для mode != SINGLE.

2usm78-gis А где-то собраны всё патчи чтобы получить всех благ с ublox8? А то читаю и вижу, получилось то, удалось это, а как конкретно нету.

  1. Т.е. как начать получать сырые данные с бедоу, галлилео, и т.д.
  2. Упоминались ещё патчи для конвертера в ринекс, чтобы эти сырые данные понимать.

бейдоу работает на прошивке 2.01 без вопросов, вроде как даже и лучше
чем на 3.01 (больше экспериментальных спутников видно), но к интерпретации измеренных данных
есть вопросы. Вы восточнее, будете видеть больше чем я, так что пришите сюда
о результатах.
Для галилео необходимо перешивать на 3.01.
M8T при этом выдает сразу RXM-RAWX, а вот с M8N все несколько сложнее:
RXM-RAWX не работает, а TRK-MEAS(v5) зашифрован и упакован в пакет SEC-0.
В идеальном варианте надо разобраться с алгоритмом шифрования и
написать патч для rtklib. Дело это такое сомнительное, и видимо
кто-нибудь напишет со временем что-то вроде libdvdcss.so с *decipher_sec0(raw_t raw),
я подставляться не буду.
Хороший рабочий вариант на сегодня - заменить в прошивке 3 байта (+контрольную сумму),
что позволяет иметь нешифрованный SEC-0 на выходе.

Я несколько перестарался и отредактировал decode_trkmeas() до нерабочего состояния,
проверяя работу с произвольной CFG-RATE, но могу попытаться сделать минимальный патч.
Вообще мне не нравится модель развития rtklib, когда автор совершенно некооперативен
и просто игнорирует все патчи “со стороны”, сам при этом не имея никакого серьезного
плана развития.
При этом он сменил лицензию с GPLv3 на BSD, и у меня честно говоря нет никакого желания
исправляя ошибки и добавляя профессиональный функционал
помогать торгашам потирающим ладони по дороге в банк (таково же как и мое отношение
к public domain в OSM).
Для того чтобы создать серьезный форк, надо иметь killer app. Таковым я считаю
rtknavi+rtkplot на qt, как напишу, так будет и не стыдно создать репозиторий на github.

Edit
Патч выглядит примерно так:


+/* demux sec-0 -------------------------------*/
+static int demux_sec_0(raw_t *raw)
+{
+ trace(2,"demux_sec_0: ver=%d pkt=%2.2x dttag=%d\n",U1(raw->buff+6),U1(raw->buff+6+7),raw->dttag);
+
+ if (U1(raw->buff+6) != 2 )
+  return 0; /* unknown version */
+
+ if (U1(raw->buff+6+4) != UBXSYNC1 || U1(raw->buff+6+5) != UBXSYNC2)
+ {
+  return 0; /* encrypted packet */
+ }
+
+ if (U1(raw->buff+6+7) == 0x10)
+  return decode_trkmeas2(raw,10);
+ if (U1(raw->buff+6+7) == 0x0f)
+  return decode_trksfrbx2(raw,10);
+
+ return 0; /* ??? */
+}
 /* decode ublox raw message --------------------------------------------------*/
 static int decode_ubx(raw_t *raw)
 {
@@ -907,10 +1335,13 @@
         case ID_RXMRAW  : return decode_rxmraw  (raw);
         case ID_RXMRAWX : return decode_rxmrawx (raw);
         case ID_RXMSFRB : return decode_rxmsfrb (raw);
+        case ID_TRKSFRB : return decode_trksfrb (raw);
         case ID_RXMSFRBX: return decode_rxmsfrbx(raw);
         case ID_NAVSOL  : return decode_navsol  (raw);
         case ID_NAVTIME : return decode_navtime (raw);
-        case ID_TRKMEAS : return decode_trkmeas (raw);
+        case ID_TRKMEAS : return decode_trkmeas2(raw,0);
+        case ID_SEC_0   : return demux_sec_0    (raw);
+        case ID_CFG_RATE: return decode_cfg_rate(raw);
         case ID_TRKD5   : return decode_trkd5   (raw);
         case ID_TRKSFRBX: return decode_trksfrbx(raw);
     }