系统软件基于嵌入式Linux操作系统,使用C++语言进行软件开发,并选择QT/Embedded作为图形用户界面(GUI)开发环境。QT是Trolltech公司推出的跨平台C++图形用户开发库,QT/Embedded是QT面向嵌入式应用的版本,具有可移植性强,支持Linux、Windows、Mac的优点,移植到新平台时,只需用该平台的编译器重新编译即可;面向对象,采用C++语言,加上特有的信号/槽(singal/slot)机制,使得面向对象的程序设计变得简单而有效;可裁剪,通过去掉无关模块可以调整库文件的大小,适合嵌入式系统使用;GUI界面支持大量标准的窗口部件,并提供了界面设计工具designer;支持国际化,支持中文显示,并提供了多语言支持工具linguist。QT/Embedded强大的图形绘制功能在电子海图的应用系统中得到了充分的应用。
系统从全球定位系统GPS实时获取船舶位置(包括经纬度与时间等)和航行信息(包括船速与航向等),在电子海图上显示相关导航信息,用户通过精简的鼠标键盘操作,提供海图漫游、海图查询和航行信息管理等功能。
2 电子海图数据处理
2.1 电子海图数据组织结构
本系统使用海司航保部的军用矢量海图格式MVCF(Military Vector Chart Format)[1]海图。MVCF以图幅为单位组织,采用目录结构,目录名即为电子海图的编号。一个图幅目录由一个元数据文件和多个海图层次文件组成。元数据文件记录每幅图的比例尺、基准纬度等控制信息,海图层次文件由40多种图层文件组成。例如海洋陆地层、港口设施层等。每一种图层文件由图形文件、索引文件和属性文件组成。其中图形文件记录了海图要素的墨卡托投影坐标数据,索引文件记录了对应的图形文件中海图要素在图形文件中的偏移量,属性文件是dbase表文件,记录了海图要素的属性,包括要素的名字、备注等。
这样一幅海图包括130多个文件,本系统使用的海图包括中国总图、沿海航行图、港湾图等共74幅海图,占用空间260多兆字节。由于嵌入式系统存储空间和处理器运算能力的限制,需要在PC机上对电子海图进行数据精简压缩和优化,以提高系统响应速度。
2.2 电子海图数据压缩
(1)删除冗余数据
MVCF海图数据量大,线状要素和多边形要素细节丰富,而嵌入式电子海图应用系统由于液晶显示器的大小和分辨率的限制,有相当一部分数据浪费。本系统使用的液晶显示器分辨率为640×480,长和宽为21cm×15cm,可以计算出像素间距约为0.031cm。用各种比例尺的电子海图显示时,线状或面状实体的某些点的间隔如果小于像素间距,显然无法显示,应删除这种冗余点。以像素间距作为阀值,删除海图冗余数据,算法如下:
选定一个线状或面状实体,顺序遍历其坐标点,除起点和终点外,对每个点计算该点与上一个点的距离,若小于阀值,则删除该点。
(2)二维几何压缩
使用合适的二维几何压缩算法能使电子海图在保持形状的前提下减少数据量。本系统使用Douglas-Poiker算法[2]进行线状和面状实体的压缩。该算法的思想是,从一个近似的形状开始,逐步修正。该算法同样需要一个阀值,本系统可使用上文的同一阀值。以面状实体为例,算法过程如下:
选择多边形P的两个顶点V1和V2,考虑V1、V2,V1组成的多边形Q是P的一个近似,扫描P中其他顶点,选择距离Q的边最远的顶点W,把W加入到Q中形成新的多边形,继续扫描P中的其他顶点,直到P中剩余的顶点距离Q边的最长距离小于阀值为止。多边形Q即为压缩结果。
2.3 建立网格索引
高效的索引结构是提高数据访问效率的关键。MVCF海图数据量大,电子海图应用系统实际使用过程中,显示的区域通常只是一个图幅的一部分,如果能快速搜索到这部分的海图数据,系统的响应速度将大大提高。本系统使用网格索引,MVCF海图按比例尺分为从1:4000000到1:25000共10多级,对每一种比例尺的海图,都建立一个网格索引,方法如下:
用一个矩形网格与海图要素逐个进行相交或包容判断,凡是在网格中的海图要素,就记录下该要素在图形文件内的偏移量,最后形成网格索引文件。其中,多边形要素与矩形网格的相交判断方法是,若多边形的一部分端点落在矩形内,而另一部分却落在矩形的外部,则两者是相交的;多边形与矩形的包容判断是,若多边形所有的端点落在矩形内则是包容于关系,若矩形所有的端点落在多边形内则是包容关系。线状要素也可用相似的方法判断。
3 系统软件的设计与实现
系统软件如图2所示,主要由以下模块组成:系统界面与管理模块、海图数据模块、海图算法模块、海图显示模块、航行信息管理模块、GPS接收模块等。
系统界面与管理模块:实现系统主界面和操作菜单,通过调用其它模块实现海图漫游、自动对中、海图查询、管理航线、保存航行记录等功能。
海图数据模块:负责读取电子海图文件,实现海图查询功能。通过dbase属性文件搜索地图要素,可以通过SQL语句在属性文件中找到该要素,从而得到该要素在索引文件中的位置。
海图算法模块:包括程序中用到的各种算法,如地理坐标、墨卡托投影坐标和屏幕坐标之间的相互转换[3],点与点、点与线之间距离,线的长度,多边形的周长和面积等。
海图显示模块:海图显示是系统的核心模块。该模块根据管理模块给出的中心点位置及显示范围的参数,确定需要绘图的网格,根据网格索引,快速完成绘制海图的功能。考虑到海图漫游通常是连续的,使用了位图缓存来提高响应速度,每次画图的时候,先在缓存中找,找不到则扩大范围画图,并保存到位图缓存,对缓存的管理采用最近最少使用替换算法(LRU)。具体流程如图3所示。
航行信息管理模块:完成航线设置、航线偏移报警、保存航迹等航行管理功能。航线设置是根据航海用户对目的点的连续选择,形成一条航线,并对该航线设置一个偏航极限。本模块定时从GPS接收模块获取地图坐标信息,判断当前位置到航线的距离,若超出偏航极限,则发出报警。航迹保存是定时记录船舶位置并显示,醒目、直观的航迹显示可以使航海人员对船位信息、航行历程及周边环境有清楚的了解。
GPS接收模块:负责定时读取GPS接收仪的数据,解析出地理经纬度坐标、时间、航速与航向等信息。外置的GPS接收仪通过RS232连接到系统,GPS接收仪会定时往系统发送符合NMEA(美国航海电子协会)标准的数据。该模块只需定向读取RS232串口数据,根据NMEA格式解析出地理经纬度坐标、时间、航速与航向的信息即可。
本系统的部分界面如图4所示。目前本系统已经出海试运行,实践证明本系统能实时显示船舶当前航行状况,快速响应用户操作,为航海人员提供可靠的电子海图信息。
随着嵌入式技术的发展,嵌入式系统设备的性能逐步提高,船舶导航系统的构建有了更多的选择。本文提出的基于GPS和电子海图的嵌入式船舶导航系统,使用嵌入式32位处理器和嵌入式Linux操作系统,具有海图漫游、海图查询和航行信息管理等丰富的功能,具有经济实用、操作简便、功能可靠、快速响应的优点,已经得到实际的海上应用。