Постройте график положения приемника GNSS с использованием Live NMEA Data или файла журнала NMEA

В этом примере показано, как проанализировать информацию из предложений NMEA и использовать полученную информацию для построения графика местоположения. В этом примере вы используете nmeaParser системный объект, доступный в Navigation Toolbox для:

  • Получите широту и долготу из живых данных, полученных от приемника GNSS, и постройте график местоположения в карте.

  • Получите широту и долготу из предложений NMEA, сохраненных в файле журнала, и постройте график местоположения на карте.

  • Получите информацию о положении спутников в поле зрения и постройте график данных по азимуту и повышению спутника с помощью skyplot.

Постройте график местоположения с использованием Live NMEA данных от приемника GNSS

Вы можете считать местоположение, заданное приемником GNSS, подключенным к главному ПК, и построить график данных местоположения в реальном времени. Широта и долгота, используемые для построения графика, могут быть получены из нескольких предложений NMEA. В этом разделе мы используем предложения RMC, полученные от приемника, чтобы извлечь широту и долготу.

Необходимое оборудование

  • Модуль Ublox NEO-6M GPS

  • Преобразователи последовательного сигнала в USB, такие как FTDI (если модуль GPS не может быть непосредственно подключен к компьютеру с помощью USB)

Setup оборудования

Если на приемнике имеется разъем USB, используйте кабель USB, чтобы подключить модуль непосредственно к хосту-компьютеру с установленным Navigation Toolbox и установить необходимые драйверы для модуля. В противном случае используйте последовательные преобразователи в USB для преобразования последовательных передач в сигналы USB.

Приемники GNSS требуют, чтобы спутниковые сигналы определяли информацию о положении. Сигналы легко получаются в местах, которые имеют четкий вид неба. Убедитесь, что вы держите модуль или антенну приемник таким образом, чтобы она получила четкое представление о небе. Приемнику может потребоваться некоторое время, чтобы получить сигналы.

Подключение к приемнику и анализ данных NMEA

Создайте соединение с последовательным портом, где соединяется приемник GNSS путем определения port и baudrate.

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

Создайте объект nmeaParser путем определения идентификатора сообщения для предложения, которое будет проанализировано как «RMC»

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

Считайте значения, полученные от приемника, проанализируйте значение, чтобы получить широту и долготу, и постройте график местоположения на карте вместе с временным штампом на длительность, заданное как 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

Постройте расположение путем чтения предложений NMEA, сохраненных в файле журнала

В этом разделе показано, как считать данные приемника GNSS в формате NMEA, зарегистрированном в текстовом файле, проанализировать необработанные данные, чтобы получить информацию о местоположении и построить график местоположения, полученного на карте. Широта и долгота, используемые для построения графика, могут быть получены из нескольких предложений NMEA. В этом разделе мы используем предложение GGA для расширения широты и долготы.

Откройте файл журнала, включенный в этот пример, и прочитайте данные из файла.

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

Создайте объект nmeaParser путем определения идентификатора сообщения как GGA. Используйте объект nmeaParser, чтобы проанализировать данные, считанные из файла журнала.

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

Считайте местоположение из проанализированного значения и постройте график местоположения на карте, чтобы увидеть путь, пройденный приемником 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';

Постройте положение спутника с помощью skyplot

В этом разделе вы считываете информацию о положении спутника из предложений GSV, хранящихся в файле журнала NMEA, и строите график азимута и данных о повышении с помощью skyplot.

Откройте файл журнала, включенный в этот пример, и прочитайте данные из файла.

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

Создайте объект nmeaParser, задающий идентификатор сообщения как GSV. Используйте объект nmeaParser, чтобы проанализировать данные, считанные из файла журнала.

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

Считайте азимут и повышение из проанализированных данных и постройте график положения спутника с помощью skyplot. Полная спутниковая информация может быть доступна в нескольких предложениях GSV. В этом разделе мы комбинируем всю информацию о спутниках за цикл перед построением графика.

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

См. также