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.

Analizar la visibilidad del satélite GNSS

Este ejemplo muestra cómo simular y analizar la visibilidad del satélite GNSS en posiciones y momentos de receptor específicos utilizando un archivo de almanaque o efemérides GNSS/GPS. Utilice los controles del script en vivo para configurar varios parámetros para la simulación del satélite.

Especificar parámetros de simulación

Especifique el tipo de archivo del mensaje de navegación, la hora de inicio, la duración en horas y el tiempo entre muestras en segundos de la simulación. Además, especifique la posición del receptor en coordenadas geodésicas y el ángulo de máscara, o ángulo de elevación mínimo, del receptor.

gnssFileType = "RINEX";
startTime = datetime(2021,06,24,04,00,00);
numHours = 24;
dt =60; % s
latitude =42.3013162; % deg
longitude = -71.3782972; % deg
altitude = 50; % m
recPos = [latitude longitude altitude]; % [deg deg m]
maskAngle = 5; % deg

Mostrar la posición del receptor GNSS.

geoplot(latitude,longitude,"x")
title("Receiver Position")

Figure contains an axes object with type geoaxes. The geoaxes contains a line object which displays its values using only markers.

Si utiliza archivos de mensajes de navegación RINEX, seleccione el sistema de satélite GNSS a analizar.

satSys = "GPS";
if gnssFileType == "RINEX"
    satSys = "GPS";
end

Obtener parámetros orbitales de satélites

Utilice la función auxiliar exampleHelperParseGNSSFile para obtener los parámetros orbitales iniciales del satélite y los identificadores del satélite de un archivo GNSS. Los datos de efemérides GPS, Galileo, BeiDou, NavIC y QZSS son válidos durante dos horas antes y después de la hora de las efemérides. Los datos de efemérides GLONASS y SBAS son válidos durante 15 minutos antes y después de la hora de las efemérides. En esas ventanas de tiempo válidas, puede utilizar los datos de efemérides con la función gnssconstellation como propagador de órbita para determinar las posiciones de los satélites en órbita con alta precisión. Por el contrario, si bien los datos del almanaque son válidos por un período de 90 días, sólo puedes utilizarlos para estimar las posiciones aproximadas de los satélites.

[navmsg,satIDs] = exampleHelperParseGNSSFile(gnssFileType,satSys);

Los archivos utilizados en este ejemplo están vinculados a la hora de inicio especificada startTime. Para utilizar diferentes archivos RINEX, utilice los archivos RINEX incluidos en el ejemplo Leer datos de navegación y observación del archivo RINEX. Para obtener ejemplos de cómo descargar y utilizar diferentes archivos de almanaque SEM y YUMA, consulte Leer datos de mensajes de navegación GPS del archivo SEM Almanac y Leer datos de mensajes de navegación GPS del archivo de almanaque YUMA, respectivamente.

Hay otros propagadores de órbita disponibles en el objeto satelliteScenario.

Una vez que tenga nuevos datos de efemérides o un archivo de almanaque, actualice la variable file de la función auxiliar exampleHelperParseGNSSFile para el caso que corresponda a su tipo de archivo.

Generar visibilidades satelitales

Primero, obtenga las posiciones de los satélites y una matriz de valores lógicos que determinan su visibilidad en startTime. Grafique los satélites visibles utilizando skyplot.

satPos = gnssconstellation(startTime,navmsg,GNSSFileType=gnssFileType);
[az,el,vis] = lookangles(recPos,satPos,maskAngle);
figure
skyplot(az(vis),el(vis),satIDs(vis),MaskElevation=maskAngle);

Figure contains an object of type skyplot.

Tenga en cuenta que la visibilidad de los satélites se determina a partir de la referencia del elipsoide WGS 84 y el corte de elevación maskAngle. Para simular la visibilidad de los satélites GNSS teniendo en cuenta el terreno y las obstrucciones locales, consulte los ejemplos Simule los efectos de trayectorias múltiples de GNSS en vuelos de VANT no tripulados en entornos urbanos y Simule los efectos de trayectorias múltiples de GNSS en un entorno de cañón urbano.

A continuación, utilizando los parámetros de simulación, genere las visibilidades del satélite como una matriz de valores lógicos. Cada fila de la matriz corresponde a un paso de tiempo y cada columna corresponde a un satélite. Para trazar las visibilidades, repita el vector de tiempo mientras calcula las posiciones de los satélites y los ángulos de visión basados ​​en la simulación de la constelación GNSS.

secondsPerHour = 3600;
timeElapsed = 0:dt:(secondsPerHour*numHours);
t = startTime+seconds(timeElapsed);

numSats = numel(satIDs);
numSamples = numel(t);
az = zeros(numSamples,numSats);
el = zeros(numSamples,numSats);
vis = false(numSamples,numSats);

sp = skyplot([],[],MaskElevation=maskAngle);

for ii = 1:numel(t)
    satPos = gnssconstellation(t(ii),navmsg,GNSSFileType=gnssFileType);
    [az(ii,:),el(ii,:),vis(ii,:)] = lookangles(recPos,satPos,maskAngle);
    set(sp,AzimuthData=az(ii,vis(ii,:)), ...
        ElevationData=el(ii,vis(ii,:)), ...
        LabelData=satIDs(vis(ii,:)))
    drawnow limitrate
end

Figure contains an object of type skyplot.

Representar los resultados

Utilice la matriz lógica para generar un gráfico de visibilidad de satélites y trace el número total de satélites visibles en cada paso de tiempo. En general, al menos cuatro satélites deben ser visibles para calcular una solución de posicionamiento.

visPlotData = double(vis);
visPlotData(visPlotData == false) = NaN; % Hide invisible satellites.
visPlotData = visPlotData + (0:numSats-1); % Add space to satellites to be stacked.
colors = colororder;

figure
plot(t,visPlotData,".",Color=colors(1,:))
yticks(1:numSats)
yticklabels(string(satIDs))
grid on
ylabel("Satellite ID")
xlabel("Time")
title("Satellite Visibility Chart")
axis tight

Figure contains an axes object. The axes object with title Satellite Visibility Chart, xlabel Time, ylabel Satellite ID contains 31 objects of type line. One or more of the lines displays its values using only markers

numVis = sum(vis,2);
figure
area(t,numVis)
grid on
xlabel("Time")
ylabel("Number of satellites visible")
title("Number of GNSS satellites visible")
axis tight

Figure contains an axes object. The axes object with title Number of GNSS satellites visible, xlabel Time, ylabel Number of satellites visible contains an object of type area.

Visibilidades multiconstelación

Algunos receptores GNSS utilizan múltiples sistemas de satélite para calcular la solución de posición. Para determinar la visibilidad de múltiples sistemas satelitales, utilice los parámetros de simulación startTime, recPos y maskAngle y un archivo de mensajes de navegación RINEX para cada uno de los sistemas satelitales GNSS.

allSatSys = ["GPS","Galileo","GLONASS","BeiDou","NavIC","QZSS","SBAS"];
satLetter = ["G","E","R","C","I","J","S"];

sp = skyplot([],[],MaskElevation=maskAngle);

for ii = 1:numel(allSatSys)
    satSys = allSatSys(ii);

    % Get the satellite positions of the current satellite system.
    [navmsg,satIDs] = exampleHelperParseGNSSFile("RINEX",satSys);
    satPos = gnssconstellation(startTime,navmsg);
    [az,el,vis] = lookangles(recPos,satPos,maskAngle);
    
    % Combine the satellite system symbol letter with the satellite ID.
    satIDLabel = arrayfun(@(x) sprintf("%c%02d",satLetter(ii),x),satIDs);
    
    % Create a categorical array to associate the current values with the
    % current satellite system in the skyplot.
    satGroup = categorical(repmat(ii,numel(satIDLabel),1),1:numel(allSatSys),allSatSys);
    
    % Update the skyplot.
    set(sp, ...
        AzimuthData=[sp.AzimuthData(:); az(vis)], ...
        ElevationData=[sp.ElevationData(:); el(vis)], ...
        LabelData=[sp.LabelData(:); satIDLabel(vis)], ...
        GroupData=[sp.GroupData; satGroup(vis)]);
end

% Add a legend to the skyplot.
legend

Figure contains an object of type skyplot.

Función de ayuda

Utilice la función auxiliar exampleHelperParseGNSSFile para obtener los parámetros orbitales iniciales del satélite y los identificadores de satélite del archivo GNSS, según el tipo de archivo.

function [navmsg,satIDs] = exampleHelperParseGNSSFile(gnssFileType,satSys)
    switch gnssFileType
        case "RINEX"
            switch satSys
                case "GPS"
                    file = "GODS00USA_R_20211750000_01D_GN.rnx";
                    navmsg = rinexread(file);
                    % For RINEX files, extract GPS data and use only the first entry for each satellite.
                    gpsData = navmsg.GPS;
                    [~,idx] = unique(gpsData.SatelliteID);
                    navmsg = gpsData(idx,:);
                case "Galileo"
                    file = "GODS00USA_R_20211750000_01D_EN.rnx";
                    navmsg = rinexread(file);
                    % For RINEX files, extract Galileo data and use only the first entry for each satellite.
                    galData = navmsg.Galileo;
                    [~,idx] = unique(galData.SatelliteID);
                    navmsg = galData(idx,:);
                case "GLONASS"
                    file = "GODS00USA_R_20211750000_01D_RN.rnx";
                    navmsg = rinexread(file);
                    % For RINEX files, extract GLONASS data and use only the first entry for each satellite.
                    gloData = navmsg.GLONASS;
                    [~,idx] = unique(gloData.SatelliteID);
                    navmsg = gloData(idx,:);
                case "BeiDou"
                    file = "GODS00USA_R_20211750000_01D_CN.rnx";
                    navmsg = rinexread(file);
                    % For RINEX files, extract BeiDou data and use only the first entry for each satellite.
                    bdsData = navmsg.BeiDou;
                    [~,idx] = unique(bdsData.SatelliteID);
                    navmsg = bdsData(idx,:);
                case "NavIC"
                    file = "ARHT00ATA_R_20211750000_01D_IN.rnx";
                    navmsg = rinexread(file);
                    % For RINEX files, extract NavIC data and use only the first entry for each satellite.
                    irnData = navmsg.NavIC;
                    [~,idx] = unique(irnData.SatelliteID);
                    navmsg = irnData(idx,:);
                case "QZSS"
                    file = "ARHT00ATA_R_20211750000_01D_JN.rnx";
                    navmsg = rinexread(file);
                    % For RINEX files, extract QZSS data and use only the first entry for each satellite.
                    qzsData = navmsg.QZSS;
                    [~,idx] = unique(qzsData.SatelliteID);
                    navmsg = qzsData(idx,:);
                case "SBAS"
                    file = "GOP600CZE_R_20211750000_01D_SN.rnx";
                    navmsg = rinexread(file);
                    % For RINEX files, extract SBAS data and use only the first entry for each satellite.
                    sbaData = navmsg.SBAS;
                    [~,idx] = unique(sbaData.SatelliteID);
                    navmsg = sbaData(idx,:);
            end
            satIDs = navmsg.SatelliteID;
        case "SEM"
            file = "semalmanac_2021-6-22.al3";
            navmsg = semread(file);
            satIDs = navmsg.PRNNumber;
        case "YUMA"
            file = "yumaalmanac_2021-6-22.alm";
            navmsg = yumaread(file);
            satIDs = navmsg.PRN;
    end
end