Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Estimar la posición del receptor GNSS con constelaciones de satélites simuladas

Realice un seguimiento de la posición de un vehículo terrestre utilizando un receptor simulado del Sistema Global de Navegación por Satélite (GNSS). Los satélites se simulan utilizando el objeto satelliteScenario (Satellite Communications Toolbox), el procesamiento de la señal del satélite del receptor se simula utilizando las funciones lookangles y pseudoranges, y la posición del receptor se estima con la función receiverposition.

Visión general

Este ejemplo se centra en el segmento espacial o constelaciones de satélites, y el equipo de sensores GNSS para un sistema de satélite. Para obtener una estimación de la posición del receptor GNSS, el procesador de navegación requiere las posiciones de los satélites del segmento espacial y las pseudodistancias del procesador de determinación de distancias del receptor.

Especificar parámetros de simulación

Cargue el archivo MAT que contiene la posición y la velocidad ground-truth de un vehículo terrestre que viaja hacia el campus de Natick, MA de The MathWorks, Inc.

Especifique el inicio, la parada y el tiempo de muestreo de la simulación. Además, especifique el ángulo de máscara, o ángulo de elevación mínimo, del receptor GNSS. Finalmente, especifique el archivo de mensajes de navegación RINEX para los parámetros orbitales iniciales del satélite.

% Load ground truth trajectory.
load("routeNatickMA.mat","lat","lon","pos","vel","lla0");
recPos = pos;
recVel = vel;

% Specify simulation times.
startTime = datetime(2021,6,24,8,0,0,"TimeZone","America/New_York");
simulationSteps = size(pos,1);
dt = 1;
stopTime = startTime + seconds((simulationSteps-1)*dt);

% Specify mask angle.
maskAngle = 5; % degrees

% Convert receiver position from north-east-down (NED) to geodetic
% coordinates.
receiverLLA = ned2lla(recPos,lla0,"ellipsoid");

% Specify the RINEX file.
rinexFile = "GODS00USA_R_20211750000_01D_GN.rnx";

% Set RNG seed to allow for repeatable results. 
rng("default");

Visualice el geoplot para la trayectoria de la ground-truth .

figure
geoplot(lat,lon)
geobasemap("topographic")
title("Ground Truth Trajectory")

Figure contains an axes object with type geoaxes. The geoaxes object contains an object of type line.

Simular posiciones de satélite a lo largo del tiempo

El objeto satelliteScenario le permite especificar parámetros orbitales iniciales y visualizarlos utilizando el objeto satelliteScenarioViewer. Este ejemplo utiliza satelliteScenario y un archivo RINEX con parámetros orbitales iniciales para simular las constelaciones GPS a lo largo del tiempo. Como alternativa, puede utilizar el objeto gnssconstellation que simula las posiciones de los satélites utilizando parámetros orbitales nominales o un archivo RINEX, y solo se necesita el tiempo de simulación actual para calcular las posiciones de los satélites.

% Create scenario.
sc = satelliteScenario(startTime, stopTime, dt);

% Initialize satellites. 
navmsg = rinexread(rinexFile);
satellite(sc,navmsg);
satID = sc.Satellites.Name;

% Preallocate results.
numSats = numel(sc.Satellites);
allSatPos = zeros(numSats,3,simulationSteps);
allSatVel = zeros(numSats,3,simulationSteps);

% Save satellite states over entire simulation.
for i = 1:numel(sc.Satellites)
    [oneSatPos, oneSatVel] = states(sc.Satellites(i),"CoordinateFrame","ecef");
    allSatPos(i,:,:) = permute(oneSatPos,[3 1 2]);
    allSatVel(i,:,:) = permute(oneSatVel,[3 1 2]);
end

Calcular pseudorangos

Utilice las posiciones de los satélites para calcular los pseudorangos y la visibilidad de los satélites a lo largo de la simulación. El ángulo de máscara se utiliza para determinar los satélites que son visibles para el receptor. Los pseudodistancias son las distancias entre los satélites y el receptor GNSS. Se utiliza el término pseudodistancia porque este valor de distancia se calcula multiplicando la diferencia de tiempo entre la hora actual del reloj del receptor y la señal del satélite con marca de tiempo por la velocidad de la luz.

% Preallocate results.
allP = zeros(numSats,simulationSteps);
allPDot = zeros(numSats,simulationSteps);
allIsSatVisible = false(numSats,simulationSteps);

% Use the skyplot to visualize satellites in view.
sp = skyplot([],[],MaskElevation=maskAngle);

for idx = 1:simulationSteps
    satPos = allSatPos(:,:,idx);
    satVel = allSatVel(:,:,idx);
    
    % Calculate satellite visibilities from receiver position.
    [satAz,satEl,allIsSatVisible(:,idx)] = lookangles(receiverLLA(idx,:),satPos,maskAngle);
    
    % Calculate pseudoranges and pseudorange rates using satellite and
    % receiver positions and velocities.
    [allP(:,idx),allPDot(:,idx)] = pseudoranges(receiverLLA(idx,:),satPos,recVel(idx,:),satVel);
    
    set(sp,"AzimuthData",satAz(allIsSatVisible(:,idx)), ...
        "ElevationData",satEl(allIsSatVisible(:,idx)), ...
        "LabelData",satID(allIsSatVisible(:,idx)))
    drawnow limitrate
end

Figure contains an object of type skyplot.

Estimar la posición del receptor a partir de pseudodistancias y posiciones de satélites

Por último, utilice las posiciones del satélite y los pseudodistancias para estimar la posición del receptor con la función receiverposition.

% Preallocate results.
lla = zeros(simulationSteps,3);
gnssVel = zeros(simulationSteps,3);
hdop = zeros(simulationSteps,1);
vdop = zeros(simulationSteps,1);

for idx = 1:simulationSteps
    p = allP(:,idx);
    pdot = allPDot(:,idx);
    isSatVisible = allIsSatVisible(:,idx);
    satPos = allSatPos(:,:,idx);
    satVel = allSatVel(:,:,idx);
    
    % Estimate receiver position and velocity using pseudoranges,
    % pseudorange rates, and satellite positions and velocities.
    [lla(idx,:),gnssVel(idx,:),hdop(idx,:),vdop(idx,:)] = receiverposition(p(isSatVisible),...
        satPos(isSatVisible,:),pdot(isSatVisible),satVel(isSatVisible,:));
end

Visualizar resultados

Grafique la posición ground-truth y la posición estimada del receptor en un geoplot.

figure
geoplot(lat,lon,lla(:,1),lla(:,2))
geobasemap("topographic")
legend("Ground Truth","Estimate")

Figure contains an axes object with type geoaxes. The geoaxes object contains 2 objects of type line. These objects represent Ground Truth, Estimate.

Trace el error absoluto en la estimación de la posición. El error se suaviza mediante una mediana móvil para que el gráfico sea más legible. El error en los ejes x y y es menor porque hay satélites a ambos lados del receptor. El error en el eje z es mayor porque sólo hay satélites encima del receptor, no debajo de él. El error cambia con el tiempo a medida que el receptor se mueve y algunos satélites aparecen y desaparecen de la vista.

estPos = lla2ned(lla,lla0,"ellipsoid");
winSize = floor(size(estPos,1)/10);
figure
plot(smoothdata(abs(estPos-pos),"movmedian",winSize))
legend("x","y","z")
xlabel("Time (s)")
ylabel("Error (m)")
title("Position (NED) Error")

Figure contains an axes object. The axes object with title Position (NED) Error, xlabel Time (s), ylabel Error (m) contains 3 objects of type line. These objects represent x, y, z.