⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fixarithmetic.java

📁 在gprs中
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
package algorithm;

import java.text.*; //将文本显示功能的包装入
import java.io.*;
import GPSMAIN.*;

public class FixArithmetic
{
	
	//test use
	double  []delayTime0 = new double[3];

	// **********下面是计算卫星的坐标和终端测量参数所需要的一些变量************///
	public static final double para_gm = 3.986005e+14; // 地球的引力常数

	public static final double para_omegae = 7.2921151467e-5; // 地球的自转角速度
	public static final double para_light_speed = 299792458;//
	/*xhw*/
	public static final double para_pi = 3.1415926535898;//PI
	

	// *****最后计算定位的年、月、日、时、分、秒****//
	private int fix_year;

	private int fix_month;

	private int fix_day;

	private int fix_hour;

	private int fix_minute;

	private int fix_second;

	// ********定位的经纬度、高度、三维坐标及定位的精度********//
	private int fix_svnumber; // 定位的卫星颗数,用于调试

	private double fix_longitude;

	private double fix_latitude;

	private double fix_high;

	private double fix_xcoordinate;

	private double fix_ycoordinate;

	private double fix_zcoordinate;

	private double fix_error;

	// ********小区的标识号、经纬度及高度********//
	double cell_longitude;

	double cell_latitude;

	double cell_high;

	char cell_id;

	// 下面数据是终端的测量数据
	private long para_terminal_gpstow; // GPS星期ms数

	private int para_cno; // GPS卫星信噪比 单位dB/Hz

	private double para_doppler; // GPS信号的多普勒频偏 单位HZ

	private int para_wholechips; // 伪距测量的整码片数 单位chip

	private double para_fracchips; // 伪距测量的分码片数 单位chip

	// 下面是从supl接收过来的数据
	private double para_cuc; // 纬度幅角余弦改正项 单位rad

	private double para_cus; // 纬度幅角正弦改正项 单位rad

	private double para_crc; // 轨道半径余弦改正项 单位m

	private double para_crs; // 轨道半径正弦改正项 单位m

	private double para_cic; // 轨道倾角余弦改正项 单位rad

	private double para_cis; // 轨道倾角正弦改正项 单位rad

	private double para_e; // 偏心率e

	private double para_i0; // 轨道倾角i0 单位半周

	private double para_w; // 近地点点角距ω 单位半周

	private double para_omega0; // 升交点赤经Ω0 单位半周

	private double para_m0; // 参考时间的平近点角M0 单位半周

	private double para_omegadot; // 升交点赤径变化率Ω0 单位半周/s

	private double para_deltan; // 平均角速度改正0n 单位半周/s

	private double para_idot; // 倾角变化率0i 单位半周/s

	private double para_apowerhalf; // 长半轴的平方根 单位m的根方

	private long para_ephemToc; // 卫星钟差数据参考时刻,单位S

	private long para_ephemAODC; // GPS卫星时钟数据龄期 单位s
	
//	private double para_gpstow; // GPS星期秒数
	
	private int para_gpsweek; // GPS星期数

	private int[] para_svid = new int[10]; // GPS卫星编号

	private int para_ephemura; // GPS卫星测距精度

	private long para_ephemiodc; // GPS卫星星历数据龄期

	private double para_tgd; // 群延迟 单位s

	private long para_toe; // 轨道参数参考时间t0e 单位S

	private double para_ephemaf2; // 卫星钟差二次改正, 单位s/(s*s)

	private double para_ephemaf1; // 卫星钟差一次改正, 单位s/s

	private double para_ephemaf0; // 卫星钟差改正 单位s
	
	private double para_gpstow;   //SUPL中Acquisition Assist中的GPS TOW GPS星期秒数 单位 0.08s
	
	private int para_acq_codephase ;//SUPL中Acquisition Assist中的GPS CODE PHASE 单位 1chip
	
	private int para_acq_intcodephase ;//SUPL中Acquisition Assist中的GPS  INTGER CODE PHASE 单位 1ms
	
	private int para_acq_gpsbitnum ;   //SUPL中Acquisition Assist中的GPS  Bit number 单位 20ms
	
	
	// 下面是定位所需要的参数
	private double para_X; // 卫星的X坐标 单位m

	private double para_Y; // 卫星的Y坐标 单位m

	private double para_Z; // 卫星的Z坐标 单位m

	private double para_pseurange; // 对卫星的测量伪局

	// 功能:卫星定位的算法
	// 入口:四颗卫星的星历参数、终端测量参数
	// 出口:
	// 作者:lrs
	public FixArithmetic(int svnumber, Satellite[] sat)
	{

		FixCalulate fixcalulate = new FixCalulate(); // 首先实例化定位算法对象
		BLHXYZ  blhxyz=new  BLHXYZ();
		double  cellX,cellY,cellZ;
		/**xhw*/
		double tempPseuRagne;
		System.out.println("xhw---->in FixArithmetic constructor");
		// ******一颗卫星的定位算法*******//
		if (1 == svnumber)
		{
			fix_svnumber = svnumber;
			double[] svX = new double[4];
			double[] svY = new double[4];
			double[] svZ = new double[4];
			double[] svPseuRange = new double[4];
			double[] svRealRange = new double[4];
			double[] svDistrRange = new double[4];

			cell_longitude = sat[0].getCell_longitude();
			cell_latitude = sat[0].getCell_latitude();
			cell_high = sat[0].getCell_high();
			para_terminal_gpstow=sat[0].getGpsTOW();
			para_gpstow = sat[0].getAcquisitiongpsTOW();
			
			blhxyz.BLHtoXYZ(cell_latitude,cell_longitude,cell_high);
			cellX=blhxyz.getXCoord()  ;
			cellY=blhxyz.getYCoord()  ;
			cellZ=blhxyz.getZCoord()  ;
			for (int i = 0; i < 4; i++)
			{
					
				para_acq_codephase=sat[i].getCodePhase() ;
	
				para_acq_intcodephase= sat[i].getIntCodePhase();
	
				para_acq_gpsbitnum= sat[i].getGpsBitNumber();   
				
				
				para_svid[i] = sat[i].getSatelliteID();

				para_gpsweek = sat[i].getGpsWeek();

				//para_gpstow = sat[i].getGpsTOW();

				para_cno = sat[i].getCNo();

				para_doppler = sat[i].getDoppler();

				para_wholechips = sat[i].getWholeChips();

				para_fracchips = sat[i].getFracChips();

				para_cuc = sat[i].getEphemCuc();

				para_cus = sat[i].getEphemCus();

				para_crc = sat[i].getEphemCrc();

				para_crs = sat[i].getEphemCrs();

				para_cic = sat[i].getEphemCic();

				para_cis = sat[i].getEphemCis();

				para_e = sat[i].getEphemE();

				para_i0 = sat[i].getEphemI0();

				para_w = sat[i].getEphemW();

				para_omega0 = sat[i].getEphemOmegaA0();

				para_m0 = sat[i].getEphemM0();

				para_omegadot = sat[i].getEphemOmegaADot();

				para_deltan = sat[i].getEphemDeltaN();

				para_idot = sat[i].getEphemIDot();

				para_apowerhalf = sat[i].getEphemAPowerHalf();

				para_ephemToc = sat[i].getEphemToc();

				para_ephemAODC = sat[i].getEphemAODA();

				para_ephemura = sat[i].getEphemURA();

				para_ephemiodc = sat[i].getEphemIODC();

				para_tgd = sat[i].getEphemTgd();

				para_toe = sat[i].getEphemToe();

				para_ephemaf2 = sat[i].getEphemAF2();

				para_ephemaf1 = sat[i].getEphemAF1();

				para_ephemaf0 = sat[i].getEphemAF0();

				calSvXYZ();
				svX[i] = para_X;
				svY[i] = para_Y;
				svZ[i] = para_Z;
				
				calYMDHMS(para_gpsweek, para_gpstow);
				svPseuRange[i]=calPseuRange( para_acq_codephase, para_acq_intcodephase , para_acq_gpsbitnum, para_gpstow,
						para_ephemToc, para_tgd, para_ephemaf0, para_ephemaf1,para_ephemaf2);
				svPseuRange[i]+=calSvSelfModify(cellX, cellY ,svX[i],svY[i]);
			}
            
                        svRealRange[0]=svPseuRange[0];
                        svDistrRange[0]=svRealRange[0]*para_light_speed*0.001;
                        for(int j=1;j<4;j++)
                       {	
            	         svRealRange[j]=calRealRange(svPseuRange[0] ,svPseuRange[j] ) ;
            	         svDistrRange[j]=svRealRange[j]*para_light_speed*0.001;
                       }	            
            	                
			fixcalulate.aboveThreeFix(svX, svY, svZ, svDistrRange,
					     cell_latitude, cell_longitude, cell_high, 4);
			fix_longitude = fixcalulate.getUserLongitude();
			fix_latitude = fixcalulate.getUserLatitude();
			fix_high = fixcalulate.getUserHigh();
			fix_xcoordinate = fixcalulate.getUserXCoordinate();
			fix_ycoordinate = fixcalulate.getUserYCoordinate();
			fix_zcoordinate = fixcalulate.getUserZCoordinate();
			fix_error = fixcalulate.getUserError();
		}
		// ******两颗卫星的定位算法*******//
		else if (2 == svnumber)
		{
			fix_svnumber = svnumber;
			double[] svX = new double[4];
			double[] svY = new double[4];
			double[] svZ = new double[4];
			double[] svPseuRange = new double[4];
			double[] svRealRange = new double[4];
			double[] svDistrRange = new double[4];


			cell_longitude = sat[0].getCell_longitude();
			cell_latitude = sat[0].getCell_latitude();
			cell_high = sat[0].getCell_high();
			para_terminal_gpstow=sat[0].getGpsTOW();
			para_gpstow = sat[0].getAcquisitiongpsTOW();
			
			blhxyz.BLHtoXYZ(cell_latitude,cell_longitude,cell_high);
			cellX=blhxyz.getXCoord()  ;
			cellY=blhxyz.getYCoord()  ;
			cellZ=blhxyz.getZCoord()  ;
			 

			for (int i = 0; i < 4; i++)
			{
				
				para_acq_codephase=sat[i].getCodePhase() ;
	
				para_acq_intcodephase= sat[i].getIntCodePhase();
	
				para_acq_gpsbitnum= sat[i].getGpsBitNumber();   
				
				
				para_svid[i] = sat[i].getSatelliteID();

				para_gpsweek = sat[i].getGpsWeek();

				//para_gpstow = sat[i].getGpsTOW();

				para_cno = sat[i].getCNo();

				para_doppler = sat[i].getDoppler();

				para_wholechips = sat[i].getWholeChips();

				para_fracchips = sat[i].getFracChips();

				para_cuc = sat[i].getEphemCuc();

				para_cus = sat[i].getEphemCus();

				para_crc = sat[i].getEphemCrc();

				para_crs = sat[i].getEphemCrs();

				para_cic = sat[i].getEphemCic();

				para_cis = sat[i].getEphemCis();

				para_e = sat[i].getEphemE();

				para_i0 = sat[i].getEphemI0();

				para_w = sat[i].getEphemW();

				para_omega0 = sat[i].getEphemOmegaA0();

				para_m0 = sat[i].getEphemM0();

				para_omegadot = sat[i].getEphemOmegaADot();

				para_deltan = sat[i].getEphemDeltaN();

				para_idot = sat[i].getEphemIDot();

				para_apowerhalf = sat[i].getEphemAPowerHalf();

				para_ephemToc = sat[i].getEphemToc();

				para_ephemAODC = sat[i].getEphemAODA();

				para_ephemura = sat[i].getEphemURA();

				para_ephemiodc = sat[i].getEphemIODC();

				para_tgd = sat[i].getEphemTgd();

				para_toe = sat[i].getEphemToe();

				para_ephemaf2 = sat[i].getEphemAF2();

				para_ephemaf1 = sat[i].getEphemAF1();

				para_ephemaf0 = sat[i].getEphemAF0();

				calSvXYZ();
				svX[i] = para_X;
				svY[i] = para_Y;
				svZ[i] = para_Z;
				
				calYMDHMS(para_gpsweek, para_gpstow);
				svPseuRange[i]=calPseuRange( para_acq_codephase, para_acq_intcodephase , para_acq_gpsbitnum, para_gpstow,
						para_ephemToc, para_tgd, para_ephemaf0, para_ephemaf1,para_ephemaf2);
				svPseuRange[i]+=calSvSelfModify(cellX, cellY ,svX[i],svY[i]);
			
			}
			
			svRealRange[0]=svPseuRange[0];
                        svDistrRange[0]=svRealRange[0]*para_light_speed*0.001;
                        for(int j=1;j<4;j++)
                       {	
            	         svRealRange[j]=calRealRange(svPseuRange[0] ,svPseuRange[j] ) ;
            	         svDistrRange[j]=svRealRange[j]*para_light_speed*0.001;
                       }	
	            
			fixcalulate.twoStarFixB(svX, svY, svZ, svDistrRange, cell_latitude,
					cell_longitude, cell_high);
			fix_longitude = fixcalulate.getUserLongitude();
			fix_latitude = fixcalulate.getUserLatitude();
			fix_high = fixcalulate.getUserHigh();
			fix_xcoordinate = fixcalulate.getUserXCoordinate();
			fix_ycoordinate = fixcalulate.getUserYCoordinate();
			fix_zcoordinate = fixcalulate.getUserZCoordinate();
			fix_error = fixcalulate.getUserError();

		}
		// ******三颗卫星的定位算法*******//
		else if (3 == svnumber)
		{			
			System.out.println("xhw---->use three satellite ...");
			fix_svnumber = svnumber;
			double[] svX = new double[3];
			double[] svY = new double[3];
			double[] svZ = new double[3];
			double[] svPseuRange = new double[3];
			double[] svRealRange = new double[3];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -