В этом примере показано, как проанализировать информацию из предложений NMEA и использовать полученную информацию для построения графика местоположения. В этом примере вы используете nmeaParser
системный объект, доступный в Navigation Toolbox для:
Получите широту и долготу из живых данных, полученных от приемника GNSS, и постройте график местоположения в карте.
Получите широту и долготу из предложений NMEA, сохраненных в файле журнала, и постройте график местоположения на карте.
Получите информацию о положении спутников в поле зрения и постройте график данных по азимуту и повышению спутника с помощью skyplot
.
Вы можете считать местоположение, заданное приемником 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
В этом разделе показано, как считать данные приемника 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';
В этом разделе вы считываете информацию о положении спутника из предложений 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