用模拟卫星星座估计GNSS接收机位置
使用模拟全球导航卫星系统(GNSS)接收器跟踪地面车辆的位置。卫星是用satelliteScenario
对象,对卫星信号处理的接收机进行了仿真lookangles
(导航工具箱)而且伪距
(导航工具箱)函数,接收机的位置估计与receiverposition
(导航工具箱)函数。
概述
这个例子主要关注空间段,或者卫星星座,以及用于卫星系统的GNSS传感器设备。为了获得GNSS接收机位置的估计值,导航处理器需要来自空间段的卫星位置和来自接收机中的测距处理器的伪距。
指定仿真参数
加载mat文件,该文件包含地面车辆向the MathWorks, Inc.的纳蒂克校区行驶的真实位置和速度。
指定模拟的开始、停止和采样时间。另外,指定GNSS接收机的掩码角或最小仰角。最后,为初始卫星轨道参数指定RINEX导航消息文件。
%加载地面真实轨迹。负载(“routeNatickMA.mat”,“纬度”,“朗”,“pos”,”或者“,“lla0”);recPos = pos;recVel = vel;指定模拟次数。startTime = datetime(2021,6,24,8,0,0,“时区”,“美国/ New_York”);simulationSteps = size(pos,1);Dt = 1;stopTime = startTime + seconds((simulationSteps-1)*dt);指定掩码角度。maskAngle = 5;%度将接收机位置由东北向下(NED)转换为大地位置%的坐标。receiverLLA = ned2lla(recPos,lla0,“椭球体”);指定RINEX文件。rinexFile =“GODS00USA_R_20211750000_01D_GN.rnx”;设置RNG种子以允许可重复的结果。rng (“默认”);
可视化geoplot
对于地面真相轨迹。
图geoplot(纬度,长度)geobasasmap (“地形”)标题(“地面真相轨迹”)
模拟卫星位置随时间变化
的satelliteScenario
对象使您可以指定初始轨道参数并使用satelliteScenarioViewer
对象。本例使用satelliteScenario
以及一个RINEX文件,其中包含初始轨道参数,以模拟GPS星座随时间的变化。或者,您可以使用gnssconstellation
(导航工具箱)使用名义轨道参数或RINEX文件来模拟卫星位置的对象,并且只需要当前的模拟时间来计算卫星位置。
创建场景。sc = satellite escenario (startTime, stopTime, dt);初始化卫星。navmsg = rinexread(rinexFile);卫星(sc, navmsg);satID = sc. satellite . name;预分配结果。numSats =数字(sc. satellite);allSatPos = 0 (numSats,3,simulationSteps);allSatVel = 0 (numSats,3,simulationSteps);%保存整个模拟卫星状态。为i = 1: number (sc. satellite) [oneSatPos, oneSatVel] = state (sc. satellite (i),“CoordinateFrame”,“ecef”);allSatPos(i,:,:) = permute(oneSatPos,[3 1 2]);allSatVel(i,:,:) = permute(oneSatVel,[3 1 2]);结束
计算伪距
在整个模拟过程中,使用卫星位置来计算伪距和卫星能见度。掩码角用于确定接收器可以看到的卫星。伪距是卫星与GNSS接收机之间的距离。这个词伪距之所以使用此距离值,是因为该距离值是通过将当前接收机时钟时间与时间戳卫星信号之间的时间差乘以光速来计算的。
预分配结果。allP = 0 (numSats,simulationSteps);allPDot = 0 (numSats,simulationSteps);allIsSatVisible = false(numSats,simulationSteps);使用天图来可视化卫星。sp = skyplot([],[],MaskElevation=maskAngle);为idx = 1:simulationSteps satPos = allSatPos(:,:,idx);satVel = allSatVel(:,:,idx);从接收器位置计算卫星能见度。[satAz,satEl,allIsSatVisible(:,idx)] = lookangles(receiverLLA(idx,:),satPos,maskAngle);使用卫星和计算伪距和伪距率%接收器位置和速度。[allP(:,idx),allPDot(:,idx)] =伪橙子(receiverLLA(idx,:),satPos,recVel(idx,:),satVel);集(sp,“AzimuthData”, satAz (allIsSatVisible (:, idx)),...“ElevationData”satEl (allIsSatVisible (:, idx)),...“LabelData”, satID (allIsSatVisible (:, idx))) drawnowlimitrate结束
从伪距离和卫星位置估计接收机位置
最后,利用卫星位置和伪距来估计接收机的位置receiverposition
函数。
预分配结果。lla = 0 (simulationSteps,3);gnssVel = 0 (simulationSteps,3);hdop = 0 (simulationSteps,1);vdop = 0 (simulationSteps,1);为idx = 1:simulationSteps p = allP(:,idx);pdot = allPDot(:,idx);isSatVisible = allIsSatVisible(:,idx);satPos = allSatPos(:,:,idx);satVel = allSatVel(:,:,idx);使用伪距离估计接收机位置和速度,伪距率%,以及卫星位置和速度。[lla(idx,:),gnssVel(idx,:),hdop(idx,:)] = receiverposition(p(isSatVisible),...satPos (isSatVisible:), pdot (isSatVisible) satVel (isSatVisible:));结束
可视化的结果
在a上绘制地面真实位置和估计接收器位置geoplot
.
图geoplot(lat,lon,lla(:,1),lla(:,2))“地形”)传说(“地面实况”,“估计”)
画出位置估计的绝对误差。通过移动中值平滑错误,使绘图更具可读性。x轴和y轴的误差较小,因为接收器的两侧都有卫星。z轴的误差较大,因为接收器上方只有卫星,下方没有卫星。随着时间的推移,误差会随着接收器的移动和一些卫星的出现而改变。
estPos = lla2ned(lla,lla0,“椭球体”);winSize = floor(size(estPos,1)/10);图绘制(smoothdata (abs (estPos-pos),“movmedian”winSize)传说(“x”,“y”,“z”)包含(“时间(s)”) ylabel (“错误(m)”)标题("位置(NED)错误")