//////////////////////////////////////////////////////// // コードによる基線解析 //////////////////////////////////////////////////////// #include #include const double CS = 299792458.0;//光速 const double F1 = 1575420000.0; const double F5 = 1176450000.0;//L5 const double PI = 3.1415926535898;//円周率 const int SATMAX = 36;//GPSの最大総数 const int GPS = 32;//GPSの最大総数 #define DIV1 1//何個(縦横)にグリッドを区切るか #define DIVMAX 4//グリッドを格納する配列の最大値を設定 extern FILE *pos; extern int MSV[16]; extern int Ref_sat,RTK_satn,Com_satn,Com_sat[SATMAX]; extern int CHANGE_FLAG,QZSS; extern double Sat_xpos[SATMAX],Sat_ypos[SATMAX],Sat_zpos[SATMAX];//地球中心座標系 extern double POSx[DIVMAX][DIVMAX],POSy[DIVMAX][DIVMAX],POSz[DIVMAX][DIVMAX];//解析位置 extern double Sat_ele[DIVMAX][DIVMAX][SATMAX],Sat_azi[DIVMAX][DIVMAX][SATMAX];//衛星の仰角、方位角 extern double DD_carrier1[SATMAX],DD_code1[SATMAX]; extern double DD_carrier5[SATMAX],DD_code5[SATMAX]; extern double GPSTIME; extern double Dx_code,Dy_code,Dz_code; extern double End_latitude;//右上 extern double End_longitude;//右上 extern double RHDOP; int minver3(double [],double ,int); void trans_xyz_llh(double,double,double,double[]); void choose_primary(int,int []); void calc_pos1() { int i,j; int prn; int sv[16]; int sat=3; int iter; int L1=1,L5=0; double F; double ele[16]={0}; double g[128]={0}; double gt[128]={0},sg[128]={0},g3[9]={0},g2[128]={0}; double lrl[16],lrln[16]; double lrkn[16][16],lrk[16][16]; double dx=0,dy=0,dz=0; double distance,real_distance; double r0[16]={0}; double c[144]={0},gtc[128]={0}; double sig_carrier = 0.005; double ref_diff[16]={0},rov_diff[16]={0}; //衛星の位置をずらすためのもの? static double time=0; time=time+0.004; if(L1==1) F=F1; else if(L5==1) F=F5; else F=F1; // double stock=0.1; // //基準衛星をここで求める。 // for(k=1;k<=GPS+QZSS;k++){ // if(Sat_ele[DIV1][DIV1][k]>=stock){ // stock = Sat_ele[DIV1][DIV1][k]; // Ref_sat = k; // //ここで求めた基準衛星は以下の計算において // //使用衛星の中に含まれない可能性がある。重大なバグ // } // } for(i=0;i<=15;i++){ sv[i] = Com_sat[i]; if(Com_sat[i] == Ref_sat){ sv[i] = sv[0]; sv[0] = Ref_sat; } } //衛星の位置をわざとずらす // for(i=1;i<=32;i++){ // Sat_xpos[i] = Sat_xpos[i] + 5.0*sin(0.5+time+i*0.05); // Sat_ypos[i] = Sat_ypos[i] + 5.0*sin(1.0+time+i*0.05); // Sat_zpos[i] = Sat_zpos[i] + 5.0*sin(1.5+time+i*0.05); // } //衛星の方向の単位ベクトルを算出 //基準局と基準衛星の単位ベクトル lrl[0] = Sat_xpos[Ref_sat]-POSx[0][0]; lrl[1] = Sat_ypos[Ref_sat]-POSy[0][0]; lrl[2] = Sat_zpos[Ref_sat]-POSz[0][0]; lrln[0] = lrl[0]/sqrt(lrl[0]*lrl[0]+lrl[1]*lrl[1]+lrl[2]*lrl[2]); lrln[1] = lrl[1]/sqrt(lrl[0]*lrl[0]+lrl[1]*lrl[1]+lrl[2]*lrl[2]); lrln[2] = lrl[2]/sqrt(lrl[0]*lrl[0]+lrl[1]*lrl[1]+lrl[2]*lrl[2]); //基準局と選択衛星の単位ベクトル //衛星数分まわす(主衛星+従衛星分) //最大仰角の衛星はすでに選択されている for(i=0;i=4) fprintf(pos,"%f,%f,%f,%f,%f,%f,%d,%d\n",GPSTIME,lat_diff,lon_diff, llh2[2],sqrt(lat_diff*lat_diff+lon_diff*lon_diff),RHDOP,Com_satn,RTK_satn); }