/////////////////////////////////////////////////////////////// // 主衛星の決定(DOPの計算も行う) /////////////////////////////////////////////////////////////// #include #include #include using namespace std; const double pi = 3.1415926535898;//円周率 const int SATMAX = 36;//GPSの最大総数 //const double RTK_MASK = 20.0;//GPS衛星に対するマスク角(RTK) #define DIVMAX 4//グリッドを格納する配列の最大値を設定 #define DIV1 1 extern int Com_sat[SATMAX],Com_satn,RTK_satn; extern int MSV[16]; extern int NO_SOLUTION_FLAG,Pre_sv[4]; extern double GPSTIME; extern double Sat_ele[DIVMAX][DIVMAX][SATMAX],Sat_azi[DIVMAX][DIVMAX][SATMAX];//衛星の仰角、方位角 extern double RTK_MASK,RHDOP,RGDOP,RVDOP; int minver(double[],double); void choose_primary(int flag, int sv[16]) { int i,j=0,prn,iter; int p1,p2,p3,p4; int max_iter=15; int flag2=0,flag3=0; double ele[SATMAX],azi[SATMAX]; double g[16][4],gt[4][16],a[16]={0}; double gdop[35],pdop,hdop,tdop,vdop; double min_gdop=100.0; cout.precision(10); //#if 0 // if(flag == 1) // SAT_FLAG=0; //flag(1):10通りの中からGDOPのいい衛星配置を選択 //flag(2):rhdopを算出(測位領域の検定に用いる) if(flag == 2 || flag == 3) max_iter=1; //仰角が8番目以降の衛星は使用しない if(RTK_satn<=4) NO_SOLUTION_FLAG = 1; else if(RTK_satn==5) max_iter=4; else if(RTK_satn==6) max_iter=10; else if(RTK_satn==7) max_iter=20; else if(RTK_satn==8) max_iter=35; else if(RTK_satn==9) max_iter=35; else max_iter=35; // cout << GPSTIME << " RTK_satnが10個以上" << endl; if(flag == 4) max_iter=1; for(iter=0;iter=8){ switch(iter){ case 0:p1=sv[0];p2=sv[1];p3=sv[2];p4=sv[3];break; case 1:p1=sv[0];p2=sv[1];p3=sv[2];p4=sv[4];break; case 2:p1=sv[0];p2=sv[1];p3=sv[2];p4=sv[5];break; case 3:p1=sv[0];p2=sv[1];p3=sv[3];p4=sv[4];break; case 4:p1=sv[0];p2=sv[1];p3=sv[3];p4=sv[5];break; case 5:p1=sv[0];p2=sv[1];p3=sv[4];p4=sv[5];break; case 6:p1=sv[0];p2=sv[2];p3=sv[3];p4=sv[4];break; case 7:p1=sv[0];p2=sv[2];p3=sv[3];p4=sv[5];break; case 8:p1=sv[0];p2=sv[2];p3=sv[4];p4=sv[5];break; case 9:p1=sv[0];p2=sv[3];p3=sv[4];p4=sv[5];break; case 10:p1=sv[0];p2=sv[1];p3=sv[2];p4=sv[6];break; case 11:p1=sv[0];p2=sv[1];p3=sv[3];p4=sv[6];break; case 12:p1=sv[0];p2=sv[1];p3=sv[4];p4=sv[6];break; case 13:p1=sv[0];p2=sv[1];p3=sv[5];p4=sv[6];break; case 14:p1=sv[0];p2=sv[2];p3=sv[3];p4=sv[6];break; case 15:p1=sv[0];p2=sv[2];p3=sv[4];p4=sv[6];break; case 16:p1=sv[0];p2=sv[2];p3=sv[5];p4=sv[6];break; case 17:p1=sv[0];p2=sv[3];p3=sv[4];p4=sv[6];break; case 18:p1=sv[0];p2=sv[3];p3=sv[5];p4=sv[6];break; case 19:p1=sv[0];p2=sv[4];p3=sv[5];p4=sv[6];break; case 20:p1=sv[0];p2=sv[1];p3=sv[2];p4=sv[7];break; case 21:p1=sv[0];p2=sv[1];p3=sv[3];p4=sv[7];break; case 22:p1=sv[0];p2=sv[1];p3=sv[4];p4=sv[7];break; case 23:p1=sv[0];p2=sv[1];p3=sv[5];p4=sv[7];break; case 24:p1=sv[0];p2=sv[1];p3=sv[6];p4=sv[7];break; case 25:p1=sv[0];p2=sv[2];p3=sv[3];p4=sv[7];break; case 26:p1=sv[0];p2=sv[2];p3=sv[4];p4=sv[7];break; case 27:p1=sv[0];p2=sv[2];p3=sv[5];p4=sv[7];break; case 28:p1=sv[0];p2=sv[2];p3=sv[6];p4=sv[7];break; case 29:p1=sv[0];p2=sv[3];p3=sv[4];p4=sv[7];break; case 30:p1=sv[0];p2=sv[3];p3=sv[5];p4=sv[7];break; case 31:p1=sv[0];p2=sv[3];p3=sv[6];p4=sv[7];break; case 32:p1=sv[0];p2=sv[4];p3=sv[5];p4=sv[7];break; case 33:p1=sv[0];p2=sv[4];p3=sv[6];p4=sv[7];break; case 34:p1=sv[0];p2=sv[5];p3=sv[6];p4=sv[7];break; default:break; } } if(flag == 4){ p1=Pre_sv[0]; p2=Pre_sv[1]; p3=Pre_sv[2]; p4=Pre_sv[3]; } //手動で衛星を選択 if(flag != 2 && flag != 3 && flag != 4){ if(prn == p1 || prn == p2 || prn == p3 || prn == p4){ g[j][0]=-1.0*cos(ele[prn])*sin(azi[prn]); g[j][1]=-1.0*cos(ele[prn])*cos(azi[prn]); g[j][2]=-1.0*sin(ele[prn]); g[j][3]=1.0; j++; } } //手動で衛星を選択 if(flag == 2){ g[j][0]=-1.0*cos(ele[prn])*sin(azi[prn]); g[j][1]=-1.0*cos(ele[prn])*cos(azi[prn]); g[j][2]=-1.0*sin(ele[prn]); g[j][3]=1.0; j++; }//flag==2 if(flag == 4){ if(prn == p1 || prn == p2 || prn == p3 || prn == p4){ g[j][0]=-1.0*cos(ele[prn])*sin(azi[prn]); g[j][1]=-1.0*cos(ele[prn])*cos(azi[prn]); g[j][2]=-1.0*sin(ele[prn]); g[j][3]=1.0; j++; } } if(flag == 3){ g[j][0]=-1.0*cos(ele[prn])*sin(azi[prn]); g[j][1]=-1.0*cos(ele[prn])*cos(azi[prn]); g[j][2]=-1.0*sin(ele[prn]); g[j][3]=1.0; j++; } }//for可視衛星数分 //観測行列の転置の計算 for(i=0;i=RTK_MASK){ if(gdop[iter]=RTK_MASK){ if(gdop[iter]=RTK_MASK){ if(gdop[iter]=7 && iter==19){ if(min_gdop<10.0) flag2=1; } //衛星が8個以上のときの処理 if(RTK_satn>=8 && iter<35 && flag==1 && flag2!=1 && Sat_ele[DIV1][DIV1][p4]>=RTK_MASK){ if(gdop[iter]=8 && iter==34){ if(min_gdop<10.0) flag2=1; } if(RTK_satn==5){ if(iter==4){ if(min_gdop<10) flag2=1; } } if(RTK_satn>=8 && iter==34 && flag==1 && flag2==0){ cout << GPSTIME << " " << "主衛星が決まらない" << endl; //強制的に次のアンビギュイティ決定に入らないようにすること //SATn[rcvn]=4; //SAT_FLAG=1; } if(RTK_satn==7 && iter==19 && flag==1 && flag2==0){ cout << GPSTIME << " " << "主衛星が決まらない" << endl; //強制的に次のアンビギュイティ決定に入らないようにすること //SATn[rcvn]=4; //SAT_FLAG=1; } if(RTK_satn==6 && iter==10 && flag==1 && flag2==0){ cout << GPSTIME << " " << "主衛星が決まらない" << endl; //強制的に次のアンビギュイティ決定に入らないようにすること //SATn[rcvn]=4; //SAT_FLAG=1; } if(RTK_satn==5 && iter==4 && flag==1 && flag2==0){ cout << GPSTIME << " " << "主衛星が決まらない" << endl; //強制的に次のアンビギュイティ決定に入らないようにすること //SATn[rcvn]=4; //SAT_FLAG=1; } }//iter //最初のfor文の抜ける個所 if(flag==1 && Sat_ele[DIV1][DIV1][sv[3]]<=RTK_MASK){ cout << "警告 choose_primary.cpp 衛星の仰角チェック!" << endl; //SATn[rcvn]=4; //SAT_FLAG=1; } //衛星が4個の時の処理 if(RTK_satn==4 && flag==1){ MSV[0]=sv[0]; MSV[1]=sv[1]; MSV[2]=sv[2]; MSV[3]=sv[3]; } //主衛星によるRHDOP if(flag == 2){ RHDOP = hdop; RVDOP = vdop; } // if(flag == 3) // RVDOP = vdop; if(flag == 4) RGDOP = gdop[0]; if(flag == 1) RGDOP = min_gdop; }