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")

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);

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

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

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

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

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







