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

-1

-1

-1

-1

usm78-gis
Чип uBlox-6010 на что-то годен ? Написано что флеша у него нет.
Заказал USB-мышку на этом чипе, из wiki подумал что все ublox-6 так или иначе поддерживают сырые данные через ваши магические строки инициализаций. Чувствую раньше надо было спрашивать…
PS: приемник ещё в пути.

-1

-1

TRK-MEAS preliminary patch (the half-cycle carrier phase ambiguity (p2p=0.5) may stay unresolved, because it is not known which status flags are responsible for p2p):


diff -u -r rtklib_2.4.2b11/src/rcv/ublox.c /tmp/rtklib_2.4.2b11/src/rcv/ublox.c
--- rtklib_2.4.2b11/src/rcv/ublox.c	2014-06-20 21:10:28.000000000 +0400
+++ /tmp/rtklib_2.4.2b11/src/rcv/ublox.c	2013-02-28 23:56:38.000000000 +0300
@@ -22,33 +22,12 @@
 *-----------------------------------------------------------------------------*/
 #include "rtklib.h"
 
-#include <stdint.h>
-
 #define UBXSYNC1    0xB5        /* ubx message sync code 1 */
 #define UBXSYNC2    0x62        /* ubx message sync code 2 */
 #define UBXCFG      0x06        /* ubx message cfg-??? */
 
 #define ID_RXMRAW   0x0210      /* ubx message id: raw measurement data */
 #define ID_RXMSFRB  0x0211      /* ubx message id: subframe buffer */
-#define ID_RXMRAWX  0x0215      /* ubx message id: raw measurement data */
-
-#define ID_NAVTIME  0x0120      /* ubx message id: nav gps time */
-#define ID_NAVCLOCK 0x0122      /* ubx message id: nav gps clock */
-
-#define ID_TRKSFRB  0x0302      /* ubx message id: subframe buffer */
-#define ID_TRKTRKD2 0x0306      /* ubx message id: raw tracker data */
-#define ID_TRKTRKD5 0x030a      /* ubx message id: raw tracker data */
-#define ID_TRKSFRBX 0x030f      /* ubx message id: subframe buffer */
-#define ID_TRKMEAS  0x0310      /* ubx message id: raw tracker data */
-
-#define getb(off)	(raw->buff[6+off])
-#define getw(off)	((short)((getb(off) << 8) | getb(off+1)))
-#define getw_le(off)	((short)((getb(off+1) << 8) | getb(off)))
-#define getl(off)	((int)((getw(off) << 16) | (getw(off+2) & 0xffff)))
-#define getl_le(off)	((int)((getw_le(off+2) << 16) | (getw_le(off) & 0xffff)))
-#define getq(off)	((u_int64_t)(((u_int64_t)getl(off) << 32) | (getl(off+4) & 0xffffffff)))
-#define getq_le(off)	((int64_t)(((int64_t)getl_le(off+4) << 32) | (getl_le(off) & 0xffffffff)))
-
 #define FU1         1           /* ubx message field types */
 #define FU2         2
 #define FU4         3
@@ -101,192 +80,6 @@
     buff[len-2]=cka;
     buff[len-1]=ckb;
 }
-/* decode ublox nav-timegps:  --------------------------------*/
-static int decode_navtime(raw_t *raw)
-{
-        if (getb(11) >= 3) /* valid =7 */
-        {
-         raw->nav_itow=getl_le(0);
-         raw->nav_ftow=getl_le(4);
-         raw->nav_week=getw_le(8);
-         raw->nav_valid=1;
-        }
-        else
-         raw->nav_valid=0;
-
- return 0;
-}
-
-#define P2_8        0.00390625            /* 2^-8 */
-#define P2_10       0.000976562500000     /* 2^-10 */
-
-/* decode ublox trk-meas: raw tracker data --------------------------------*/
-static int decode_trkmeas(raw_t *raw)
-{
- int i, off, pnum;
-
-        pnum=0;
-	for (i = 0; i < getb(2); i++) {
-	    int sv;
-	    int gnss, sys;
-	    int plock;
-	    int g2g=0;
-        int plocked;
-        double p2p;
-	    
-            p2p=0.0;
-/* ubloxM8 only */
-	       sys=SYS_GPS;
-
-            switch (getb(0))
-            {
-             case 2:
-
-	     off = 104 + 56 * i;
-	     plocked = 0x1;
-	     gnss = getb(off+4);
-
-	     switch(gnss)
-	     {
-	      case 0: /* gps */
-	       sys=SYS_GPS;
-	      break;
-	      case 1: /* sbas */
-	       sys=SYS_SBS;
-	      break;
-	      case 2: /* galileo */
-	       sys=SYS_GAL;
-	      break;
-	      case 3: /* bds */
-	       sys=SYS_CMP;
-	          g2g=-14;
-	      break;
-	      case 6: /* glo */
-	       sys=SYS_GLO;
-	          g2g=10800-16;
-	      break;
-	      default:
-	       sys=SYS_GPS;
-	      break;
-	     }
-	     sv = getb(off+5);
-	     
-             break;
-             default: /* UNKNOWN */
-              return 0;
-             break;
-            }
-
-	    plock = getb(off+50); /* =1 */
-	    if ( plock != plocked ) 
-	    {
-	     continue;
-	    }
-	    
-	    raw->trk_raw_obs[pnum].codep=((double)getq_le(off+24))*P2_32-g2g*1000; /* DEBUG */
-	    raw->trk_raw_obs[pnum].L1=((double)getq_le(off+32))*P2_32-p2p;
-	    raw->trk_raw_obs[pnum].D1=((float)getl_le(off+40))*P2_10*10.;
-	    raw->trk_raw_obs[pnum].plockt=getw_le(off+50);
-	    raw->trk_raw_obs[pnum].mesqi=getb(off+1);
-	    raw->trk_raw_obs[pnum].cno=getw_le(off+20);
-	    raw->trk_raw_obs[pnum].sat=satno(sys,sv);
-	    raw->trk_raw_obs[pnum].bits=((getb(off+52))<<24)+((getb(off+53))<<16)+((getb(off+54))<<8)+getb(off+55);
-
-	    pnum++;
-	}
-	raw->rnx_nchan=pnum;
-
- return 0;
-}
-
-/* decode ublox nav-clock:  makeraw --------------------------------*/
-static int decode_makeraw(raw_t *raw)
-{
- int i, j, n, sat;
- int nav_bias, nav_drift, nav_1ms;
- gtime_t time;
-
-        nav_bias=getl_le(4);
-        nav_drift=getl_le(8);
-        
-        if (nav_drift > 0)
-        {
-         int x;
-         x=raw->nav_ftow+nav_bias;
-         nav_1ms=(x >  500000)?1:0;
-        }
-        else
-        {
-         int x;
-         x=raw->nav_ftow+nav_bias;
-         nav_1ms=(x > -500000)?0:-1;
-        }
-
-        time=gpst2time(raw->nav_week,(raw->nav_itow+nav_1ms)*0.001);
-
-        if (raw->nav_valid == 1) /* valid */
-        {
-         n=0;
-         for ( i=0; i < raw->rnx_nchan ; i++)
-         {
-
-        sat                    =raw->trk_raw_obs[i].sat;
-        raw->obs.data[n].time  =time;
-        raw->obs.data[n].L[0]  =raw->trk_raw_obs[i].L1;
-        raw->obs.data[n].P[0]  :(raw->nav_itow+nav_1ms-raw->trk_raw_obs[i].codep)/1000.*CLIGHT;
-        raw->obs.data[n].D[0]  =raw->trk_raw_obs[i].D1;
-
-        raw->obs.data[n].SNR[0]=(int)floor(raw->trk_raw_obs[i].cno*P2_8*4);
-        raw->obs.data[n].LLI[0]=raw->trk_raw_obs[i].plockt>100?1:0;
-        raw->obs.data[n].code[0]=CODE_L1C;
-
-        raw->obs.data[n].sat=sat;
-        
-        raw->lockt[sat-1][0]=raw->trk_raw_obs[i].plockt;
-        
-        for (j=1;j<NFREQ;j++) {
-            raw->obs.data[n].L[j]=raw->obs.data[n].P[j]=0.0;
-            raw->obs.data[n].D[j]=0.0;
-            raw->obs.data[n].SNR[j]=raw->obs.data[n].LLI[j]=0;
-            raw->obs.data[n].code[j]=CODE_NONE;
-        }
-        n++;
-
-         }
-         raw->nav_valid=0;
-#if PRODUCTION
-         raw->rnx_nchan=0;
-#endif
-    raw->time=time;
-    raw->obs.n=n;
-
-        }
- 
- return 1;
-}
-
 /* decode ublox rxm-raw: raw measurement data --------------------------------*/
 static int decode_rxmraw(raw_t *raw)
 {
@@ -462,10 +255,6 @@
     switch (type) {
         case ID_RXMRAW : return decode_rxmraw(raw);
         case ID_RXMSFRB: return decode_rxmsfrb(raw);
-
-        case ID_NAVTIME: return decode_navtime(raw);
-        case ID_NAVCLOCK:return decode_makeraw(raw);
-        case ID_TRKMEAS: return decode_trkmeas(raw);
     }
     return 0;
 }
diff -u -r rtklib_2.4.2b11/src/rtklib.h /tmp/rtklib_2.4.2b11/src/rtklib.h
--- rtklib_2.4.2b11/src/rtklib.h	2014-06-20 20:40:24.000000000 +0400
+++ /tmp/rtklib_2.4.2b11/src/rtklib.h	2013-02-28 21:52:08.000000000 +0300
@@ -1084,63 +1084,6 @@
     prcopt_t opt;       /* processing options */
 } rtk_t;
 
-/* quick u-blox hack */
-typedef struct
-{
- unsigned char sat;
-          double L1;
-          double codep;
-          float D1;
-          char mesqi;
- unsigned short plockt;
-          short cno; 
- unsigned int bits;
-} trk_raw_obs_t;
-
-typedef struct
-{
-    char sv;
-    char fn;
-    unsigned int ttag;
-    unsigned int flags;
-    double x;
-    double y;
-    double z;
-    double xdot;
-    double ydot;
-    double zdot;
-    double xdotdot;
-    double ydotdot;
-    double zdotdot;
-    char tk_s;
-    char tk_m;
-    char tk_h;
-    char P1;
-    short tb;
-    char P2;
-    char Bn;
-    double gamn;
-    char M;
-    char sv2;
-    short Nt;
-    char Ft;
-    char En;
-    double taun;
-    double dtaun;
-    double tauGPS;
-    char N4;
-    double tauc;
-    short NA;
-    
-    unsigned short frame;
-    unsigned char subframe;
-    unsigned char m;
-    int status;
-    
-} geph_raw_t;
-
 typedef struct {        /* receiver raw data control type */
     gtime_t time;       /* message time */
     gtime_t tobs;       /* observation data time */
@@ -1167,11 +1110,6 @@
     int outtype;        /* output message type */
     unsigned char buff[MAXRAWLEN]; /* message buffer */
     char opt[256];      /* receiver dependent options */
-    /* u-blox hack */
-    geph_raw_t geph_raw[MAXPRNGLO];
-    trk_raw_obs_t trk_raw_obs[MAXOBS];
-    int rnx_nchan, nav_week, nav_itow, nav_ftow, nav_valid;
-
 } raw_t;
 
 typedef struct {        /* stream type */
@@ -1719,7 +1657,6 @@
 extern int lexioncorr(gtime_t time, const nav_t *nav, const double *pos,
                       const double *azel, double *delay, double *var);
 
-
 #ifdef __cplusplus
 }
 #endif
diff -u -r rtklib_2.4.2b11/src/solution.c /tmp/rtklib_2.4.2b11/src/solution.c
--- rtklib_2.4.2b11/src/solution.c	2014-01-19 13:20:08.000000000 +0400
+++ /tmp/rtklib_2.4.2b11/src/solution.c	2013-02-28 21:52:58.000000000 +0300
@@ -1291,7 +1291,7 @@
         p+=sprintf(p,"%s dynamics  : %s\n",COMMENTH,opt->dynamics?"on":"off");
         p+=sprintf(p,"%s tidecorr  : %s\n",COMMENTH,opt->tidecorr?"on":"off");
     }
-    if (opt->mode<=PMODE_PPP_FIXED) {
+    if (opt->mode<=PMODE_FIXED) {
         p+=sprintf(p,"%s ionos opt : %s\n",COMMENTH,s4[opt->ionoopt]);
     }
     p+=sprintf(p,"%s tropo opt : %s\n",COMMENTH,s5[opt->tropopt]);


Edit: fixed the SBAS code bug, now RINEX 3.02 output looks as follows


$ ./convbin -v 3.02 -f 1 -r ubx -od -os /dev/ttyACM1 -d /tmp

     3.02           OBSERVATION DATA    M: Mixed            RINEX VERSION / TYPE
CONVBIN 2.4.2 b11                       20140620 220058 UTC PGM / RUN BY / DATE
log: /dev/ttyACM1                                           COMMENT
format: u-blox                                              COMMENT
                                                            MARKER NAME
                                                            MARKER NUMBER
                                                            MARKER TYPE
                                                            OBSERVER / AGENCY
                                                            REC # / TYPE / VERS
                                                            ANT # / TYPE
        0.0000        0.0000        0.0000                  APPROX POSITION XYZ
        0.0000        0.0000        0.0000                  ANTENNA: DELTA H/E/N
G    4 C1C L1C D1C S1C                                      SYS / # / OBS TYPES
R    4 C1C L1C D1C S1C                                      SYS / # / OBS TYPES
S    4 C1C L1C D1C S1C                                      SYS / # / OBS TYPES
  1970     1     1     0     0    0.0000000     GPS         TIME OF FIRST OBS
  1970     1     1     0     0    0.0000000     GPS         TIME OF LAST OBS
G                                                           SYS / PHASE SHIFT
R                                                           SYS / PHASE SHIFT
S                                                           SYS / PHASE SHIFT
 C1C    0.000 C1P    0.000 C2C    0.000 C2P    0.000        GLONASS COD/PHS/BIS
                                                            END OF HEADER

TIME OF FIRST OBS is still wrong.

+$50 for raw data output looks like a clear ripoff to me:
https://www.indiegogo.com/projects/navio-autopilot-shield-for-raspberry-pi
Choosing NEO-7M instead of NEO-7N is also just reselling cheapest chinese stuff.
I’ll try to integrate the TRKD5 parser into rtklib during this weekend,
which will support raw output on all ublox5/6/7 receivers without any weird hacks.

Оглядываясь назад, в начало ветки - впечатляющий прогресс. Кто бы тогда мог мечтать о таком…

This patch is much smaller than the previous one, and i could test it only on Navilock NL-682MP
in GPS/EGNOS and glonass modes (using standard firmware EXT CORE 1.00 (59843) Jun 27 2012 18:25:00*49)
What we are still missing now:

  1. TRK-SFRB patch
  2. RXM-SFRBX decoder (minor modification of TRK-SFRBX)
  3. TLE patch
  4. SIRF support for sirf2 (non-xtrack), sirf3 (patched) and sirf4.

+/* decode ublox trk-trkd5: raw tracker data --------------------------------*/
+static int decode_trkd5(raw_t *raw)
+{
+ int i, off, pnum;
+
+        pnum=0;
+	for (i = 0; i < 16; i++) { /* 16 channels for ublox5/6, should be 22 for ublox7 */
+	    int sv;
+	    int gnss, sys;
+	    int plock;
+	    int g2g=0;
+        int plocked;
+        double p2p;
+	    
+            p2p=0.0;
+	       sys=SYS_GPS;
+
+            switch (getb(0))
+            {
+             case 6:
+
+	       off = 80 + 64 * i;
+	       plocked = 0xd;
+	       if ((getb(off+54) & 0x0f) == 0xe) p2p=0.5;
+	       gnss = getb(off+56); if (gnss == 6) g2g=10800-16; /* leap seconds here */
+	       sv = getb(off+57);
+             break;
+
+             case 3:
+
+	       off = 80 + 56 * i;
+	       plocked = 0xd;
+	       if ((getb(off+54) & 0x0f) == 0xe) p2p=0.5;
+	       gnss = 0;
+	       sv = getb(off+34);
+             break;
+
+             default: /* =0 */
+
+              off = 72 + 56 * i;
+              plocked = 0x5;
+	       if ((getb(off+54) & 0x0f) == 0xe) p2p=0.5;
+	       gnss = 0;
+	       sv = getb(off+34);
+             break;
+            }
+
+	    plock = getb(off+52);
+
+	    if ( plock != plocked ) 
+	    {
+	     continue;
+	    }
+
+	    sys = gnss2sys(gnss);
+
+	    raw->trk_raw_obs[pnum].codep=((double)getq_le(off+0))*P2_32-g2g*1000; /* DEBUG */
+	    raw->trk_raw_obs[pnum].L1=((double)getq_le(off+8))*P2_32-p2p;
+	    raw->trk_raw_obs[pnum].D1=((float)getl_le(off+16))*P2_12;
+	    raw->trk_raw_obs[pnum].plockt=getw_le(off+30);
+	    raw->trk_raw_obs[pnum].mesqi=getb(off+41);
+	    raw->trk_raw_obs[pnum].cno=getw_le(off+32);
+	    raw->trk_raw_obs[pnum].sat=satno(sys,sv);
+	    raw->trk_raw_obs[pnum].bits=((getb(off+52))<<24)+((getb(off+53))<<16)+((getb(off+54))<<8)+getb(off+55);
+
+	    pnum++;
+	}
+	raw->rnx_nchan=pnum;
+
+ return 0;
+}
+

@@ -255,6 +567,11 @@
     switch (type) {
         case ID_RXMRAW : return decode_rxmraw(raw);
         case ID_RXMSFRB: return decode_rxmsfrb(raw);
+
+        case ID_NAVTIME: return decode_navtime(raw);
+        case ID_NAVCLOCK:return decode_makeraw(raw);
+        case ID_TRKMEAS: return decode_trkmeas(raw);
+        case ID_TRKTRKD5:return decode_trkd5(raw);
     }
     return 0;
 }


-1

Самое печальное, что на amazon.de доставка только по Германии :frowning: Не смог найти нигде с доставкой по европе по такой цене (есть на ебее за 55 евро только).

-1

Могу сказать только в обратную сторону - 4 евро до 250г, 6 евро до 500г. Плюс цена конверта. Думаю, по ту сторону цены будут схожие.
А с какой целью интересуетесь? :slight_smile:

-1

А вот и прошивка с NEO-M8N 2.01
https://yadi.sk/d/OCQ1oIIKWqqPZ

Автор rtklib купил плату с приемником NEO-7N и по этому поводу (наконец) добавил
официальную поддержку TRK-TRKD5, и также поправил баг в API для TLE (No. 112 http://rtklib.com/rtklib_support.htm))
Прогресс!

Как геодезисты пытаются делать статику (даже не RTK) в сложных условиях:

Естественно речь о двухчастотнике.

Что я хочу сказать: RTK это вершина эволюции GPS/GNSS. Любительский L1 RTK это тупиковый путь, нельзя пользоваться микрометром не научившись пользоваться рулеткой. SviMik это уже понял ))

Надо двигаться в сторону DGPS и любительских станций по NTRIP. Наработки по u-Blox и SiRF Star не пропадут даром т.к. сырые данные всё-равно нужны.

Поднимать выше тарелку бесполезно. Планированием положения спутников надо пользоваться, в некоторых
программах это есть. Чтобы максимум спутников было в зените в течении рабочего дня при работе в лесу.
И желательно конечно видеть при получении сырых данных, сколько спутников участвует в решении,
чтобы зря не стоять на пункте.