主要内容

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

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

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

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

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

使用来自GNSS接收器的实时NMEA数据的Plot Location

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

所需的硬件

  • Ublox NEO-6M GPS模块

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

硬件设置

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

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

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

通过指定创建到连接GNSS接收器的串口的连接港口波特率

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

通过指定要被解析为“RMC”的句子的消息ID来创建一个nmeparser对象

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

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

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

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

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

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

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

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

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

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

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

使用skyplot绘制卫星位置

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

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

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

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

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

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

阿兹= [];el = [];satID = [];prevSentenceNumber = 0;创建一个空的天空图Sp = skyplot([], [],[]);dataCount = 1:元素个数(gsvData)% GPS框架的完整卫星信息可能是%可用在多个GSV句子中。GSV中的各个字段句子可以用来把信息组合成一个单独的框架。在这个例子中,我们使用了句子数和卫星数%视图以组合信息。GSV数据的SentenceNumber%对于给定的一帧GPS数据和总数,预计是顺序的方位角和仰角数据的百分数应与卫星数相等%的观点。如果gsvData (dataCount)。SentenceNumber == prevSentenceNumber + 1 az = [az, gsvData(dataccount).Azimuth];el = [el, gsvData(dataccount).Elevation];satd = [satd, gsvData(dataccount).卫星id];prevSentenceNumber = gsvData (dataCount) .SentenceNumber;satellitesinView = gsvData (dataCount) .SatellitesInView;一旦获得了GPS框架中的所有卫星信息,使用skyplot绘制卫星位置如果numel(el) ==卫星inview && numel(el) ==卫星inview“AzimuthData”阿兹,“ElevationData”埃尔,“LabelData”, satID);drawnow;阿兹= [];el = [];satID = [];prevSentenceNumber = 0;暂停只是为了查看卫星位置的变化%的情节暂停(2);结束其他的阿兹= [];el = [];satID = [];prevSentenceNumber = 0;结束结束

另请参阅