联系我们   Contact
联系我们

西安融成科技有限公司

地址:西安市高新区唐延南路逸翠园i都会 4号楼1单元0725室

电话/传真:029-89589113

技术支持:support@rochern.com

产品销售:sales@rochern.com

搜索   Search
你的位置:首页 / 技术服务 / 技术文档 / 正文

SE ECDIS探索 -- 多传感器

2014-6-12 16:48:50      点击:
 

 

1、概述

ECDIS在整个运行过程中需要实时获取外部传感器数据以更新整个系统的状态,系统中所有数据均符合NMEA0183协议标准(数据标准参考:http://www.nmea.de/nmea0183datensaetze.html)。主要更新的数据有:位置信息和状态信息(航向和航速);ECDIS系统中主要连接的传感器有GPSGYRO(陀螺仪)、LOG(计程仪)、AIS和雷达等。本文主要针对GPSGYROLOG三种传感器数据进行解析。

2、多传感器通信

       这里的多传感器通信主要指接收多传感器中的数据,接收方式与串口通信一致。可以采用一些串口控制控件或者库代劳,不过最好还是自己写串口通信,方便自己控制。

       打开串口的步骤:

       1:检测所有串口并记录下串口,通过查询串口注册表中注册的串口获取所有串口逻辑名。网上有人建议逐个串口进行打开测试,能打开的即为有效串口,不建议用此方法。注意:LinuxWindows下串口逻辑名不一致。

       2:打开外接传感器的串口,可以用CreateFile方法打开串口。注意:当串口逻辑名中有两位数字时需要额外处理串口名(在串口名前添加转义符号”\\.\”),否则无法打开串口,有兴趣的可以尝试一下。

       3:配置串口,主要配置缓存、超时等。注意:根据需要配置传感器,当传感器数据量过大过多时需要诸多考虑,这种情况下需要检测数据丢失和截断的情况,有时为了增强用户体验,需要将传感器通信放入其他线程处理。CreateFile根据数据读取的需要可选择同步或异步工作模式。

       4:读取数据。用ReadFile函数。

       5:关闭串口

       打开串口代码示例:(Windows)

       CString strNum =”COM1”;

       strNum.Replace("COM", "");

       int iNum = _ttoi(strNum);

       if (iNum > 9)

       {

              strNum.Format("//./%s", strCom);

              m_hCom = CreateFile(strNum

                            , GENERIC_READ|GENERIC_WRITE//读写方式打开

                            ,0//独占方式

                            , NULL

                            , OPEN_EXISTING//打开而不是创建

                            , 0//同步模式

                            , NULL

                            );

       }

       else

       {

              m_hCom = CreateFile(m_strCom, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

       }

      

       if(m_hCom == (HANDLE)-1)

       {

              CString strInfo= "";

              strInfo.Format("打开%s失败!", strCom);

              AfxMessageBox(strInfo);

              return false;

       }

       SetupComm(m_hCom, 1024, 1024); //输入缓冲区和输出缓冲区的大小

       COMMTIMEOUTS TimeOuts;

       //设定读超时

       TimeOuts.ReadIntervalTimeout=MAXDWORD;

       TimeOuts.ReadTotalTimeoutMultiplier=0;

       TimeOuts.ReadTotalTimeoutConstant=0;

       //设定写超时

       TimeOuts.WriteTotalTimeoutMultiplier=100;

       TimeOuts.WriteTotalTimeoutConstant=500;

       SetCommTimeouts(m_hCom, &TimeOuts); //设置超时

       DCB dcb;

       GetCommState(m_hCom, &dcb);

       dcb.BaudRate = iBaudRate;

       dcb.ByteSize = iByteSize;

       dcb.Parity = iParity;

       dcb.StopBits = iStopBits;

       SetCommState(m_hCom, &dcb);//设定通信参数:波特率、比特位、停止位、校验位等

       PurgeComm(m_hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);//串口数据清理

3、各传感器数据格式解析

       各传感器包含的数据格式,此处列举常用传感器数据格式,各个传感器所包含的数据格式还有很多,所有NMEA0183数据格式均以“$”开始,更多数据格式参考:

  http://www.nmea.de/nmea0183datensaetze.html

传感器

数据格式

描述

GPS

RMC

推荐定位信息

VTG

地面速度信息

GGA

GPS定位信息

GLL

定位地理信息

ZDA

时间及日期信息

GNS

卫星定位相关信息

DTM

大地基准信息

ALR

告警信息

LOG

VBW

水地速度信息

VHW

水速信息

ALR

告警信息

GYRO

HDT

船首信息

HDG

船首变化信息

ROT

转向率信息

ALR

告警信息

 

3.1、GPS

GPS主要是卫星获得地理信息的传感器,但是它包含的信息远不止这些。常见的GPS格式如下:

(RMC)推荐定位信息

$GPRMC,,,,,,,,,,,*hh

UTC时间,hhmmss(时分秒)格式
定位状态,A=有效定位,V=无效定位
纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
纬度半球N(北半球)或S(南半球)
经度dddmm.mmmm(度分)格式(前面的0也将被传输)
经度半球E(东经)或W(西经)
地面速率(000.0~999.9节,前面的0也将被传输)
地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
UTC
日期,ddmmyy(日月年)格式
磁偏角(000.0~180.0度,前面的0也将被传输)
磁偏角方向,E(东)或W(西)

*hh:校验和(下同)

结束标志(下同)

(VTG)地面速度信息
$GPVTG,,T,,M,,N,,K*hh
以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
地面速率(000.0~999.9节,前面的0也将被传输)
地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)

(GGA)GPS定位信息

$GPGGA,,,,,,,,,,M,,M,,*hh

UTC时间,hhmmss(时分秒)格式
纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
纬度半球N(北半球)或S(南半球)
经度dddmm.mmmm(度分)格式(前面的0也将被传输)
经度半球E(东经)或W(西经)
GPS
状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
HDOP
水平精度因子(0.5~99.9
海拔高度(-9999.9~99999.9
地球椭球面相对大地水准面的高度
差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
差分站ID0000~1023(前面的0也将被传输,如果不是差分定位将为空)

(GLL)定位地理信息

$GPGLL,,,,,,,*hh

纬度ddmm.mmmm,度分格式(前导位数不足则补0

纬度N(北纬)或S(南纬)

:经度dddmm.mmmm,度分格式(前导位数不足则补0

经度E(东经)或W(西经)

UTC时间,hhmmss.sss格式

状态,A=定位,V=未定位

(ZDA)时间及日期信息

$GPZDA, ,,,,,,*hh

UTC时间,hhmmss(时分秒)格式
日,0~31
月,1-12

当地时域描述,单位:小时, -13~13
当地时域描述,单位:分, 0~59

(GNS)卫星定位相关信息

$GNGNS,,,,,,,,,,*hh

定位时的 UTC  时间(头两位表示小时,中间两位表示分,剩下的数字表示秒)
纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
纬度半球N(北半球)或S(南半球)
经度dddmm.mmmm(度分)格式(前面的0也将被传输)
经度半球E(东经)或W(西经)
模式指示 (见下):长度可变的有效字符字段类型,头两个字符是当前定义的。第一个字符表明使用GPS 卫星,第二个字符表明使用 GLONASS 卫星。

           N:没有定位。卫星系统未用于定位,或定位无效

           A:单点定位。定位时卫星系统工作于非差分模式

           D:差分。定位时卫星系统工作于差分模式

           PPPS 定位。

           RRTK 固定解

           FRTK 浮点解

           E:航位推算模式

           M:人工输入模式

           S:模拟模式
用于定位计算的卫星总数
HDOP
水平精度因子(0.5~99.9
海拔高度(-9999.9~99999.9
地球椭球面相对大地水准面的高度
差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)

差分时间参考基站

(DTM) 大地基准信息
$GPDTM,,,,,,,,*hh
本地坐标系代码 W84
坐标系子代码
纬度偏移量
纬度半球N(北半球)或S(南半球)
经度偏移量
经度半球E(东经)或W(西经)
高度偏移量
坐标系代码 一般是W84,包含W72S85p90

3.2、LOG

(VBW) 水地速度信息
$--VBW,,,,,,*hh
纵向水速度
横向水速度
水速度有效标志
纵向地速度
横向地速度

地速度有效标志

(VHW) 水速信息
$--VHW,,T,,M,,N,,K*hh
水速方向
磁偏角度
对水速度,单位节
对水速度,单位公里/小时

3.3、GYRO

(HDT) 船首信息
$--HDT,,T *hh
船首方向

(HDG) 船首变化信息
$--HDG,,,,,*hh
地磁角度
磁偏角度

磁偏角经度半球E(东经)或W(西经)
磁变动
磁变动经度半球E(东经)或W(西经)

(ROT) 转向率信息
$--ROT,,*hh
转向率,负值表示向左转
有效标志,A表示数据有效

(ALR) 大地基准信息
$--ALR,,,,,*hh
告警UTC时间
告警编号
告警条件
告警确认状态
告警描述

4、解析

有了数据格式,解析相对就比较容易了。NMEA数据都是以“$”开头,结尾。用这个规律可以获取一条完整NMEA数据。由于传感器通信,数据是连续的且不一定是完整的,通常解析NMEA数据有如下几个步骤:

1:拼接信息,将本次接收到的数据拼接上次解析剩下的不完全的信息(此处主要考虑到信息被截断的问题);

2:拆分数据,将数据拆分成一条一条完整的NMEA数据,根据“$”开头和结尾;

3:解析一条条完整的NMEA数据,根据“$”头后面跟着的5个字符(其实最主要的是3-5个字符)确定NMEA的数据类型;

4:将NMEA数据中的有效信息提取,主要根据类型。每个NMEA数据中的字段都以逗号间隔开,需要哪个字段的信息就取哪个字段的信息。

注:代码只是简单的数据整合和提取,不同的用户对信息的要求也不一致。各个NMEA数据有相互覆盖的字段,同样的信息会被多种信息包含,这时可以根据需要设定优先级,获取更为准确的数据。一般来说GPS传感器的地理位置、时间信息相对较为准确,LOG的航向航速信息相对较为准确,GYRO的船首向信息相对较为准确。