Main Content

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

Trazar la posición del receptor GNSS utilizando datos NMEA en vivo o un archivo de registro NMEA

Este ejemplo muestra cómo analizar información de oraciones NMEA y utilizar la información obtenida para trazar la ubicación. En este ejemplo, utiliza el System object nmeaParser disponible en Navigation Toolbox para:

  • Obtenga la latitud y longitud de los datos en vivo obtenidos de un receptor GNSS y trace la ubicación en un mapa.

  • Obtenga la latitud y longitud de las sentencias NMEA almacenadas en un archivo de registro y trace la ubicación en un mapa.

  • Obtenga la información de posición de los satélites a la vista y trace los datos de elevación y acimut del satélite usando skyplot.

Trazar la ubicación utilizando datos NMEA en vivo desde un receptor GNSS

Puede leer la ubicación proporcionada por el receptor GNSS conectado a la PC host y trazar los datos de ubicación en vivo. La latitud y longitud utilizadas para trazar la ubicación se pueden obtener a partir de múltiples sentencias NMEA. En esta sección, utilizamos las sentencias RMC obtenidas del receptor para extraer la latitud y la longitud.

Hardware requerido

  • Módulo GPS Ublox NEO-6M

  • Convertidores de señal de serie a USB como FTDI (si el módulo GPS no se puede conectar directamente a la computadora mediante USB)

"Configuración de hardware"

Si hay un conector USB disponible en el receptor, use un cable USB para conectar el módulo directamente a la computadora host con Navigation Toolbox instalado e instale los controladores necesarios para el módulo. De lo contrario, utilice convertidores de serie a USB para convertir las transmisiones en serie a señales USB.

Los receptores GNSS requieren señales de satélite para determinar la información de posición. Las señales se adquieren fácilmente en lugares que tienen una vista despejada del cielo. Asegúrese de mantener el módulo o la antena del receptor de tal manera que tenga una vista clara del cielo. El receptor puede tardar algún tiempo en adquirir señales.

Conectarse al receptor y analizar datos NMEA

Cree una conexión al puerto serie donde está conectado el receptor GNSS especificando port y baudrate.

% Create a serial object.
port = 'com8';
baudrate = 9600;
gpsObj = serialport(port,baudrate);

Cree un objeto nmeaParser especificando el ID de mensaje de la sentencia que se analizará como "RMC"

parserObj = nmeaParser("MessageId","RMC");

Lea los valores obtenidos del receptor, analice el valor para obtener la latitud y la longitud y trace la ubicación en un mapa junto con la marca de tiempo, durante un período especificado por timeOut.

an = [];
timeOut = 10;
ts = tic;
while(toc(ts)<timeOut)
    % Read line by line from the serial object.
    data = readline(gpsObj);
    rmcData = parserObj(data);
    % Status = 0, indicates, the input NMEA sentence is an valid RMC
    % sentence.
    if rmcData.Status == 0
        fixStatus = rmcData.FixStatus;
        latitude = rmcData.Latitude;
        longitude = rmcData.Longitude;
        gpsTime = rmcData.UTCDateTime;
        % Plot the position in geographic coordinates.
        geoplot(latitude,longitude,'Marker',"diamond",'MarkerSize',10,'Color','b', ...
            'MarkerFaceColor','r');
        % Selects the basemap.
        geobasemap streets;
        % Fix Status A represents the satellite fix is obtained.
        if fixStatus == "A"
            % Adjust the geographic limits of the current geographic axes.
            geolimits([latitude-2.5,latitude+2.5],[longitude-2.5,longitude+2.5]) ;
            txt = strcat("Timestamp: ",string(gpsTime));
        else
            txt =  "No Fix";
        end
        % Update time or Fix Status on the figure.
        delete(an);
        an = annotation('textbox', [0.005, 0.98, 0.6, 0.01], 'FitBoxToText','on', ...
            'string', txt,'Color','blue','FontSize',10);
    end
end

Trazar la ubicación leyendo sentencias NMEA almacenadas en un archivo de registro

Esta sección muestra cómo leer los datos del receptor GNSS en formato NMEA registrados en un archivo de texto, analizar los datos sin procesar para obtener la información de ubicación y trazar la ubicación obtenida en el mapa. La latitud y longitud utilizadas para trazar la ubicación se pueden obtener a partir de múltiples sentencias NMEA. En esta sección, utilizamos la sentencia GGA para extraer la latitud y la longitud.

Abra el archivo de registro incluido con este ejemplo y lea los datos del archivo.

% Opens the file gpsLog.txt with read access.
fileID = fopen('gpsLog.txt','r');
% Read the text file.
gpsData = fscanf(fileID,'%c');

Cree el objeto nmeaParser especificando el ID del mensaje como GGA. Utilice el objeto nmeaParser para analizar los datos leídos del archivo de registro.

parserObj = nmeaParser('MessageId','GGA');
% Parse the NMEA Data.
ggaData = parserObj(gpsData);

Lea la ubicación a partir del valor analizado y trace la ubicación en el mapa para ver la ruta recorrida por el receptor GNSS.

% Initialize variables.
latVector = zeros(1,numel(ggaData));
lonVector = zeros(1,numel(ggaData));
for i=1:length(ggaData)
    % Check if the parsed GGA sentences are valid and if they are valid, get the
    % latitude and longitude from the output structures. Status = 0,
    % indicates the data is valid
    if ggaData(i).Status == 0
        latVector(i) = ggaData(i).Latitude;
        lonVector(i) = ggaData(i).Longitude;
    end
end
% Remove Nan value in latitude and longitude data, if any nmeaParser object
% returns NaN for a value if the value is not available in the sentence.
% For example, latitude and longitude data are not available if there is no
% satellite fix.
latVector = latVector(~isnan(latVector));
lonVector = lonVector(~isnan(lonVector));

% Plot the position in geographic coordinates
geoplot(latVector,lonVector,'Marker',"*",'MarkerSize',3, ...
    "Color",'blue','MarkerFaceColor','red');
% Selects the basemap
geobasemap 'topographic';

Trazar la posición del satélite usando skyplot

En esta sección, leerá la información de posición del satélite de las sentencias GSV almacenadas en un archivo de registro NMEA y trazará los datos de acimut y elevación usando skyplot.

Abra el archivo de registro incluido con este ejemplo y lea los datos del archivo.

% Opens the file gpsLog.txt with read access
fileID = fopen('gpsLog2.txt','r');
% Read the text file
gpsData = fscanf(fileID,'%c');

Cree el objeto nmeaParser especificando el ID del mensaje como GSV. Utilice el objeto nmeaParser para analizar los datos leídos del archivo de registro.

parserObj = nmeaParser('MessageId','GSV');
% Parse the NMEA Data
gsvData = parserObj(gpsData);

Lea el acimut y la elevación de los datos analizados y trace la posición del satélite utilizando skyplot. La información satelital completa puede estar disponible en múltiples oraciones GSV. En esta sección, combinamos toda la información de los satélites por ciclo antes de trazarlos.

az = []; el = []; satID = []; prevSentenceNumber = 0;
% Create an empty skyplot
sp = skyplot([], [],[]);
for dataCount = 1:numel(gsvData)
    % The complete satellite information for the GPS frame might be
    % available in multiple GSV sentences. The various fields in the GSV
    % sentence can be used to combine the information into a single frame.
    % In this example, we use sentence number and number of satellites in
    % view to combine the information. The SentenceNumber of the GSV data
    % is expected to be sequential for a given frame of GPS data and total
    % number of azimuth and elevation data should be equal to satellites
    % in view.
    if gsvData(dataCount).SentenceNumber == prevSentenceNumber + 1
        az = [az, gsvData(dataCount).Azimuth];
        el = [el, gsvData(dataCount).Elevation];
        satID = [satID, gsvData(dataCount).SatelliteID];
        prevSentenceNumber = gsvData(dataCount).SentenceNumber;
        satellitesinView = gsvData(dataCount).SatellitesInView;
        % Once all the satellite information in a GPS frame is obtained,
        % plot the  satellite position using skyplot
        if numel(az) == satellitesinView && numel(el) == satellitesinView
            set(sp, 'AzimuthData', az, 'ElevationData', el,'LabelData', satID);
            drawnow;
            az = []; el = []; satID = []; prevSentenceNumber = 0;
            % The pause is just to see the satellite position changes in
            % the plot
            pause(2);
        end
    else
        az = []; el = []; satID = []; prevSentenceNumber = 0;
    end
end

Consulte también