精华内容
下载资源
问答
  • GPS单点定位程序

    2014-06-13 11:48:19
    GPS单点定位程序的matlab,适合学习matlab的同学练习
  • GPS单点定位程序,采用matlab格式,分成几个函数,结构简单明了
  • GPS单点定位程序开发几点思考
  • GPS单点定位程序(C++)

    热门讨论 2011-03-23 14:22:46
    c++编写,GPS单点定位程序,在VC环境下运行,程序中包含已有的运算数据
  • GPS单点定位程序设计

    2016-10-28 17:54:26
    该文档介绍了GPS基于伪距的单点定位的原理与编程实现方法,内含程序源代码和运行结果截图。
  • GPS单点定位程序设计可以进行N文件读取c++写的
  • C语言gps单点定位程序

    2021-05-14 14:43:49
    读文件 计算卫星位置 使用迭代法 利用间接平差</p>
  • 基于matlab的GPS单点定位程序开发(初学者)

    千次阅读 多人点赞 2019-10-27 13:34:24
    基于matlab的GPS单点定位程序开发 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识...

    基于matlab的GPS单点定位程序开发

    开发初衷

    本人是测绘专业的学生,在初学GPS时遇到了很多代码问题,因此希望这篇文章能够帮助广大的测绘和导航专业的学子

    代码开始

    开发的第一部分是:文件读取,文件读取包括两部分,观测文件和星历文件读取。

    首先介绍第一部分文件读取:读取星历文件(代码如下)

    读取GPS星历(可以是混合星历)

    // An highlighted block
     function eph=loadxingli(filename)%%读取rinex3的星历文件
     tic;
     fprintf('Opening RINEX file: %s\n', filename);
     finp = fopen(filename, 'rt');
    %%%%星历索引值
     no = 2:3;           year_idx = 5:8;        month_idx = 10:11;    day_idx = 13:14;
     hour_idx = 16:17;   min_idx = 19:20;       sec_idx = 22:23;      
     f1 = 5:23;          f2 = 24:42;            f3 = 43:61;           f4 = 62:80;
    %%%跳过文件头
    while 1
        line=fgetl(finp);
        if contains(line,'END OF HEADER')
            break;
        end
    end
    %%预设数组
    sat=1:32;nav=cell(1,32);
    eph=[];SEP=zeros(size(sat));
    block_init =zeros(42,1);
    while ~feof(finp)%%每次循环8行
        line=fgetl(finp);
        system=line(1);
          if system=='G'
            prn = str2double(line(no));
            idx = find(prn ==sat);
            SEP(idx) = SEP(idx) + 1;
            tt = zeros(6,1);
            tt(1) = round(str2double(line(year_idx)));
            tt(2) = round(str2double(line(month_idx)));
            tt(3) = round(str2double(line((day_idx))));
            tt(4) = str2double(line(hour_idx));
            tt(5) = str2double(line(min_idx));
            tt(6) = str2double(line(sec_idx));
            [GPSWeekNo, GPSSecond, DOY, DOW] = greg2gps(tt');
            mTime = datenum(tt');
            block=block_init;
            block(1:11) = [tt; GPSWeekNo; GPSSecond; DOY; DOW; mTime];
            %%%第一行
            block(12:14) = [str2double(line(f2));str2double(line(f3));str2double(line(f4))];
            %%%第二行
            line=fgetl(finp);
            block(15:18) = [str2double(line(f1));str2double(line(f2));...
            str2double(line(f3));str2double(line(f4))];
             %%%第三行
             line=fgetl(finp);
            block(19:22) =  [str2double(line(f1));str2double(line(f2));...
            str2double(line(f3));(str2double(line(f4)))^2];
            %%%% Line 4
           line=fgetl(finp);
            block(23:26) = [str2double(line(f1));str2double(line(f2));...
            str2double(line(f3));str2double(line(f4))];
             %%%% Line 5
             line=fgetl(finp);
            block(27:30) =  [str2double(line(f1));str2double(line(f2));...
            str2double(line(f3));str2double(line(f4))];
            %%%% Line 6
          line=fgetl(finp);
            block(31:34) =  [str2double(line(f1));str2double(line(f2));...
            str2double(line(f3));str2double(line(f4))];        
            %%%% Line 7
            line=fgetl(finp);
            block(35:38) =  [str2double(line(f1));str2double(line(f2));...
            str2double(line(f3));str2double(line(f4))];
            %%%% Line 8(最后两个可以直接设置为NaN,如果报错)
             line=fgetl(finp);
            block(39:42) =  [str2double(line(f1));str2double(line(f2));...
            str2double(line(f3));str2double(line(f4))];  
            %%%存到数组中
            nav{1,prn}(:,SEP(idx))=block;
        end
    end 
    toc;
    eph=nav;
    %%%%星历读取完成 

    关于子程序(greg2gps可以私聊我获得)

    datenum函数是2018版matlab自带的


    读取观测文件(可以是混合文件)

    %%读取rinex3的观测文件,并完成定位
    %%%观测文件的结构体,不启用
    %RNX=struct('obs_body','approx');
     fprintf('open obs file; %s\n',filename);
     fid=fopen(filename,'rt');
     lineidx=0;
     P1=6:17;L1=21:33;S1=44:49;
     fprintf('open obs file; %s\n',filename);
    fid=fopen(filename,'rt');
    lineidx=0;
    while 1
        line=fgetl(fid);
        lineidx=lineidx+1;
        if contains(line,'APPROX POSITION XYZ')
            app_xyz=sscanf(line,'%.4f %.4f %.4f');%计算高度角,随机模型(强调不为零)
        end
        if contains(line,'END OF HEADER')
            break;
        end
     end
    %%%读取文件主体
    while ~feof(fid)
        line=fgetl(fid);
        first_str=line(1);
        switch first_str
            case '>'
                  lineidx=lineidx+1;
                  help=0;
                  help_satpos=[];
                  sat_num=str2double(line(34:35));
                  %系数矩阵
                  xishu=zeros(sat_num,4);
                  Z  =zeros(sat_num,1);
                  P  =eye(sat_num);
                  xishu_idx=0;
    	      time(1)=str2double(line(3:6));time(2)=str2double(line(8:9));
                  time(3)=str2double(line(11:12));time(4)=str2double(line(14:15));
                  time(5)=str2double(line(17:18));time(6)=str2double(line(20:29));
    	      JD = juliandate(datetime(time(1),time(2),time(3)));
                  gpsweek = floor((JD - 2444244.5)/7);
                  dow = JD - (2444244.5 + gpsweek*7);
                  tow = dow*86400 + time(4)*3600 + time(5)*60 + time(6);
                  doy = JD - juliandate(time(:,1),1,1) + 1;
                  t_time=[gpsweek, tow, doy, dow];
            case 'G'
                lineidx=lineidx+1;
                sat_id=str2double(line(2:3));
                idx=find(sat==sat_id);
                sep(idx)=sep(idx)+1;
                obs1=str2double(line(P1));
                obs2=str2double(line(L1));
                obs3=str2double(line(S1));
                xishu_idx=xishu_idx+1;
                obs=[t_time(1) t_time(2) obs1 obs2 obs3];
    	
    	%%%%%%%	这一部分是选取合适的星历,这是是本程序中需要重点改进的部分
    	    eph=nav{1,sat_id}';
    	    eph_time=eph(:,8);
    	    help=0
    	    for i=1:length(eph_time)
    	    	help=help+1;
    	    	if eph_time(i)>tow
    	    		break;
    	    	end
    	    end  %该方法强调星历必须顺序存储,且保证不能超过两小时
    	    eph_idx=help;
               % eph_idx= eph_idx_ini+fix(abs(obs(2)-eph(help,8))/7200);%两小时星历
            %%%%%%%%(能够完成自动识别,而不是手动改正)
                %%%%卫星传播时间矫正
                time_s=tow-obs1/299792458;            
       	    af2 = eph(eph_idx,14);weekno = eph(eph_idx,33);
                af0 = eph(eph_idx,12);toc    = eph(eph_idx,8);
                af1 = eph(eph_idx,13);timeeph= weekno*7*86400 + toc;
                dt  =  check_t(time_s - timeeph);
                corr = (af2 * dt + af1) * dt + af0;
                obs(2)=time_s-corr;
                %%%%%时间矫正完成
                xyz =getSatPosGPS(obs(1:2),eph(eph_idx,:));
                help_satpos=[help_satpos;xyz];
                %%%%构建法方程,可以用最小二乘也可以使用卡尔曼滤波
    		%%卡尔曼滤波读者自己开发,最小二乘需要迭代
    		   dist=norm(xyz,app_xyz);
    		   xishu(xishu_idx,:)=[-(xyz(1)-app_xyz(1))/dist,... 
    		   -(xyz(2)-app_xyz(2))/dist,-(xyz(3)-app_xyz(3))/dist,-1];
    		   Z(xishu_idx)=obs1-dist;%未考虑电离层,对流层等影响
    		   %%%计算卫星高度角
    		   temp_enu=(xyz2enu(xyz,app_xyz))';
    	           Elevation = atan2(abs(temp_enu),norm(temp_enu(1,1:2)));
    		   P(xishu_idx)=0.3*0.3/sind(Elevation);		
    		    %%%%
    		    if xishu_idx==sat_num%%%历元数据遍历完成
    		    	delta=(xishu'*P*xishu)\(xishu'*P*Z)
    		    	X=app_xyz+delta;
    		   while 1
    		   for i=1:xishu_idx
    		   	xyz=help_satpos(i,:);
    		   	dist=norm(xyz,X);
    	               xishu(i,:)=[-(xyz(1)-X(1))/dist,... 
    	                    -(xyz(2)-X(2))/dist,-(xyz(3)-X(3))/dist,-1];
    	              Z(i)=obs1-dist;
    		   end
    		    delta=(xishu'*P*xishu)\(xishu'*P*Z)
    		    X=app_xyz+delta;		   
    	            if norm(X-app_xyz)<0.1%迭代终止条件
    	                break;   %iteration end for this epoch
    	            end
    	             app_xyz=X;
    	           end
    	           end
    	  end
    	end

    关于子程序check_t、xyz2enu可以私聊我获得, juliandate和datetime是18版matlab自带的子函数

    计算卫星位置(可以参考GPS数据处理)

    function pos = getSatPosGPS(GPStime,eph)
    	TOE      = eph(23);
    	a        = eph(22);
    	ecc      = eph(20);
    	Delta_n  = eph(17);
    	M0       = eph(18);
    	Omega    = eph(25);
    	DOmega   = eph(30);
    	omega    = eph(29);
    	i0       = eph(27);
    	Di       = eph(31);
    	CRS      = eph(16); 
    	CRC      = eph(28); 
    	CIS      = eph(26); 
    	CIC      = eph(24); 
    	CUS      = eph(21); 
    	CUC      = eph(19);
    	%%%常量
    	 const.GM  = 3.986005e14;
            const.wE  = 7.2921151467e-5;
            const.a   = 6378137;
            const.e   = 0.0818191908426215;
            const.f   = 1/298.257223563;
            %
    	tol_Kepler = 0.001;
    	tk = GPStime(:,2) - TOE;
    	tk(tk < 0) = tk(tk < 0) + 604800;
    	n0 = sqrt(const.GM*a^-3);
    	n = n0 + Delta_n;
    	Mk = mod(M0 + n*tk, 2*pi);
    	Ek = Mk;
    	for d = 1:length(Mk)
        		Ek(d) = kepler(ecc, Mk(d), tol_Kepler);
    	end
    	Ek = mod(Ek, 2*pi);
    	if max(abs(Ek - ecc.*sin(Ek) - Mk)) > tol_Kepler *(pi/648000)%打出来变成斜体
        		error('Kepler equation not computed correct values !!!');
    	end
    	vk = mod(atan2(sqrt(1 - ecc^2)*sin(Ek), cos(Ek) - ecc), 2*pi);
    	r0k = a.*(1 - ecc*cos(Ek));
    	Phik = mod(vk + omega, 2*pi)
    	delta_uk = CUC.*cos(2*Phik) + CUS.*sin(2*Phik);
    	delta_rk = CRC.*cos(2*Phik) + CRS.*sin(2*Phik);
    	delta_ik = CIC.*cos(2*Phik) + CIS.*sin(2*Phik);
    	uk = mod(Phik + delta_uk, 2*pi);
    	rk = r0k + delta_rk;
    	ik = i0 + Di*tk + delta_ik;
    	lamk = Omega + (DOmega - const.wE)*tk - const.wE*TOE;
    	lamk = mod(lamk, 2*pi);
    
    pos = [rk.*(cos(lamk).*cos(uk) - sin(lamk).*sin(uk).*cos(ik)),...
           rk.*(sin(lamk).*cos(uk) + cos(lamk).*sin(uk).*cos(ik)),...
           rk.*sin(uk).*sin(ik)];

    子程序kelper可以私聊我获得

    展开全文
  • 学生期间用c++自编的GPS单点定位程序(源码),希望对大家能有帮助,含源码
  • VC6.0实现GPS单点定位程序

    热门讨论 2008-11-22 13:47:39
    程序能够进行GPS数据的单点定位程序的精度是5米 该程序才用VC6.0运用C++实现 该程序能够进行GPS数据的单点定位程序的精度是5米 该程序才用VC6.0运用C++实现该程序能够进行GPS数据的单点定位程序的精度是5...
  • matlabGPS单点定位程序设计报告GPS卫星位置计算程序设计报告学 院:专业班级:学生姓名:学生学号:指导老师:设计目的运用计算机语言和课本内容结合进行编程,更多熟悉专业知识。设计工具Matlab R2010b设计代码%...

    matlabGPS单点定位程序设计报告

    GPS卫星位置计算程序设计报告

    学 院:

    专业班级:

    学生姓名:

    学生学号:

    指导老师:

    设计目的

    运用计算机语言和课本内容结合进行编程,更多熟悉专业知识。

    设计工具

    Matlab R2010b

    设计代码

    %读取数据..........

    [fid,msg] = fopen('单点定位实验数据.txt','r');

    [arr_skip,count] = fscanf(fid,'%s',5);

    arr_data = textscan(fid,'%d %f %f %f %f ',-1);

    satellite_num = arr_data{1};

    dis = arr_data{2};

    x_coor = arr_data{3};

    y_coor = arr_data{4};

    z_coor = arr_data{5};

    dis_app = 1:6;

    L = [0;0;0;0;0;0];

    B = [L,L,L,L];

    X=0;Y=0;Z=0;

    for t = 1:10

    for ii = 1:6

    t1 = (x_coor(ii)-X)^2;

    t2 = (y_coor(ii)-Y)^2;

    t3 = (z_coor(ii)-Z)^2;

    dis_app(ii) = sqrt(t1+t2+t3);

    end

    for ii = 1:6

    B(ii,1) = (x_coor(ii)-X) / dis_app(ii);

    B(ii,2) = (y_coor(ii)-Y) / dis_app(ii);

    B(ii,3) = (z_coor(ii)-Z) / dis_app(ii);

    B(ii,4) = -1;

    L(ii) = dis(ii)-dis_app(ii);

    end

    dx = -inv(B'*B)*B'*L;

    X= X+dx(1);

    Y = Y+dx(2);

    Z = Z+dx(3);

    end

    % 结果显示

    str1=[X];

    str2=[Y];

    str3=[Z];

    % 计算 L

    % L_l = atan(Y/X)

    L_l=asin(Y/sqrt(X^2+Y^2));

    L_b = atan(Z/sqrt(X^2+Y^2));

    % 计算椭球的相关参数

    sqr_e = 0.00669437999013;

    for ii = 1:5

    L_b1 = L_b;

    L_b = atan((Z+(X/cos(L_l)/cos(L_b1))*sqr_e*sin(L_b1))/sqrt(X^2+Y^2));

    end

    % 精度评定

    v = B*dx+L;

    sigma0 = sqrt(v'*v/2)

    t1 = sin(L_b);

    t2 = cos(L_b);

    t3 = sin(L_l);

    t4 = cos(L_l);

    r = [-t1*t4,-t1*t3,t2;-t3,t4,0;t2*t4,t2*t3,t1];

    Qx = inv(B'*B);

    qx = Qx(:,1:3);

    qx = qx(1:3,:);

    qb = r*qx*r;

    % 平面位置精度因子

    HDOP = sqrt(qb(1,1)/L_l+qb(2,2));

    Mh = HDOP*sigma0;

    % 高程精度因子

    VDOP = sqrt(qb(3,3));

    Mv = VDOP*sigma0;

    % 空间位置精度因子

    PDOP = sqrt(qx(1,1)+qx(2,2)+qx(3,3));

    Mp = PDOP*sigma0;

    % 接收机钟差精度因子

    TDOP = sqrt(Qx(4,4));

    Mt = TDOP*sigma0;

    % 几何精度因子

    GDOP = sqrt(Qx(1,1)+Qx(2,2)+Qx(3,3)+Qx(4,4));

    Mg = GDOP*sigma0;

    % 输出结果

    str4=[HDOP];

    str5=[VDOP];

    str6=[PDOP];

    str7=[TDOP];

    str8=[GDOP];

    str0=[sigma0];

    str=[str1,str2,str3,str4,str5,str6,str7,str8,str0];

    set(handles.edit1,'string',str);

    运行界面

    课程设计感想

    这次专业的最后一次实验所以拖得有点久,因为这次有矩阵计算的代码matlab对

    展开全文
  • 如题 感谢大家 最好有数据分析...........
  • function?t=TimetoJD(Y,M,D,h,f,s) if(Y>=80) Y=Y+1900; else Y=Y+2000; end if?M; M=M+12; end JD=fix(365.25*Y)+fix(30.6001(M+1)+D+h/24+f/1440+s/24/3600+1720981.5; t=JD-2444244.5; function?...
  • GPS单点定位相对定位程序

    热门讨论 2011-03-21 15:29:51
    用matlab编写的单点定位及相对定位程序,程序中对关键行有说明,对于GPS定位的初学者有很轻的参考意义
  • GPS单点定位

    2015-08-26 21:35:23
    在VS2012环境下开发的基于伪距的GPS单点定位程序,已经调试完毕可以运行
  • GPS单点定位C#程序源码及测试图
  • C#版GPS单点定位

    2018-10-31 08:29:34
    该程序采用C#编写的GPS单点定位程序,通过读取GPS观测数据与导航数据来实现接收机位置的确定,程序定位精度在10m以内,能够绘制误差曲线图等
  • 单点定位程序

    2012-11-15 15:31:29
    GPS单点定位程序,通过广播星历计算GPS卫星的位置,继而计算单点位置!
  • GPS精密单点定位程序设计与实现
  • GPS伪距单点定位程序

    热门讨论 2015-03-31 14:44:41
    GPS伪距单点定位,学习GPS的可以下载看看,入门的好东西,不多解释
  • 程序利用C#开发语言,实现了GPS单点定位,精度可以达到8m,界面简单易懂。里面包含renix的O文件和N文件的读取,GPS时间转换,以及卫星位置解算,地球旋误差的消除,接收机钟差的消除的信息
  • 单点定位指的是利用全球若干地面跟踪站的GPS 观测数据计算出的精密卫星轨道和卫星钟差, 对单台GPS 接收机所采集的相位和伪距观测值进行定位解算

空空如也

空空如也

1 2 3 4 5 6
收藏数 107
精华内容 42
关键字:

gps单点定位程序