主要内容

nmeaParser

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

描述

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

nmeaParser系统对象提供:

  • 内置支持解析从GNSS接收器发送的数据,并通过以下九种NMEA消息类型进行识别:RMC, GGA, GSA, VTG, GLL, GST, ZDA, GSV和HDT

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

解析NMEA句子中的数据:

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

  2. 调用带有参数的对象,就像调用函数一样。

要了解更多关于System对象如何工作的信息,请参见什么是系统对象?

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

创建

描述

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

例子

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

例子

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

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

例子

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

输入参数

全部展开

名称-值参数

指定可选参数对为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是内置支持解析数据的九个句子之一。

数据类型:字符|字符串

属性

全部展开

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

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

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

具有内置支持的9个NMEA句子的消息id,它们符合NMEA 0183标准,您希望从中提取数据。您可以指定多个消息id作为字符串数组,以便从NMEA语句中提取数据。

数据类型:字符|字符串

使用

描述

例子

rmcDataggaDatagsaDatavtgDatagllDatagstDatagsvDatazdaDatahdtData= pnmea(rawData解析来自内置支持的9个标准NMEA句子的数据,并返回一个结构数组,其中每个结构对应一个Message ID。类时为输出参数指定的序列必须与为消息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对象指定为第一个输入参数。例如,释放名为obj,使用以下语法:

发行版(obj)

例子

全部折叠

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

从RMC语句中提取数据

通过指定消息ID为“RMC”来创建一个nmeaParser系统对象。

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, 0206620,000,W*44'

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

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

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

[ggaData,gsaData] = pnmea(rawNMEAData)
ggaData =带有字段的结构:TalkerID: "GP" MessageID: "GGA" UTCTime: 11:13:57.771纬度:52.5227经度:13.4040 QualityIndicator: 1 numsatitesinuse: 12 HDOP: 1 Altitude: 0 GeoidSeparation: 0 AgeOfDifferentialData: NaN DifferentialReferenceStationID: 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,gsaData] = pnmea(rawNMEAData)
ggaData =2×1带字段的struct数组:TalkerID MessageID UTCTime纬度经度质量指标numsatitesinuse HDOP高度GeoidSeparation AgeOfDifferentialData 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 satitesinview: 10 satiteid: [32 46] Elevation: [69 47] Azimuth: [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),newline];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 cartoitesinview cartoiteid仰角方位角SNR 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 Latitude Longitude GroundSpeed TrueCourseAngle UTCDateTime MagneticVariation ModeIndicator NavigationStatus状态
ggaStruct =9×1带字段的struct数组:TalkerID MessageID UTCTime纬度经度质量指标numsatitesinuse HDOP高度GeoidSeparation AgeOfDifferentialData differalreferencestationid状态

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

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

您需要确定NMEA语句的结构(如规范中定义的那样),并使用该信息定义nmeaParser System对象中使用的输出数据的结构。

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

sss-sample1.png

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

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

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

fsssparser-example1.png

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

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

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

从人民币句子中提取数据

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

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 destinationwaypointlatime: '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 '];

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

rawNMEAData = [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 destinationwaypoinlatitude DestinationWaypointLongitude RangeToDestination BearingToDestination DestinationClosingVelocity ArrivalStatus ModeIndicator状态

从一个带有内置支持(RMC)和人民币句中提取数据

通过使用MessageID属性(用于解析具有内置支持的句子——RMC)和使用CustomSentence名值对(指定消息ID为“RMB”,并指定函数为“parserRMB”(在上一步中创建)来创建nmeaParser系统对象。

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 '];

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

rawNMEAData = [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 destinationwaypointlatime: '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中引入

Baidu
map