//////////////////////////////////////////////////////////////// // 主衛星と従衛星を決定 //////////////////////////////////////////////////////////////// const int SATMAX = 36;//GPSの最大総数 //const double RTK_MASK = 20.0;//GPS衛星に対するマスク角(RTK) #define DIVMAX 4//グリッドを格納する配列の最大値を設定 #define DIV1 1 extern int MSV[16]; extern int Ref_sat,Pre_sv[4]; extern int Com_sat[SATMAX],Com_satn,RTK_satn,NO_SOLUTION_FLAG,NO_RTK; extern double Sat_ele[DIVMAX][DIVMAX][SATMAX],Sat_azi[DIVMAX][DIVMAX][SATMAX];//衛星の仰角、方位角 extern double RTK_MASK,RGDOP,START_TIME,GPSTIME; void choose_primary(int,int[]); void select_sat() { int i; int sv[16],prn; double ele[16]; static int flag_entry=0; flag_entry++; //まず仰角の高い順番に並べる //2番目に高い仰角の衛星 for(i=0;i=RTK_MASK) RTK_satn = Com_satn; else if(ele[Com_satn-2]>=RTK_MASK) RTK_satn = Com_satn-1; else if(ele[Com_satn-3]>=RTK_MASK) RTK_satn = Com_satn-2; else if(ele[Com_satn-4]>=RTK_MASK) RTK_satn = Com_satn-3; else if(ele[Com_satn-5]>=RTK_MASK) RTK_satn = Com_satn-4; else if(ele[Com_satn-6]>=RTK_MASK) RTK_satn = Com_satn-5; else if(ele[Com_satn-7]>=RTK_MASK) RTK_satn = Com_satn-6; else if(ele[Com_satn-8]>=RTK_MASK) RTK_satn = Com_satn-7; else if(ele[Com_satn-9]>=RTK_MASK) RTK_satn = Com_satn-8; else if(ele[Com_satn-10]>=RTK_MASK) RTK_satn = Com_satn-9; else if(ele[Com_satn-11]>=RTK_MASK) RTK_satn = Com_satn-10; //FLAGを元に戻す if(RTK_satn>=5) NO_SOLUTION_FLAG = 0; else NO_RTK++; //一度決定した主衛星のDOPを継続的にチェックする if(flag_entry>1){ sv[0] = Ref_sat; choose_primary(4,sv); } //GDOPのいい主衛星を選ぶ if(Sat_ele[1][1][Pre_sv[0]]=10.0){ sv[0] = Ref_sat; choose_primary(1,sv); } //従衛星がRTKマスク角を越えているかどうか int k=4; for(i=0;i=RTK_MASK && sv[i]!=MSV[0] && sv[i]!=MSV[1] && sv[i]!=MSV[2] && sv[i]!=MSV[3]){ MSV[k]=sv[i]; k++; } } }