//////////////////////////////////////////////////////////////////// // // 単独測位用ルーチン // /////////////////////////////////////////////////////////////////// #include #include const double PI = 3.1415926535898;//円周率 #define DIV1 1//何個(縦横)にグリッドを区切るか #define DIVMAX 4//グリッドを格納する配列の最大値を設定 const int SATMAX = 36;//GPSの最大総数 extern FILE *temp; extern int Com_sat[SATMAX],Com_satn; extern int Enable[DIVMAX][DIVMAX],Enable_sat[DIVMAX][DIVMAX][SATMAX];//使用可能衛星 extern double Pr1ref[SATMAX],Pr1mov[SATMAX],Pr2ref[SATMAX],Pr2mov[SATMAX]; extern double Sat_xpos[SATMAX],Sat_ypos[SATMAX],Sat_zpos[SATMAX];//地球中心座標系 extern double GPSTIME; 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 End_latitude;//右上 extern double End_longitude;//右上 void sokui(int,double [],int,int,int []); int minver(double [],double); void trans_xyz_llh(double,double,double,double[]); void calc_pos0() { int i; int iter=1; int rcvn=1; int sat,satn=0,sat_n[24]; double init[4]; //最小二乗法で測位を行う場合の初期値 init[0] = -3940000.0; init[1] = 3370000.0; init[2] = 3690000.0; init[3] = 0.0; // satn = Com_satn; for(i=0;i=225){ // i=i; // } // else{ // sat_n[satn]=sat; // satn++; // } } if(satn>=4){ //本来は残差が閾値以下になるまでまわす。 //通常は2,3回で収束している while(iter <= 5) { //最小二乗法による測位計算 sokui(rcvn,init,iter,satn,sat_n); iter = iter+1; } double a1,a2,a3,llh2[3];//地球中心のx,y,z a1=init[0]; a2=init[1]; a3=init[2]; trans_xyz_llh(a1,a2,a3,llh2); double lat_diff,lon_diff; lat_diff = (End_latitude-llh2[0])*111317.1; lon_diff = (End_longitude-llh2[1])*cos(llh2[0]*PI/180.0)*111317.1; // fprintf(temp,"%f,%f,%f,%f,%d\n",GPSTIME,lat_diff, // lon_diff,llh2[2],satn); } else{ // fprintf(temp,"%f,0,0,0,%d\n",GPSTIME,satn); } } //測位計算用の反復// //--- iteration ---// void sokui(int rcvn, double init[4], int iter, int satn, int sat_n[24]) { double r2[32],r3[32],a[32],b[32],c[32],a2[16],a3[32],a4[32], aa[32],bb[32],cc[32],dd[32],g[4]; double SV_omomi[36]; int i,prn; static int ii=0; ii++; for(i=0;i