1. 程式人生 > 其它 >RTKLIB學習日誌3—精密定位流程

RTKLIB學習日誌3—精密定位流程


寫在前面本節將給出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;
}