主要内容

使用NMEA实时数据或NMEA日志文件绘制GNSS接收机位置

这个例子展示了如何从NMEA句子中解析信息,并使用获得的信息来绘制位置。在本例中,使用nmeaParser“导航工具箱”中可用的系统对象:

  • 从GNSS接收机获得的实时数据中获取纬度和经度,并在地图上绘制位置。

  • 从存储在日志文件中的NMEA句子中获取纬度和经度,并在地图中绘制位置。

  • 获取观测卫星的位置信息,绘制卫星方位角和高程数据skyplot

使用来自GNSS接收机的实时NMEA数据进行定位

您可以读取与主机PC相连的GNSS接收机给出的位置,并绘制实时位置数据。用于绘制位置的纬度和经度可以从多个NMEA语句中获得。在本节中,我们使用从接收器获得的RMC句子来提取纬度和经度。

所需的硬件

  • Ublox NEO-6M GPS模块

  • 串行转USB信号转换器,如FTDI(如果GPS模块不能使用USB直接连接到计算机)

硬件设置

如果接收器上有USB连接器,请使用USB电缆将模块直接连接到安装了导航工具箱的主机,并为模块安装所需的驱动程序。否则,使用串行转USB转换器,将串行传输转换为USB信号。

GNSS接收机需要卫星信号来确定位置信息。在天空视野清晰的地方,信号很容易获得。确保保持模块或接收天线的位置,使其能够清楚地看到天空。接收器可能需要一些时间来获取信号。

连接到接收器并解析NMEA数据

属性,创建到GNSS接收机所连接的串口的连接港口而且波特率

创建一个串行对象。端口=“com8”;波特率= 9600;gpsObj = serialport(端口,波特率);

通过指定要解析的句子的Message ID为“RMC”来创建一个nmeaParser对象

parserObj = nmeaParser(“消息id”“RMC”);

读取从接收器获得的值,解析该值以获得纬度和经度,并在timeOut指定的持续时间内在地图上绘制位置和时间戳。

An = [];timeOut = 10;Ts = tic;(toc (ts) <超时)逐行从串行对象中读取。data = readline(gpsObj);rmcData = parserObj(data);% Status = 0,表示输入的NMEA语句是有效的RMC%的句子。如果rmcData。fixStatus = rmcData.FixStatus;纬度= rmcData.Latitude;longitude = rmcData.Longitude;gpsTime = rmcData.UTCDateTime;在地理坐标中绘制位置。geoplot(纬度、经度、“标记”“钻石”“MarkerSize”10“颜色”“b”...“MarkerFaceColor”“r”);选择底图。geobasemap街道修复状态A表示获取的卫星修复。如果fixStatus = =“一个”调整当前地理轴的地理限制。geolimits(纬度- 2.5,+ 2.5纬度,经度(经度- 2.5,+ 2.5]);TXT = strcat(时间戳:“字符串(gpsTime));其他的txt =“没有解决”结束图形上的%更新时间或修复状态。删除(一个);An =注释(“文本框”, [0.005, 0.98, 0.6, 0.01],“FitBoxToText”“上”...“字符串”三种,“颜色”“蓝”“字形大小”10);结束结束

通过读取存储在日志文件中的NMEA句子来绘制位置

介绍如何读取文本文件中NMEA格式的GNSS接收机数据,解析原始数据获取位置信息,并在地图中绘制位置。用于绘制位置的纬度和经度可以从多个NMEA语句中获得。在本节中,我们使用GGA语句来提取经纬度。

打开本例中包含的日志文件,并从该文件中读取数据。

以读权限打开文件gpsLog.txt。fileID = fopen(“gpsLog.txt”“r”);读取文本文件。gpsData = fscanf(fileID,“% c”);

通过指定消息ID为GGA来创建nmeaParser对象。使用nmeaParser对象解析从日志文件中读取的数据。

parserObj = nmeaParser(“消息id”“GGA”);解析NMEA数据。ggaData = parserObj(gpsData);

从解析值中读取位置并在地图中绘制位置,以查看GNSS接收机所经过的路径。

初始化变量。latVector = 0(1,数字(ggaData));lonVector = 0(1,数字(ggaData));i = 1:长度(ggaData)检查解析的GGA句子是否有效,如果有效,则获取%纬度和经度。Status = 0,%表示数据有效如果ggaData(我)。latVector(i) = ggaData(i).Latitude;lonVector(i) = ggaData(i).Longitude;结束结束删除经纬度数据中的Nan值(如果有的话)。nmeaParser对象如果一个值在句子中不可用,%返回NaN。%例如,纬度和经度数据不可用卫星修复。latVector = latVector(~isnan(latVector));lonVector = lonVector(~isnan(lonVector));在地理坐标中绘制位置geoplot (latVector lonVector,“标记”“*”“MarkerSize”3,...“颜色”“蓝”“MarkerFaceColor”“红色”);选择底图geobasemap“地形”

利用天图绘制卫星位置

在本节中,您将从存储在NMEA日志文件中的GSV语句中读取卫星位置信息,并使用方位角和仰角数据绘图skyplot

打开本例中包含的日志文件,并从该文件中读取数据。

以读权限打开文件gpsLog.txtfileID = fopen(“gpsLog2.txt”“r”);读取文本文件gpsData = fscanf(fileID,“% c”);

创建nmeaParser对象,指定消息ID为GSV。使用nmeaParser对象解析从日志文件中读取的数据。

parserObj = nmeaParser(“消息id”“GSV”);解析NMEA数据gsvData = parserObj(gpsData);

从解析数据中读取方位角和仰角,并使用天空图绘制卫星位置。完整的卫星信息可以在多个GSV句子中获得。在本节中,我们在绘制它们之前将每个周期的所有卫星信息结合起来。

Az = [];El = [];satID = [];prevSentenceNumber = 0;创建一个空天图Sp = skyplot([], [],[]);dataCount = 1: number (gsvData)GPS帧的完整卫星信息可能为%可在多个GSV句子中使用。GSV中的各个字段%句可以用来将信息组合成一个单一的框架。在这个例子中,我们使用了句子数和卫星数%视图来组合信息。GSV数据的SentenceNumber对于给定的GPS数据帧和total, %是顺序的方位角和高程数据的百分比应与卫星相等%视图。如果gsvData (dataCount)。SentenceNumber == prevSentenceNumber + 1 az = [az, gsvData(dataCount).方位角];el = [el, gsvData(dataCount).Elevation];satID = [satID, gsvData(dataCount). satellite];prevSentenceNumber = gsvData(dataCount).SentenceNumber;satellite itesinview = gsvData(数据账户). satellite itesinview;一旦GPS帧中的所有卫星信息获得,使用天图绘制卫星位置如果编号(az) == satellite itesinview &&编号(el) == satellite itesinview set(sp)“AzimuthData”阿兹,“ElevationData”埃尔,“LabelData”, satID);drawnow;Az = [];El = [];satID = [];prevSentenceNumber = 0;暂停只是为了看卫星位置的变化。%图暂停(2);结束其他的Az = [];El = [];satID = [];prevSentenceNumber = 0;结束结束

另请参阅