主要内容

nmeaParser

从海洋电子设备发送的标准和制造商特定的NMEA语句中解析数据

描述

nmeaParser系统对象™解析来自任何NMEA(国家海洋电子协会)句子的数据。需要解析数据的句子可以是符合NMEA 0183的任何标准句子®规范(由GNSS(全球导航卫星系统)接收器发送),或由NMEA批准的其他制造商特定语句(由其他海上电子设备发送)。

nmeaParser系统对象提供:

  • 内置支持解析从GN金宝appSS接收器发送的数据,并由这9种NMEA消息类型识别:RMC, GGA, GSA, VTG, GLL, GST, ZDA, GSV和HDT

  • 使用CustomSentence名称-值对来解析来自多个设备类别的NMEA数据,包括来自不同硬件制造商的特定制造商语句

从NMEA句子中解析数据:

  1. 创建nmeaParser对象并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

有关系统对象如何工作的详细信息,请参见什么是系统对象?

nmeaParser系统对象输出一个结构数组,对应于从指定的NMEA语句中提取的值。

创建

描述

pnmea= nmeaParser返回一个nmeaParser系统对象,pnmea,具有默认属性,从这些标准NMEA消息中提取数据:RMC、GGA和GSA。在提取的输出数据中,结构数组的顺序也是:RMC、GGA和GSA。

例子

pnmea= nmeaParser("MessageIDs", " msgID ")返回一个nmeaParser系统对象,pnmea,它从内置支持的九个标准NMEA消息之一提取数据,使用Message id指定。金宝app指定是否作为“RMC”“GGA”“GSA”“GSV”“VTG”“房地产”“消费税”“ZDA”,“热变形”,或这些id的组合(例如:[" VTG”、“房地产”、“热变形”)).指定Message id的顺序决定了提取的输出数据中结构数组的顺序。默认值为[" RMC”、“GGA”、“GSA”)

例子

pnmea= nmeaParser("CustomSentence", {['CustomMessageId1','parserFunctionName1'],['CustomMessageId2','parserFunctionName2']})设置属性。CustomSentence名称-值对返回nmeaParser系统对象,pnmea,它从任何自定义NMEA消息(标准NMEA消息或特定于制造商的NMEA消息)中提取数据,使用消息id指定。

CustomSentence名称-值对接受一个嵌套的单元格数组,其中每个元素都是一对消息ID名称(标准NMEA消息ID名称或特定于制造商的消息ID)和相应的用户定义解析器函数,该函数通过包含extractNMEASentence函数文件中的函数。指定消息id的顺序决定了提取的输出数据中结构数组的顺序。

例子

pnmea= nmeaParser("MessageIDs", {'msgID1','msgID2'},"CustomSentence", {['CustomMessageId1','parserFunctionName1'],['CustomMessageId2','parserFunctionName2']})返回一个nmeaParser系统对象,pnmea,它可以从内置支持的九个标准NMEA消息中的两个消息提取数据,也可以从您使用金宝appCustomSentence名称-值对。

输入参数

全部展开

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

例子:pnmea = nmeaParser("CustomSentence", {['CustomMessageId1','parserFunctionName1'],['CustomMessageId2','parserFunctionName2']});

指定要从中提取数据的任何NMEA句子的消息ID和解析器函数的名称。可以将多个消息id和解析器函数指定为字符向量的单元格数组。解析器函数定义在函数文件中,该函数文件可以选择包含extractNMEASentence函数。

请注意

解析器函数的函数文件必须存在于当前目录或MATLAB路径中。

CustomSentence接受函数名或函数句柄。例如,这两种格式都是有效的:

  • pnmea = nmeaParser(“CustomSentence”, {“standardnmeaMessageId1”“parserFunctionName1”]}
  • parserFunctionHandle=@parserFunctionName1 pnmea = nmeaParser(“CustomSentence”, {“standardnmeaMessageId1”parserFunctionHandle]}

请注意

使用CustomSentence使用名称-值对来解析数据,而不是使用内置解析器函数,结果是在解析数据时覆盖默认字段。例如,nmeaParser (CustomSentence,{}(“RMC”、“parserRMC”))覆盖已解析数据的默认格式,因为RMC是内置支持数据解析的9个句子之一。金宝app

数据类型:字符|字符串

属性

全部展开

除非另有说明,属性为nontunable,这意味着在调用对象后不能更改它们的值。对象在调用时锁定,而释放功能解锁它们。

如果属性为可调,您可以随时更改其值。

有关更改属性值的详细信息,请参见使用系统对象的MATLAB系统设计

内置支持的九个NMEA句子的消息id,符合NMEA 0183标准,从中提取数据。金宝app您可以将多个消息id指定为字符串数组,以便从NMEA语句中提取数据。

数据类型:字符|字符串

使用

描述

例子

rmcDataggaDatagsaDatavtgDatagllDatagstDatagsvDatazdaDatahdtData] = pnmea(rawData解析来自内置支持的9个标准NMEA句子的数据,并返回一个结构数组,其中每个结构对应一个Message ID。金宝app属性时为输出参数指定的序列必须与为Message id指定的序列相同nmeaParser系统对象。

例子

customNmeaData1customNmeaData2] = pnmea(rawData解析来自两个自定义NMEA句子(标准NMEA句子或特定于制造商的NMEA句子)的数据,并返回一个结构数组,其中每个结构对应一个单独的Message ID。属性中指定的输出参数序列必须与CustomSentence属性时的名称值对nmeaParser系统对象。

输入参数

全部展开

从船舶电子设备上获得的符合NMEA标准的NMEA数据。

数据类型:字符串|字符

输出参数

全部展开

数据提取自RMC语句。输出结构包含从RMC句子解析的信息以及解析状态。如果在输入数据中发现多个RMC句子,则返回一个结构数组。详情请参见RMC的句子

从GGA语句中提取的数据。输出结构包含从GGA句子解析的信息以及解析状态。如果在输入数据中发现多个GGA句子,则返回一个结构数组。详情请参见GGA句子

从GSA语句中提取的数据。输出结构包含从GSA句子解析的信息以及解析状态。如果在输入数据中发现多个GSA句子,则返回一个结构数组。详情请参见GSA的句子

从VTG语句中提取的数据。输出结构包含从VTG句子解析的信息以及解析状态。如果在输入数据中发现多个VTG句子,则返回一个结构数组。详情请参见VTG句子

数据提取自一个GLL句子。输出结构包含从GLL句子解析出来的信息以及解析状态。如果在输入数据中发现多个GLL句子,则返回一个结构数组。详情请参见GLL句子

从GST句子中提取的数据。输出结构包含从GST句子解析的信息以及解析状态。如果在输入数据中发现多个GST句子,则返回一个结构数组。详情请参见销售税的句子

从GSV句子中提取的数据。输出结构包含从GSV句子解析的信息以及解析状态。完整的卫星信息可在多个gsvData结构。每个gsvData结构最多可以包含4个卫星信息。详情请参见GSV句子

从ZDA语句中提取的数据。输出结构包含从ZDA句子解析的信息以及解析状态。如果在输入数据中找到多个ZDA句子,则返回一个结构数组。详情请参见ZDA句子

从HDT句子中提取的数据。输出结构包含从HDT句子解析出来的信息以及解析状态。如果在输入数据中发现多个HDT句子,则返回一个结构数组。详情请参见热变形的句子

数据从任何标准或制造商特定的NMEA语句中提取。输出结构包含从自定义句子解析的信息以及解析状态。如果在输入数据中发现相同NMEA消息类型的多个句子,则返回结构数组。

对象的功能

要使用对象函数,请将System对象指定为第一个输入参数。例如,释放system对象的系统资源obj,使用这种语法:

发行版(obj)

例子

全部折叠

使用MessageID属性从9个标准NMEA句子中提取数据作为内置支持的一部分。金宝appNMEA数据来自GNSS接收机。

从RMC语句中提取数据

创建一个nmeaParser系统对象,指定Message ID为“RMC”。

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

提供从GNSS接收机获得的RMC语句作为输入和提取数据。

unparsedRMCLine =GNRMC美元,143909.00,,5107.0020216,N, 11402.3294835 W, 0.036,348.3, 210307年0.0,E, A * 31的;rmcData = pnmea(unparsedRMCLine)
rmcData =带字段的结构:TalkerID: "GN" MessageID: "RMC" FixStatus: 'A'纬度:51.1167经度:-114.0388 GroundSpeed: 0.0185 TrueCourseAngle: 348.3000 UTCDateTime: 21 mar -2007 14:39:09.000 MagneticVariation: 0 ModeIndicator: 'A' NavigationStatus: "NA" Status: 0

从多个NMEA消息类型中提取数据

提供GGA, GSA, RMC句子作为输入。

unparsedGGALine = [GPGGA美元,111357.771、5231.364 N, 01324.240, E, 1, 12日,1.0,0.0米,0.0米,,* 69的];unparsedGSALine = [“GPGSA美元,3、01、02、03、04、05、06、07、08、09、10、11、12日,1.0,1.0,1.0 * 30];unparsedRMCLine = [GPRMC美元,111357.771,,5231.364,N, 01324.240, E, 10903, 221.5, 020620年000.0 W * 44的];

创建一个包含这三个句子的字符串数组

rawNMEAData = [unparsedGGALine,newline, unparsedGSALine,newline, unparsedRMCLine]
rawNMEAData = '$GPGGA,111357.771,5231.364,N,01324.240,E,1,12,1.0,0.0,M,0.0,M,,*69 $GPGSA,A,3,01,02,03,04,05,06,07,08,09,10,11,12,1.0,1.0,1.0*30 $GPRMC,111357.771,A,5231.364,N,01324.240,E,10903,221.5,020620,000.0,W*44'

但是,考虑到您只需要从GGA和GSA句子中提取数据。因此,创建nmeaParser系统对象'pnmea',并指定'GGA'和'GSA'消息id作为字符串数组。

pnmea = nmeaParser (“消息id”, (“GGA”“GSA”]);

为所有三个句子指定输出参数,以将数据提取为结构。

[ggaData, gsata] = pnmea(rawNMEAData)
ggaData =带字段的结构:TalkerID: "GP" MessageID: "GGA" UTCTime: 11:13:57.771纬度:52.5227经度:13.4040 QualityIndicator: 1 numsatellite itesinuse: 12 HDOP: 1海拔:0 GeoidSeparation: 0 ageofdifferaldata: NaN differalreferencestationid: NaN Status: 0
gsaData =带字段的结构:TalkerID: "GP" MessageID: "GSA" Mode: "A" FixType: 3 satellite itesidnumber: [1 2 3 4 5 6 7 8 9 10 11 12] PDOP: 1 VDOP: 1 HDOP: 1 SystemID: NaN Status: 0

上面的输出显示,仅根据指定为输入的Message id提取GGA和GSA句子。

提供另一个GGA句子作为额外的输入,并提取数据。在这种情况下,您不需要修改System对象,因为Message ID没有改变。

unparsedGGALine1 =GNGGA美元,001043.00、4404.14036 N, 12118.85961 W, 1, 12日,0.98,1113.0米,-21.3米,,* 47的
unparsedGGALine1 = '$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M,,*47'
rawNMEAData = [unparsedGGALine,newline, unparsedGSALine,newline, unparsedGGALine1]
rawNMEAData = ' GPGGA美元,111357.771、5231.364 N, 01324.240, E, 1, 12日,1.0,0.0米,0.0米,,* GPGSA(69美元),A, 3, 01、02、03、04、05、06、07、08、09、10、11、12日,1.0,1.0,1.0 * GNGGA(30美元),001043.00,4404.14036,N, 12118.85961 W, 1, 12日,0.98,1113.0米,-21.3米,,* 47的
[ggaData, gsata] = pnmea(rawNMEAData)
ggaData =2×1包含字段的struct数组:TalkerID MessageID UTCTime纬度经度QualityIndicator numsatellite itesinuse HDOP高度GeoidSeparation ageofdifferaldata differalreferencestationid状态
gsaData =带字段的结构:TalkerID: "GP" MessageID: "GSA" Mode: "A" FixType: 3 satellite itesidnumber: [1 2 3 4 5 6 7 8 9 10 11 12] PDOP: 1 VDOP: 1 HDOP: 1 SystemID: NaN Status: 0

一种状态0表示数据解析成功。

从GSV句子中提取数据

通过指定消息ID为"GSV"创建一个nmeaParser系统对象。

pnmea = nmeaParser(“消息id”“GSV”);

提供从GNSS接收机获得的GSV句子作为输入和提取数据。

unparsedGSVLine =GPGSV美元,3,3,10,32岁,69205年,41岁,46岁,47215年,39 * 79的;gsvData = pnmea(unparsedGSVLine)
gsvData =带字段的结构:TalkerID: "GP" MessageID: "GSV" numsentence: 3 SentenceNumber: 3 satellite itesinview: 10 satellite iteid: [32 46] Elevation:[69 47]方位角:[205 215]SNR: [41 39] SignalID: NaN Status: 0

从多个GSV句子中提取数据

提供多个GSV句子作为输入。

unparsedGSVLine1 =' GPGSV美元3 1 10 01…31日03年,28325年,40岁,10…33,12日,20047年,30 * 70;unparsedGSVLine2 =GPGSV美元3 2,10日,14日,88028年,42岁,22岁,39299年,48岁的25…25日31日79289年46 * 49的;unparsedGSVLine3 =GPGSV美元,3,3,10,32岁,69205年,41岁,46岁,47215年,39 * 79的

创建一个包含这三个句子的字符串数组。

CRLF = [char(13),换行符];unparsedGSVLines = [unparsedGSVLine1,CRLF, unparsedGSVLine2, CRLF, unparsedGSVLine3];

创建nmeaParser系统对象“pnmea”,指定“GSV”消息ID,并提取数据。

pnmea = nmeaParser(“消息id”“GSV”);gsvData = pnmea(unparsedGSVLines)
gsvData =3×1包含字段的struct数组:TalkerID MessageID numsentence SentenceNumber satellite itesinview satellite iteid仰角方位信噪比SignalID状态

                     

从NMEA日志中读取数据

从示例NMEA日志中读取数据,以便使用nmeaParser系统对象解析数据。

示例日志文件为nmeaLog.nmea,在本例中包含。

F = fopen(“nmeaLog.nmea”);unParsedNMEAdata = fread(f);pnmea = nmeaParser(“消息id”, (“RMC”“GGA”]);[rmcStruct, ggaStruct] = pnmea(unParsedNMEAdata)
rmcStruct =9×1包含字段的struct数组:TalkerID MessageID FixStatus纬度经度地速TrueCourseAngle UTCDateTime磁变ModeIndicator NavigationStatus状态
ggaStruct =9×1包含字段的struct数组:TalkerID MessageID UTCTime纬度经度QualityIndicator numsatellite itesinuse HDOP高度GeoidSeparation ageofdifferaldata differalreferencestationid状态

方法可以从任何NMEA句子中提取数据CustomSentence名称-值对。要解析的NMEA数据是从海洋电子设备中获得的。

识别NMEA句子结构并创建解析函数

您需要识别规范中定义的NMEA语句的结构,并使用该信息定义将在nmeaParser System对象中使用的输出数据的结构。

例如,让我们考虑一个带有Message ID的示例句子,瑞士

在确定结构之后,创建一个定义解析器函数的函数文件,fsssParser。在函数文件中,将输出数据定义为结构数组,其字段与规范中出现的序列匹配。

导航工具箱™提供了一个可选的预配置功能,extractNMEASentence,它检查句子是否有效,并将句子中的字段转换为字符串数组。你可以打电话extractNMEASentence在函数文件中。您还可以使用任何其他函数(从未解析的数据输出字符串数组),然后在函数文件中调用它。

下图显示了包含代码的函数文件,并假设字段可用瑞士语句是TalkerID, MessageID, UTC和LatitudeError。有关详细信息,请参阅附加注释。

在上面的示例文件中,定义了结构数组中的字段和字符串数组的元素之间的映射。对于某些字段(例如UTC时间),您可能需要定义一个字符数组来映射这些字段。

在包含上面提到的MATLAB代码后,保存函数文件(fsssParser.m),以便您可以调用它来获取解析后的数据CustomSentencenmeaParser系统对象的name-value pair。

下载另一个示例函数文件parserRMB.m本例中使用,单击打开实时脚本.这是一个针对人民币句子字段的函数文件(在NMEA标准4.1版中提到)。

从人民币句子中提取数据

使用CustomSentence名-值对创建一个nmeaParser系统对象,并指定消息ID为“RMB”,函数为“parserRMB”(在上一步中下载)。

pnmea = nmeaParser(“CustomSentence”, {“元”“parserRMB”]});

提供从GNSS接收机获得的人民币句子作为输入和提取数据。

unparsedRMBLine =, GPRMB美元,4.08 L, EGLL, EGLM, 5130.02 N, 00046.34 W, 004.6,213.9,122.9 * 3 d ';rmbData = pnmea(unparsedRMBLine)
rmbData =带字段的结构:TalkerID: "GP" MessageID: "RMB" DataStatus: 'A' CrossTrackError: 4.0800 DirectionToSteer: NaN OriginWaypointID: NaN DestinationWaypointID: NaN DestinationWaypointID: NaN destinationwaypointl纬度:'5130.02 N' DestinationWaypointLongitude: '00046.34 W' RangeToDestination: 4.6000 BearingToDestination: 213.9000 DestinationClosingVelocity: 122.9000 ArrivalStatus: 'A' ModeIndicator: "NA" Status: 0

从多个人民币句子中提取数据

提供多个人民币句子作为输入。

unparsedRMBLine1 = [, GPRMB美元,0.66 L, 003004, 4917.24 N, 12309.57 W, 001.3,052.5,000.5 V * 20的];unparsedRMBLine2 = [, GPRMB美元,4.08 L, EGLL, EGLM, 5130.02 N, 00046.34 W, 004.6,213.9,122.9 * 3 d '];

创建一个包含这两个句子的字符数组

rawnmedata = [unparsedRMBLine1,newline, unparsedRMBLine2]
rawNMEAData = '$GPRMB,A,0.66,L,003,004,4917.24,N,12309.57,W,001.3,052.5,000.5,V*20 $GPRMB,A,4.08,L,EGLL,EGLM,5130.02,N,00046.34,W,004.6,213.9,122.9,A*3D'

为RMB语句指定输出参数以提取数据。

[rmbData] = pnmea(rawNMEAData)
rmbData =2×1包含字段的struct数组:TalkerID MessageID DataStatus CrossTrackError DirectionToSteer OriginWaypointID DestinationWaypointID destinationwaypointlatilatitude DestinationWaypointLongitude RangeToDestination BearingToDestination DestinationClosingVelocity ArrivalStatus ModeIndicator状态

利用内置支持(RMC)和RMB语句从句子中提取数据金宝app

通过使用MessageID属性(用内置的RMC支持解析一个句子)和CustomSentence名-值对(指定消息ID为“RMB”,函数为“parserRMB”(在前一步中创建))创建一个nmeaParse金宝appr系统对象。

pnmea = nmeaParser(“消息id”“RMC”“CustomSentence”, {“元”“parserRMB”]});

提供RMC和RMB句子作为输入。

unparsedRMCLine1 = [GNRMC美元,143909.00,,5107.0020216,N, 11402.3294835 W, 0.036,348.3, 210307年0.0,E, A * 31的];unparsedRMBLine2 = [, GPRMB美元,4.08 L, EGLL, EGLM, 5130.02 N, 00046.34 W, 004.6,213.9,122.9 * 3 d '];

创建一个包含这两个句子的字符串数组

rawnmedata = [unparsedRMCLine1,newline, unparsedRMBLine2]
rawNMEAData = '$GNRMC,143909.00,A,5107.0020216,N,11402.3294835,W,0.036,348.3,210307,0.0,E,A*31 $GPRMB,A,4.08,L,EGLL,EGLM,5130.02,N,00046.34,W,004.6,213.9,122.9,A*3D'

为RMB语句指定输出参数以提取数据。

[rmcdata,rmbData] = pnmea(rawNMEAData)
rmcdata =带字段的结构:TalkerID: "GN" MessageID: "RMC" FixStatus: 'A'纬度:51.1167经度:-114.0388 GroundSpeed: 0.0185 TrueCourseAngle: 348.3000 UTCDateTime: 21 mar -2007 14:39:09.000 MagneticVariation: 0 ModeIndicator: 'A' NavigationStatus: "NA" Status: 0
rmbData =带字段的结构:TalkerID: "GP" MessageID: "RMB" DataStatus: 'A' CrossTrackError: 4.0800 DirectionToSteer: NaN OriginWaypointID: NaN DestinationWaypointID: NaN DestinationWaypointID: NaN destinationwaypointl纬度:'5130.02 N' DestinationWaypointLongitude: '00046.34 W' RangeToDestination: 4.6000 BearingToDestination: 213.9000 DestinationClosingVelocity: 122.9000 ArrivalStatus: 'A' ModeIndicator: "NA" Status: 0
  1. 识别制造商特定句子的结构,并使用解析器函数创建函数文件

    要解析的NMEA语句的结构可在制造商提供的设备规格中找到。您需要识别结构,并使用该信息定义将在nmeaParser System对象中使用的输出数据的结构。

    例如,来自硬件制造商的NMEA句子的结构可能是这样的:

    $ PMMCZ hhmmss.ss纬度,N,经度,E, NavSatellite, *博士hh < CR > <如果>

    这里,P表示句子是制造商特定的,MMC是制造商助记符代码,Z是句子类型。每个字段表示一个特定的数据(位置、速度、时间等等)。一些制造商使用两个字符作为句子类型,然后是数据字段。

    在确定结构之后,创建解析器函数,parserMMCZ,使用可选的extractNMEASentence函数,如下所示(还可以使用其他函数将未解析的数据提取为字符串,而不是extractNMEASentence).

    函数OutputData = parserMMCZ(unparsedData, MessageID)“消息id”消息id,...“UTC”“NA”...“人肉搜索”南,...“经”南,...“导航卫星”南,...“状态”, uint8 (1));[isValid, splitString] = extractNMEASentence(unparsedData, MessageID);如果(isValid) OutputData。消息id= splitString(1); temp = char(splitString(2)); utcOutput = [temp(1:2),“:”临时(3:4),“:”临时(6)];OutputData。UTC = utcOutput; OutputData.Latitude = str2double(splitString{3}); OutputData.Longitude = str2double(splitString{5}); OutputData.NavigationSatellites = str2double(splitString{7}); OutputData.Status = uint8(0);结束结束

    保存parserMMCZ.m在MATLAB路径下。

  2. 从制造商特定语句中提取数据

    创建一个nmeaParser对象CustomSentence并指定消息ID为“MMCZ”,函数为“parserMMCZ”(在上一步中创建)。

    pnmea = nmeaParser(“CustomSentence”, {“MMCZ”“parserMMCZ”]});

    提供从设备获得的MMC语句作为输入和提取数据:

    unparsedMMCLine =“PMMCZ 225444美元、4917.24 N, 00046.34, E, 3 * 7 c博士”;mmcData = pnmea(unparsedMMCLine)
    mmcData = struct with fields: MessageID: "MMCZ" UTC: '22:54:44'纬度:4.9172e+03经度:46.3400导航卫星:3状态:0

更多关于

全部展开

版本历史

R2020b中介绍