admin 管理员组文章数量: 887031
2024年1月18日发(作者:找不到makefile入口点)
GNSS NMEA 0813标准数据格式的解释和模拟
廖永生 梁绕
(广西第一测绘院 广西南宁 530023)
【摘 要】 对NMEA 0183格式的定位数据进行解释和数据模拟,为开发GNSS应用服务系统作了基础性研究,可作为未来GNSS各应用系统开发参考。
【关键词】 NMEA 0183 GNSS数据 解释 模拟
1 前言
GNSS导航定位技术是目前应用得最广泛的空间定位技术之一,已被广泛应用于空间信息数据采集和服务等各个方面。随着各地区域性CORS(Continously Operation Reference System)建成,差分GPS定位服务得到了不断深化。随着GLONASS的完善和Galileo卫星导航定位系统的建成,GNSS导航定位技术将更加普及,将会对各行各业都产生重大影响。
数据格式问题一直是GNSS相关服务中的难题,特别是差分GNSS数据和静态GNSS数据格式之间的差异使普通GPS设备无法直接获得专业差分服务。数据格式标准的统一,是实现GNSS相关服务的基础。
目前最通用的GNSS格式是NMEA 0183格式,NMEA 0183是最终定位格式,即将二进制定位格式转为统一标准定位格式,与卫星类型无关。掌握NMEA 0183格式,对于推广GNSS应用服务和研究GNSS相关技术具有重要意义。
本文将对NMEA 0183格式进行概括说明,同时采用程序模拟NMEA 0183格式,作为NMEA 0183标准格式的技术探索。
2 NMEA 0183协议概述
NMEA是“National Marine Electronics Association”(国际海洋电子协会)的缩写,同时也是数据传输标准工业协会,该协会定制的GNSS数据格式是NMEA 0183数据格式,它是一套定义接收机输出的标准信息,有几种不同
的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔选择输出。最常用的格式为“GGA”,它包含了定位时间、纬度、经度、高度、定位所用的卫星数、DOP值、差分状态和校正时段等,还有速度,跟踪,日期等。
GPS接收机根据NMEA 0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。NMEA实际上已成为所有的GNSS接收机和最通用的数据输出格式,同时它也被用于与GNSS接收机接口的大多数软件包里。
NMEA-0183协议是GNSS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GNSS接收机、GNSS数据处理软件、导航软件都遵守或者至少兼容这个协议。
3 NMEA 0183用途和结构
NMEA 0813格式与专业RTCM2.3/3.0和CMR+的GNSS数据格式不同,NMEA 0813格式主要针对民用定位导航设备,通过NMEA 0183格式,可以实现GNSS接收机与PC或PDA之间的数据交换,可以通过USB和COM口等通用数据接口进行数据传输,其兼容性高,数据传输稳定。
同时NMEA 0183可以作为民用差分GPS服务解算基础数据,通过CORS参考站和GPRS/CDMA公网通讯,直接接收NMEA 0183兼容格式的差分信息,实现一般差分GNSS服务。NMEA最基本的使用方式如图1所示。
图1 NMEA 0183格式基本使用途径
目前以NMEA 0183为基础的服务正在应用于车辆导航、船只入港等方面的应用研究。该研究将极大普及差分GPS的应用推广,同时扩大CORS的应用范围。
4 NMEA协议的语句
NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。
NMEA-0183 的每条语句的格式如下表1所示。
表1 NMEA协议语句格式定义
符号(ASCII)
“$”
aaccc
“,”
ddd…ddd
“*”
hh
定义
语句起始位
地址域,前两位为识别符,后三位为语句名
域分隔符
发送的数据内容
效验和符号,后面的两位数是效验和
效验和
终止符,回车或换行
不同的GPSOEM接收板提供的NMEA语句有很大差异,主要表现在字段的意义和位置上。用户需要先弄清楚需要哪些信息,然后对照GPS OEM接收板的技术资料,寻找那些包括所需信息的NMEA语句。
下面将介绍兼容性最广泛的6条NMEA语句
(1)$GPGGA语句
Global Positioning System Fix Data(GGA),即GPS定位信息。该语句中反映GPS定位主要数据,包括经纬度、质量因子、HDOP、高程、参考站号等字段。
其标准格式如下:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh
各字段的含义和取值范围见表2所示。
表2 $GPGGA语句各字段的含义和取值范围
字段
<1>
<2>
<3>
<4>
<5>
含义
UTC时间
纬度,格式:
南北半球
经度格式
东西半球
取值范围
000000.00~235959.99
000.00000~8959.9999
N北纬;S南纬
00000.0000~17959.9999
E表示东经;W表示西经
0=未定位,1=GPS单点定位固定解,2=差分定位,3=PPS解;4=RTK固定解;5=RTK浮点解;6=估计值;7=手工输入模式;8=模拟模式
00~12
0.500~99.000(大于6不可用)
-9999.9~99999.9
-9999.9~99999.9
从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空
0000~1023;不使用DGPS时为空
<6> GPS状态
<7>
<8>
<9>
应用解算位置的卫星数
HDOP, 水平图形强度因子
海拔高度
地球椭球面相对大地水准面的高度(高程异常)
差分时间
参考站号
<11>
<12>
例句:
$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,M,,M,,*76
(2)$GPGSA语句
GPS DOP and Active Satellites(GSA)即当前卫星信息, 其标准格式如下:
$GPGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>,<6>*hh
各字段的含义和取值范围见表3所示。
表3 $GPGSA语句各字段的含义和取值范围
字段
<1>
<2>
含义
模式
定位类型
PRN码(伪随机噪声码),正在用于解算位置的卫星号
PDOP位置精度因子
HDOP水平精度因子
VDOP垂直精度因子
取值范围
M=手动,A=自动
1=没有定位,2=2D定位,3=3D定位
01~32
0.5~99.9
0.5~99.9
0.5~99.9
<3>
<4>
<5>
<6>
例句:
$GPGSA,A,3,19,11,03,23,27,13,16,,,,,,3.43,1.67,2.99*0E
(3)$GPGSV语句
GPS Satellites in View(GSV)可见卫星信息,反映GPS可见星的方位角、俯仰角、信噪比等。
其标准格式如下:
$GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,…<4>,<5>,<6>,<7>*hh
各字段的含义和取值范围见表4所示。
表4 $GPGSV语句各字段的含义和取值范围
字段
<1>
<2>
<3>
<4>
<5>
<6>
<7>
含义
总的GSV语句电文数
当前GSV语句号
可视卫星总数
卫星号
卫星仰角
卫星方位角
信噪比
取值范围
0~12
1-3
00~12
01~32
00~90度
000~359度
00~99dB,没有跟踪到卫星时为空
注:<4>,<5>,<6>,<7>信息将按照每颗卫星进行循环显示,每条GSV语句最多可以显示4颗卫星的信息。其他卫星信息将在下一序列的NMEA0183语句中输出。
例句:
$GPGSV,3,1,11,1,83,54,32,3,19,192,28,6,26,57,36,7,51,140,37*7D
$GPGSV,3,2,11,14,40,136,34,16,64,266,36,20,21,293,,22,2,168,*4C
$GPGSV,3,3,11,23,10,321,,25,53,7,40,30,2,46,*48
(4)$GPRMC 语句
Recommended Minimum Specific GPS/TRANSIT Data(RMC),即推荐定位信息。
其标准格式如下:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
各字段的含义和取值范围见表5所示。
表5 $GPRMC语句各字段的含义和取值范围
字段
<1>
<2>
<3>
<4>
<5>
<6>
<7>
<8>
<9>
<10>
<11>
含义
UTC时间,
定位状态
纬度,格式:
南北半球
经度格式
东西半球
地面速率
地面航向
UTC日期,格式:ddmmyy
磁偏角
磁偏角
取值范围
000000.00~235959.99
A=有效定位,V=无效定位
000.00000~8959.9999
N表示北纬;S表示南纬
00000.0000~17959.9999
E表示东经;W表示西经
000.0~999.9节
000.0~359.9,以真北为参考基准
日月年
000.0~180.0度
E表示偏东;W表示偏西
<12> 模式指示(NMEA0183 3.00版本输出) A=自主定位,D=差分,E=估算,N=数据无效
例句:
$GPRMC,074529.82,A,2429.6717,N,11804.6973,E,12.623,32.122,010806,,W,A*08
(5)$GPVTG 语句
Track Made Good and Ground Speed(VTG),即地面速度信息。其标准格式为:
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
各字段的含义和取值范围见表6所示。
表6 $GPVTG 语句各字段的含义和取值范围
字段
<1>
<2>
<3>
<4>
<5>
含义
以真北为参考基准的地面航向
以磁北为参考基准的地面航向
地面速率
地面速率
取值范围
000~359度
000~359度
000.0~999.9节
0000.0~1851.8公里/小时
模式指示(仅NMEA0183 3.00版本输A=自主定位,D=差分,E=估算,N=数据无出) 效
例句:
$GPVTG,257.314,T,257.314,M,10.739,N,19.888,K,A*2F
(6)$GPGLL语句
Geographic Position(GLL),即定位地理信息。其标准格式如下:
$GPGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*hh
各字段的含义和取值范围见表7所示。
表7 $GPGLL语句各字段的含义和取值范围
字段
<1>
<2>
含义
纬度,格式:
南北半球
取值范围
000.00000~8959.9999
N表示北半球;S表示南半球
<3>
<4>
<5>
<6>
经度,格式:
东西半球
UTC时间,格式:hhmmss
定位状态
00000.0000~17959.9999
E表示东经;W表示西经
000000.00~235959.99
A=有效定位,V=无效定位
A=自主定位,D=差分,E=估算,N=数据无<7> 模式指示(NMEA0183 3.00版本输出)
5 NMEA 0183数据模拟
该源代码为VC++源代码,是对一个模拟NMEA数据的类的定义。 struct CNmeaData
{
CNmeaData ();
void ResetData ();
// Data retrieved from the NMEA sentences.
double lat; // 纬度,单位为度(正数为北纬,负数为南纬)数为东经,负数为西经)
double altitude; // 海拔高度,米
double speed; // 速度,节
double track; //追踪卫星高度角,度
double magVariation; // 磁偏角,度
double hdop; // HDOP值
int numSats; // 追踪卫星数
int UTCYear; // UTC年
int UTCMonth; // UTC月
int UTCDay; // UTC日
效
double lon;// 经度,单位为度(正
int UTCHour; // UTC时
int UTCMinute; // UTC分
int UTCSecond; // UTC秒
CSatData satData[MAC_SATS];
// 卫星锁定数:
// 0 = 无效, 1 = 卫星锁定, 2 = DGPS状态
GPS_FIX_QUALITY lastFixQuality;
// 有效卫星数
bool isValidLat; // 纬度
bool isValidLon; // 经度
bool isValidAltitude; // 高程
bool isValidSpeed; // 速度
bool isValidDate; // 日期
bool isValidTime; // 时间
bool isValidTrack; // 追踪卫星角
bool isValidMagVariation; // 磁偏角变化
bool isValidHdop; // HDOP值
bool isValidSatData; // 卫星数
// 确定是否有有效的坐标数据发送到数据端口
bool hasCoordEverBeenValid;
};
class CNmeaParser
{
public:
CNmeaParser ();
SENTENCE_STATUS ParseSentence (const char* sentence);
void GetData (CNmeaData& data)const;
void ResetData (){m_ata ();}
private:
bool ParseDegrees (double& degrees, const char* degString)const;
bool ParseDate (int& year, int& month, int& day,
const char* dateString)const;
bool ParseTime (int& hour, int& minute, int& second,
const char* timeString)const;
void ParseAndValidateAltitude (const char* field, const char unit);
void ParseAndValidateDate (const char* field);
void ParseAndValidateFixQuality (const char* field);
void ParseAndValidateLat (const char* field, const char hem);
void ParseAndValidateLon (const char* field, const char hem);
void ParseAndValidateHdop (const char* field);
void ParseAndValidateSpeed (const char* field);
void ParseAndValidateMagVariation(const char* field,
const char direction);
void ParseAndValidateTime (const char* field);
void ParseAndValidateTrack (const char* field);
void ParseGGA (const char* sentence);
void ParseGLL (const char* sentence);
void ParseRMC (const char* sentence);
void ParseGSV (const char* sentence);
bool GetNextField (char* data, const char* sentence,
uint& currentPosition)const;
bool IsValidSentenceType (const char* sentence)const;
bool IsCorrectChecksum (const char* sentence)const;
CNmeaData m_data;
// 需要分解GSV语句
int m_lastSentenceNumber;// 确定结束语句
int m_numSentences; // 处理语句数
int m_numSatsExpected; // 分析捕获卫星数
int m_numSatsLeft; // 分析失锁卫星数
int m_satArrayPos; // 下一次捕获卫星位置预测
CSatData m_tempSatData[MAC_SATS];
};
class CNmeaSerial
{public:
CNmeaSerial ();
CNmeaSerial (HWND hMsgWnd, DWORD timeout);
~CNmeaSerial ();
SERIAL_RESULT_TYPE CloseConnection ();
SERIAL_RESULT_TYPE OpenConnection ();
SERIAL_RESULT_TYPE OpenConnection (uint8 comPort, uint32 baudRate,
uint8 dataBits, SETPARITY parity, STOPBITS stopBits);
SERIAL_RESULT_TYPE GetData (CNmeaData& data)const;
SERIAL_RESULT_TYPE GetSettings (uint8& comPort, uint32& baudRate,
uint8& dataBits, SETPARITY& parity, STOPBITS& stopBits)const;
unsigned long GetThreadHandle ()const {return m_hThread;}
BOOL IsConnected ()const {return m_isConnected;}
private:
SERIAL_RESULT_TYPE InitThread ();
BOOL KillThread ();
BOOL LockData ()const;
void SetDefaults ();
BOOL UnlockData ()const;
// 元函数描述语句,并运行该语句
// 进入另外线程
static void ProcessSentences (void* currentObject);
uint8 m_comPort;
uint32 m_baudRate;
uint8 m_dataBits;
SETPARITY m_parity;
STOPBITS m_stopBits;
BOOL m_isConnected;
DWORD m_timeout;
unsigned long m_hThread;
HANDLE m_hPort;
HANDLE m_hMutex;
DWORD m_threadId;
CNmeaParser m_parser;
// 接收描述信息窗口
HWND m_hMsgWnd;
// 如果值为True,则进行线程分析
// 否则结束状态
BOOL m_terminateThread;}
掌握NMEA 0183数据的基本原理和格式,并实现模拟NMEA 0183数据,对于开发GNSS服务和应用系统,扩展GNSS服务范围和服务方式等,都有重要意义。
版权声明:本文标题:NMEA0183 协议 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1705571264h490448.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论