Skip to content

Commit

Permalink
Wide-lane ambiguity fixing for multi-constellation, L1/L2 or L1/L5.
Browse files Browse the repository at this point in the history
Wide lane support is enabled by setting modear to 'wide-lane' (ARMODE_WL).
Wide lane AR fix and hold can be enabled using the wlmodear option.
Also includes an example configuration file for using rtkrcv with
Swift Navigation's Skylark Cloud Correction Service.
  • Loading branch information
dgburr committed Feb 18, 2022
1 parent 180043e commit 3243afe
Show file tree
Hide file tree
Showing 6 changed files with 412 additions and 25 deletions.
160 changes: 160 additions & 0 deletions app/consapp/rtkrcv/conf/rtk_skylark_l1l5.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
# rtkrcv options (2022/02/09 22:11:36, v.2.4.3 b34)

console-passwd =admin
console-timetype =gpst # (0:gpst,1:utc,2:jst,3:tow)
console-soltype =dms # (0:dms,1:deg,2:xyz,3:enu,4:pyl)
console-solflag =1 # (0:off,1:std+2:age/ratio/ns)
inpstr1-type =ntripcli # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripcli,7:ftp,8:http)
inpstr2-type =ntripcli # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripcli,7:ftp,8:http)
inpstr3-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripcli,7:ftp,8:http)
inpstr1-path =username:[email protected]:2101/STFU00USA0
# SWIFT: Skylark host may vary depending on geographic region and frequency range
inpstr2-path =username:[email protected]:2101/CRS
inpstr3-path =
inpstr1-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17)
inpstr2-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17)
inpstr3-format =rtcm3 # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:javad,9:nvs,10:binex,11:rt17)
inpstr2-nmeareq =single # (0:off,1:latlon,2:single)
inpstr2-nmealat =0 # (deg)
inpstr2-nmealon =0 # (deg)
inpstr2-nmeahgt =0 # (m)
outstr1-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr,11:ntripc_c)
outstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr,11:ntripc_c)
outstr1-path =
outstr2-path =
outstr1-format =xyz # (0:llh,1:xyz,2:enu,3:nmea,4:stat)
outstr2-format =llh # (0:llh,1:xyz,2:enu,3:nmea,4:stat)
logstr1-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr,11:ntripc_c)
logstr2-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr,11:ntripc_c)
logstr3-type =off # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr,11:ntripc_c)
logstr1-path =
logstr2-path =
logstr3-path =
misc-svrcycle =10 # (ms)
misc-timeout =10000 # (ms)
misc-reconnect =10000 # (ms)
misc-nmeacycle =5000 # (ms)
misc-buffsize =32768 # (bytes)
misc-navmsgsel =all # (0:all,1:rover,2:base,3:corr)
misc-proxyaddr =
misc-fswapmargin =30 # (s)
misc-startcmd =
misc-stopcmd =
file-cmdfile1 =
file-cmdfile2 =
file-cmdfile3 =
pos1-posmode =kinematic # (0:single,1:dgps,2:kinematic,3:static,4:movingbase,5:fixed,6:ppp-kine,7:ppp-static,8:ppp-fixed)
# SWIFT: l1+2 for L1/L2, l1+2+3 for L1/L5
pos1-frequency =l1+2+3 # (1:l1,2:l1+2,3:l1+2+3,4:l1+2+3+4,5:l1+2+3+4+5)
pos1-soltype =forward # (0:forward,1:backward,2:combined)
pos1-elmask =15 # (deg)
pos1-snrmask_r =off # (0:off,1:on)
pos1-snrmask_b =off # (0:off,1:on)
pos1-snrmask_L1 =0,0,0,0,0,0,0,0,0
pos1-snrmask_L2 =0,0,0,0,0,0,0,0,0
pos1-snrmask_L5 =0,0,0,0,0,0,0,0,0
pos1-dynamics =off # (0:off,1:on)
pos1-tidecorr =off # (0:off,1:on,2:otl)
pos1-ionoopt =brdc # (0:off,1:brdc,2:sbas,3:dual-freq,4:est-stec,5:ionex-tec,6:qzs-brdc)
pos1-tropopt =saas # (0:off,1:saas,2:sbas,3:est-ztd,4:est-ztdgrad)
pos1-sateph =brdc # (0:brdc,1:precise,2:brdc+sbas,3:brdc+ssrapc,4:brdc+ssrcom)
pos1-posopt1 =on # (0:off,1:on)
pos1-posopt2 =on # (0:off,1:on)
pos1-posopt3 =on # (0:off,1:on,2:precise)
pos1-posopt4 =on # (0:off,1:on)
pos1-posopt5 =on # (0:off,1:on)
pos1-posopt6 =off # (0:off,1:on)
pos1-exclsats =C02 # (prn ...)
pos1-navsys =41 # (1:gps+2:sbas+4:glo+8:gal+16:qzs+32:bds+64:navic)
pos2-armode =wide-lane # (0:off,1:continuous,2:instantaneous,3:fix-and-hold,4:WLNL,5:TCAR,6:wide-lane)
# SWIFT: only enable for static positioning mode
pos2-wlarmode =off # (0:off,1:on)
pos2-gloarmode =off # (0:off,1:on)
pos2-bdsarmode =off # (0:off,1:on)
pos2-arthres =3
pos2-arthres1 =0.9999
pos2-arthres2 =0.25
pos2-arthres3 =0.1
pos2-arthres4 =0.05
pos2-arlockcnt =30
pos2-arelmask =0 # (deg)
pos2-arminfix =30
pos2-armaxiter =1
pos2-elmaskhold =0 # (deg)
pos2-aroutcnt =30
pos2-maxage =30 # (s)
pos2-syncsol =off # (0:off,1:on)
pos2-slipthres =0.05 # (m)
pos2-rejionno =30 # (m)
pos2-rejgdop =30
pos2-niter =1
pos2-baselen =0 # (m)
pos2-basesig =0 # (m)
out-solformat =xyz # (0:llh,1:xyz,2:enu,3:nmea)
out-outhead =off # (0:off,1:on)
out-outopt =off # (0:off,1:on)
out-outvel =off # (0:off,1:on)
out-timesys =gpst # (0:gpst,1:utc,2:jst)
out-timeform =tow # (0:tow,1:hms)
out-timendec =3
out-degform =dms # (0:deg,1:dms)
out-fieldsep =
out-outsingle =on # (0:off,1:on)
out-maxsolstd =0 # (m)
out-height =geodetic # (0:ellipsoidal,1:geodetic)
out-geoid =internal # (0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000)
out-solstatic =all # (0:all,1:single)
out-nmeaintv1 =0 # (s)
out-nmeaintv2 =0 # (s)
out-outstat =state # (0:off,1:state,2:residual)
stats-eratio1 =100
stats-eratio2 =100
stats-errphase =0.01 # (m)
stats-errphaseel =0.01 # (m)
stats-errphasebl =0 # (m/10km)
stats-errdoppler =1 # (Hz)
stats-stdbias =30 # (m)
stats-stdiono =0.03 # (m)
stats-stdtrop =0.3 # (m)
stats-prnaccelh =10 # (m/s^2)
stats-prnaccelv =10 # (m/s^2)
stats-prnbias =0.0001 # (m)
stats-prniono =0.001 # (m)
stats-prntrop =0.0001 # (m)
stats-prnpos =0 # (m)
stats-clkstab =5e-12 # (s/s)
ant1-postype =llh # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm,6:raw,7:rinexdynamic)
ant1-pos1 =90 # (deg|m)
ant1-pos2 =0 # (deg|m)
ant1-pos3 =-6335367.6285 # (m|m)
ant1-anttype =
ant1-antdele =0 # (m)
ant1-antdeln =0 # (m)
ant1-antdelu =0 # (m)
ant2-postype =rtcm # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm,6:raw,7:rinexdynamic)
ant2-pos1 =0 # (deg|m)
ant2-pos2 =0 # (deg|m)
ant2-pos3 =0 # (m|m)
ant2-anttype =
ant2-antdele =0 # (m)
ant2-antdeln =0 # (m)
ant2-antdelu =0 # (m)
ant2-maxaveep =3600
ant2-initrst =on # (0:off,1:on)
misc-timeinterp =off # (0:off,1:on)
misc-sbasatsel =0 # (0:all)
misc-rnxopt1 =
misc-rnxopt2 =
misc-pppopt =
file-satantfile =
file-rcvantfile =
file-staposfile =
file-geoidfile =
file-ionofile =
file-dcbfile =
file-eopfile =
file-blqfile =
file-tempdir =
file-geexefile =
file-solstatfile =
file-tracefile =
5 changes: 3 additions & 2 deletions src/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ static char snrmask_[NFREQ][1024];
#define GEOOPT "0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000"
#define STAOPT "0:all,1:single"
#define STSOPT "0:off,1:state,2:residual"
#define ARMOPT "0:off,1:continuous,2:instantaneous,3:fix-and-hold"
#define ARMOPT "0:off,1:continuous,2:instantaneous,3:fix-and-hold,4:WLNL,5:TCAR,6:wide-lane"
#define POSOPT "0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm,6:raw"
#define TIDEOPT "0:off,1:on,2:otl"
#define PHWOPT "0:off,1:on,2:precise"
Expand Down Expand Up @@ -86,8 +86,9 @@ EXPORT opt_t sysopts[]={
{"pos1-posopt6", 3, (void *)&prcopt_.posopt[5], SWTOPT },
{"pos1-exclsats", 2, (void *)exsats_, "prn ..."},
{"pos1-navsys", 0, (void *)&prcopt_.navsys, NAVOPT },

{"pos2-armode", 3, (void *)&prcopt_.modear, ARMOPT },
{"pos2-wlarmode", 3, (void *)&prcopt_.wlmodear, SWTOPT },
{"pos2-gloarmode", 3, (void *)&prcopt_.glomodear, GAROPT },
{"pos2-bdsarmode", 3, (void *)&prcopt_.bdsmodear, SWTOPT },
{"pos2-arthres", 1, (void *)&prcopt_.thresar[0], "" },
Expand Down
4 changes: 2 additions & 2 deletions src/rtcm3.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ const char *msm_sig_sbs[32]={
const char *msm_sig_cmp[32]={
/* BeiDou: ref [17] table 3.5-108 */
"" ,"2I","2Q","2X","" ,"" ,"" ,"6I","6Q","6X","" ,"" ,
"" ,"7I","7Q","7X","" ,"" ,"" ,"" ,"" ,"" ,"" ,"" ,
"" ,"7I","7Q","7X","" ,"" ,"" ,"" ,"" ,"5D","5P","5X",
"" ,"" ,"" ,"" ,"" ,"" ,"" ,""
};
const char *msm_sig_irn[32]={
Expand Down Expand Up @@ -2088,7 +2088,7 @@ static void save_msm_obs(rtcm_t *rtcm, int sys, msm_h_t *h, const double *r,
(float)(-(rr[i]+rrf[j])*freq/CLIGHT);
}
rtcm->obs.data[index].LLI[idx[k]]=
lossoflock(rtcm,sat,idx[k],lock[j])+(half[j]?3:0);
lossoflock(rtcm,sat,idx[k],lock[j])+(half[j]?2:0);
rtcm->obs.data[index].SNR [idx[k]]=(uint16_t)(cnr[j]/SNR_UNIT+0.5);
rtcm->obs.data[index].code[idx[k]]=code[k];
}
Expand Down
13 changes: 8 additions & 5 deletions src/rtkcmn.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ const double chisqr[100]={ /* chi-sqr(n) (alpha=0.001) */
const prcopt_t prcopt_default={ /* defaults processing options */
PMODE_SINGLE,0,2,SYS_GPS, /* mode,soltype,nf,navsys */
15.0*D2R,{{0,0}}, /* elmin,snrmask */
0,1,1,1, /* sateph,modear,glomodear,bdsmodear */
0,1,0,1,1, /* sateph,modear,wlmodear,glomodear,bdsmodear */
5,0,10,1, /* maxout,minlock,minfix,armaxiter */
0,0,0,0, /* estion,esttrop,dynamics,tidecorr */
1,0,0,0,0, /* niter,codesmooth,intpref,sbascorr,sbassatsel */
Expand Down Expand Up @@ -3114,10 +3114,13 @@ extern void traceobs(int level, const obsd_t *obs, int n)
for (i=0;i<n;i++) {
time2str(obs[i].time,str,3);
satno2id(obs[i].sat,id);
fprintf(fp_trace," (%2d) %s %-3s rcv%d %13.3f %13.3f %13.3f %13.3f %d %d %d %d %3.1f %3.1f\n",
i+1,str,id,obs[i].rcv,obs[i].L[0],obs[i].L[1],obs[i].P[0],
obs[i].P[1],obs[i].LLI[0],obs[i].LLI[1],obs[i].code[0],
obs[i].code[1],obs[i].SNR[0]*SNR_UNIT,obs[i].SNR[1]*SNR_UNIT);
fprintf(fp_trace," (%2d) %s %-3s rcv%d %13.3f %13.3f %13.3f %13.3f %13.3f %13.3f %d %d %d %d %d %d %3.1f %3.1f %3.1f\n",
i+1,str,id,obs[i].rcv,
obs[i].L[0],obs[i].L[1],obs[i].L[2],
obs[i].P[0],obs[i].P[1],obs[i].P[2],
obs[i].LLI[0],obs[i].LLI[1],obs[i].LLI[2],
obs[i].code[0],obs[i].code[1],obs[i].code[2],
obs[i].SNR[0]*SNR_UNIT,obs[i].SNR[1]*SNR_UNIT,obs[i].SNR[2]*SNR_UNIT);
}
fflush(fp_trace);
}
Expand Down
4 changes: 3 additions & 1 deletion src/rtklib.h
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,7 @@ extern "C" {
#define ARMODE_FIXHOLD 3 /* AR mode: fix and hold */
#define ARMODE_WLNL 4 /* AR mode: wide lane/narrow lane */
#define ARMODE_TCAR 5 /* AR mode: triple carrier ar */
#define ARMODE_WL 6 /* AR mode: wide lane ar */

#define SBSOPT_LCORR 1 /* SBAS option: long term correction */
#define SBSOPT_FCORR 2 /* SBAS option: fast correction */
Expand Down Expand Up @@ -964,6 +965,7 @@ typedef struct { /* processing options type */
snrmask_t snrmask; /* SNR mask */
int sateph; /* satellite ephemeris/clock (EPHOPT_???) */
int modear; /* AR mode (0:off,1:continuous,2:instantaneous,3:fix and hold,4:ppp-ar) */
int wlmodear; /* wide lane AR fix and hold (0: off, 1: on) */
int glomodear; /* GLONASS AR mode (0:off,1:on,2:auto cal,3:ext cal) */
int bdsmodear; /* BeiDou AR mode (0:off,1:on) */
int maxout; /* obs outage count to reset bias */
Expand Down Expand Up @@ -1102,7 +1104,7 @@ typedef struct { /* satellite status type */
double resc[NFREQ]; /* residuals of carrier-phase (m) */
uint8_t vsat[NFREQ]; /* valid satellite flag */
uint16_t snr[NFREQ]; /* signal strength (*SNR_UNIT dBHz) */
uint8_t fix [NFREQ]; /* ambiguity fix flag (1:fix,2:float,3:hold) */
uint8_t fix [NFREQ]; /* ambiguity fix flag (1:float,2:fix,3:hold) */
uint8_t slip[NFREQ]; /* cycle-slip flag */
uint8_t half[NFREQ]; /* half-cycle valid flag */
int lock [NFREQ]; /* lock counter of phase */
Expand Down
Loading

0 comments on commit 3243afe

Please sign in to comment.