Wholesale Navilock retailers started to dump glonass receivers, NL-682MP costs 21,07€
http://www.amazon.de/Navilock-ANTENNE-GLONASS-NL-682MP-DACHMONTAGE/dp/B008LFAOI
NL-682MP provides either raw gps or glonass data, and it is also possible to cross-compile
the command line rtklib utilities for windows using mingw32.
The weird borland GUI stuff is obviously not supported, and should be finally replaced by the
pyqt4 widgets.
-1
DataSheet UBX-G7020-Kx
http://innovictor.com/pdf/UBX-G7020-Kx_DataSheet_(GPS%20G7-HW-12001)_Confidential.pdf
u-blox finally has provided the documentation (partially) explaining the bad performance of NEO-M8N:
there are two versions of this module. The old one is “PCB version B” and the new one is “PCB version C”
http://u-blox.com/en/evaluation-tools-a-software/gps-evaluation-kits.html
The main difference is in the ROM firmware: version B has
barebone “ROM 0.22” and version C has full “ROM 2.01”.
Clearing the flash on version B is not possible, so it must work with the flashed firmware,
which makes things slow
-1
С TRK-SFRBX для GPS разобрался, может подскажете как TRK-SFRBX глонасс в rtklib обработать?
-1
-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:
- TRK-SFRB patch
- RXM-SFRBX decoder (minor modification of TRK-SFRBX)
- TLE patch
- 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 доставка только по Германии Не смог найти нигде с доставкой по европе по такой цене (есть на ебее за 55 евро только).