寫在前面:本節將給出RTKLIB的差分定位與精密單點定位使用示例,通過本節可以了解到RTKLIB如何處理數據,並對上一節留下的一些問題進行補充,比如某個類的變量在真實數據處理當中的作用。
這里有個寫單點定位很好的博客,也補充了很多函數的解釋:
一、精密單點定位
所選用的數據為武漢大學IGS數據中心上下載的2020年9月25日長春站(chan)的觀測數據,同時下載了當天的廣播星歷以及精密星歷。(chan2690.20o、brdc2690.20n、igs21245.sp3)
這里直接給出代碼,在注釋中進行解釋,注意設置的計算歷元時段,如果設置時間不在所選用的數據的歷元內不會輸出結果。在RTKLIB當中,導航電文即廣播星歷與觀測值文件在任何定位模式下都是必須存在的,其他文件是可選的。
int main() {
int i, n, ret;
double tint = 0.0; /* 求解時間間隔(0:默認) */
gtime_t ts = { 0 }, te = { 0 }; /* 歷元時段始末控制變量 */
char *infile[MAXFILE], outfile[MAXSTRPATH] = { '\0' };
char resultpath[MAXSTRPATH] = "H:\\20211108\\result"; /* 結果輸出路徑 */
char sep = (char)FILEPATHSEP;
prcopt_t prcopt = prcopt_default; /* 默認處理選項設置 */
solopt_t solopt = solopt_default; /* 默認求解格式設置 */
filopt_t filopt = { /* 參數文件路徑設置 */
"", /* 衛星天線參數文件 */
"", /* 接收機天線參數文件 */
"", /* 測站位置文件 */
"", /* 擴展大地水准面數據文件 */
"", /* 電離層數據文件 */
"", /* DCB數據文件 */
"", /* 地球自轉參數文件 */
"", /* 海洋潮汐負荷文件 */
};
char infile_[MAXFILE][MAXSTRPATH] = {
"H:\\20211108\\chan2690.20o",
"H:\\20211108\\brdc2690.20n",
"H:\\20211108\\igs21245.sp3",
"",
"",
"",
"",
""
};
long t1, t2;
double eps[]={2020,9,25,0,0,0},epe[]={2020,9,25,23,0,0}; /* 設置計算的歷元時段 */
ts=epoch2time(eps);te=epoch2time(epe);
for (i = 0, n = 0; i < MAXFILE; i++)
if (strcmp(infile_[i], "")) infile[n++] = &infile_[i][0];
sprintf(outfile, "%s%c", resultpath, sep);//設置輸出路徑
/* 自定義求解格式 --------------------------------------------------------*/
solopt.posf = SOLF_XYZ; /* 選擇輸出的坐標格式,經緯度或是XYZ坐標等 */
solopt.times =TIMES_UTC; /* 控制輸出解的時間系統類型 */
solopt.degf =0; /* 輸出經緯度格式(0:°, 1:°′″) */
solopt.outhead=1; /* 是否輸出頭文件(0:否,1:是) */
solopt.outopt =1; /* 是否輸出prcopt變量(0:否,1:是) */
solopt.height =1; /* 高程(0:橢球高,1:大地高) */
/* 自定義處理選項設置 ----------------------------------------------------*/
prcopt.mode = PMODE_PPP_KINEMA; /* PPP動態處理 */
prcopt.modear = 4; /* 求解模糊度類型 */
prcopt.sateph = EPHOPT_PREC; /* 使用精密星歷 */
prcopt.ionoopt = IONOOPT_IFLC; /* 使用雙頻消電離層組合模型 */
prcopt.tropopt = TROPOPT_EST; /* 使用對流層天頂延遲估計模型 */
prcopt.tidecorr = 0; /* 地球潮汐改正選項(0:關閉,1:固體潮,2:固體潮+?+極移) */
prcopt.posopt[0] = 0; /* 衛星天線模型 */
prcopt.posopt[1] = 0; /* 接收機天線模型 */
prcopt.posopt[2] = 0; /* 相位纏繞改正 */
prcopt.posopt[3] = 0; /* 排除掩星 */
prcopt.posopt[4] = 0; /* 求解接收機坐標出錯后的檢查選項 */
prcopt.navsys = SYS_GPS; /* 處理的導航系統 */
sprintf(outfile, "%s%cChan200925.pos", resultpath, sep); /* 輸出結果名稱 */
prcopt.nf =2; /* 參與計算的載波頻率個數 */
prcopt.elmin =10.0*D2R;/* 衛星截止高度角 */
prcopt.soltype =0; /* 求解類型(0:向前濾波,1:向后濾波,2:混合濾波) */
t1 = clock();
ret = postpos(ts, te, tint, 0.0, &prcopt, &solopt, &filopt, infile, n, outfile, "", "");
t2 = clock();
if (!ret) fprintf(stderr, "%40s\r", "");
printf("\n * The total time for running the program: %6.3f seconds\n%c", (double)(t2 - t1) / CLOCKS_PER_SEC, '\0');
printf("Press any key to exit!\n");
getchar();
return ret;
}
二、差分定位
所選用的數據為武漢大學IGS數據中心上下載的2020年9月25日長春站(chan)與北京佛山站(bjfs)的觀測數據,同時下載了當天的廣播星歷以及精密星歷。(chan2690.20o、bjfs2690.20o、brdc2690.20n、igs21245.sp3)
在差分定位中,需要至少兩個站的觀測值,在RTKLIB中只有第一個觀測值文件會被當做移動站處理,這里筆者將chan作為移動站,bjfs作為基准站
int main() {
int i, n, ret;
double tint = 0.0; /* 求解時間間隔(0:默認) */
gtime_t ts = { 0 }, te = { 0 }; /* 歷元時段始末控制變量 */
char *infile[MAXFILE], outfile[MAXSTRPATH] = { '\0' };
char resultpath[MAXSTRPATH] = "H:\\20211108\\result"; /* 結果輸出路徑 */
char sep = (char)FILEPATHSEP;
prcopt_t prcopt = prcopt_default; /* 默認處理選項設置 */
solopt_t solopt = solopt_default; /* 默認求解格式設置 */
filopt_t filopt = { /* 參數文件路徑設置 */
"", /* 衛星天線參數文件 */
"", /* 接收機天線參數文件 */
"", /* 測站位置文件 */
"", /* 擴展大地水准面數據文件 */
"", /* 電離層數據文件 */
"", /* DCB數據文件 */
"", /* 地球自轉參數文件 */
"", /* 海洋潮汐負荷文件 */
};
char infile_[MAXFILE][MAXSTRPATH] = { /* 前面觀測值為移動站,后面觀測值為基准站 */
"H:\\20211108\\chan2690.20o",
"H:\\20211108\\brdc2690.20n",
"H:\\20211108\\igs21245.sp3",
"H:\\20211108\\bjfs2690.20o",
"",
"",
"",
""
};
long t1, t2;
double eps[]={2020,9,25,0,0,0},epe[]={2020,9,25,23,0,0}; /* 設置計算的歷元時段 */
ts=epoch2time(eps);te=epoch2time(epe);
for (i = 0, n = 0; i < MAXFILE; i++)
if (strcmp(infile_[i], "")) infile[n++] = &infile_[i][0];
sprintf(outfile, "%s%c", resultpath, sep);
/* 自定義求解格式 --------------------------------------------------------*/
solopt.timef = 1; /* 時間格式(0:sssss.s, 1:yyyy/mm/dd hh:mm:ss.s) */
solopt.outhead = 1; /* 是否輸出頭文件(0:否,1:是) */
solopt.posf = SOLF_XYZ; /* 輸出的坐標格式 */
//solopt.sstat =1; /* 輸出狀態文件 */
solopt.times =TIMES_UTC; /* 控制輸出解的時間系統類型 */
//solopt.degf =0; /* 輸出經緯度格式(0:°, 1:°′″) */
solopt.outopt=1; /* 是否輸出prcopt變量(0:否,1:是) */
solopt.height=1; /* 高程(0:橢球高,1:大地高) */
//solopt.sstat =1; /* 輸出求解狀態 */
/* 自定義處理選項設置 ----------------------------------------------------*/
prcopt.mode = PMODE_DGPS; /* 差分GPS處理 */
prcopt.modear = ARMODE_FIXHOLD; /* 求解模糊度類型 */
prcopt.sateph = EPHOPT_BRDC; /* 使用廣播星歷 */
prcopt.ionoopt = IONOOPT_BRDC; /* 使用廣播電離層模型 */
prcopt.tropopt = TROPOPT_SAAS; /* 使用薩斯坦莫寧模型 */
prcopt.refpos =3; /* 相對模式中基站位置獲得方式 */
/* (0:pos in prcopt, 1:average of single pos, */
/* 2:read from file, 3:rinex header, 4:rtcm pos) */
//freqindex =0; /* 單頻計算時設置所用計算的波段 */
prcopt.nf =2; /* 參與計算的載波頻率個數 L1+L2*/
//prcopt.glomodear =2;
//prcopt.thresar[0]=2;
//prcopt.posopt[4]=1; /* 求解接收機坐標出錯后的檢查選項 */
//prcopt.intpref=1;
prcopt.elmin =10.0*D2R;/* 衛星截止高度角 */
prcopt.soltype=0; /* 求解類型(0:向前濾波,1:向后濾波,2:混合濾波) */
prcopt.navsys = SYS_GPS; /* 處理的導航系統 */
sprintf(outfile, "%s%cchan200925DGPS.pos", resultpath, sep); /* 輸出結果名稱 */
//prcopt.navsys =SYS_GPS|SYS_CMP; /* 處理的導航系統 */
//sprintf(outfile,"%s%cresult_MIX.txt",resultpath,sep);
t1 = clock();
ret = postpos(ts, te, tint, 0.0, &prcopt, &solopt, &filopt, infile, n, outfile, "", "");
t2 = clock();
if (!ret) fprintf(stderr, "%40s\r", "");
printf("\n * The total time for running the program: %6.3f seconds\n%c", (double)(t2 - t1) / CLOCKS_PER_SEC, '\0');
printf("Press any key to exit!\n");
getchar();
return ret;
}