引言
近年来随着社会经济的飞速发展,公路交通的复杂性和拥挤度与日俱增,现有的交 通运输管理与服务手段已不能适应交通运输的需求,这已成为长期以来困扰发展中国家和发达国家的问题。因此,车载导航应运而生,在一些发达国家,车载导航已 成为大众生活的辅助品。但是在中国由于技术、资金以及成本等原因,我国的车载导航市场还是处于发展初期。车载导航系统是集中应用了自动定位技术、地理信息 系统与数据库技术、计算机技术、无线通信技术的高科技综合系统。目前国内市场上的车载终端技术不够完备,市场化程度低,真正达到消费者要求的并不多见。随 着对导航系统信息服务能力要求的进一步提高、终端硬件成本的不断下降以及操作系统的不断升级,选择一款易于开发、维护和升级,并且兼容性强的操作系统来支 撑终端硬件系统的运行就显得异常重要。
由嵌入式Linux和Java虚拟机构成的Android操作系统,为嵌入式 移动设备带来全新的开放系统解决方案。本文在众多的操作系统中选择Android作为车载导航的系统终端软件,因为Android是开源的操作系统,有利 于开发人员理解平台框架,降低移动终端设备的价格,同时也便于软件的开发、维护和升级。
1 Android操作系统介绍
Google公司于2007年11月发布的Android操作系统,是一款建 立在Linux操作系统2.6版本内核之上的手机操作系统平台。Google公司是这样定义Android操作系统的,它是***专门为移动终端打造的真正 意义上的开源且系统完整的移动平台,而且不存在不同设备上的兼容性问题。
Android平台由操作系统、中间件、用户界面和应用软件组成。Linux 内核层用来提供系统的底层服务,位于硬件和其他软件层之间,采用YAFFS2文件系统。Android运行库包含一组核心库和Dalvik虚拟 机,Android提供丰富的类库支持且大部分为开源代码,如采用嵌入式数据库SQLite。应用框架层为Android开发人员提供了访问框架应用程序 接口的全部权限,采用结构化设计简化了组件之间的重用。在应用程序层,Android本身附带了一些核心的应用程序,大大简化了Android应用程序的 开发。
因此,利用Android操作系统作为车载导航终端的应用平台,由于操作系统与软件免费,导航终端更便宜;同一平台克服格式问题,功能更多元化;使用者决定功能,比个人电脑更人性化、更贴近消费者。
2 系统框架设计
本系统是一款以三星公司的S3C6410处理器为核心的嵌入式开发板,先开发 Bootloader引导程序,接着在此基础上移植Linux内核,然后制作Android文件系统;在移植好Android操作系统后,进行车载导航功 能的开发,任务集中在通过GPS实时获取路径,使用地图匹配算法校正定位模块的定位误差,采用最短路径导航规划算法进行导航,通过语音提示实现路径的引 导,并且通过电子地图配合Android系统软件的API接口,同时它还具有不断升级的地图库,并能按照用户的需求进行各种信息查询,真正实现一个体积 小、耗电少、成本低并且人机界面友好的嵌入式操作系统平台。系统框架图如图1所示。
图1 系统框架图
利用Android操作系统在ARM硬件平台上实现车载导航终端各功能模块的 整合,配合相应的串口驱动、液晶屏驱动等完成指定的功能,如对接收到的数据进行处理,计算所在位置的经度、纬度、海拔、速度和时间等,并且采用地图匹配算 法进行定位误差校正,自主导航路径规划采用Dijkstra算法,实现最短路径导航。GPS系统具有全天候、全球覆盖、三维定速、定时、高精度、快速、省 时、高效率、应用广泛、多功能等特点,因此可广泛应用于陆地、海洋以及航空航天等。电子地图的使用,直观地将丰富的城市地图、全国的公路网图、加油站、便 利商店、政府机关、餐馆、医院、停车场等信息同步地在LCD液晶显示屏上显示出来,方便中高端使用人员进行查询参考。
3 车载定位导航系统软件设计
在车载导航系统软件设计过程中,利用了Android软件平台的5大功能模 块,分别为Android应用程序层、应用框架层、普通函数库、Java程序运行环境和Linux内核层。在应用程序层利用Android的各种组件 API接口开发了针对车载导航的GPS、电子地图的Java应用程序,并在内核层提供了相应串口以及液晶屏等其他的底层驱动。
3.1 GPS定位模块软件设计
Android操作系统支持GPS APILBS,可以通过集成GPS芯片或外接GPS设备来接收卫星信号,通过GPS全球定位系统中至少3颗卫星和原子钟来获取当前设备的坐标数据。对于定 位功能而言,稳定性好是重中之重,而Android实现了这一点。Android提供了许多定位相关的类以及相关的函数,使得开发人员可以灵活应用。使用 位置信息管理类LocationManager进行GPS定位,使用Criteria类来实现自定义定位功能。当然在设计的导航系统中,我们希望所实现的 GPS设备尽可能省电,定位尽可能精确,并且需要获取运动物体的速度。因此,设置的Criteria对象如下所示:
- Criteria mCriteria=new Criteria();
- mCriteria.setAccuracy(Criteria.ACCURACY_FINE); /*经纬度是否精确提供*/
- mCriteria.setAltitudeRequired(false); /*是否提供高度信息*/
- mCriteria.setBearingRequired(false); /*是否提供航向信息*/
- mCriteria.setCostAllowed(true); /*费用*/
- mCriteria.setPowerRequirement(Criteria.POWER_LOW); /* 设置低电量参数*/
- mCriteria.setSpeedRequired(true); /* 是否获取当前物体的速度*/
接着将Criteria的参数传递给LocationManager对象。然后启动GPS定位功能,LocationManager对象就开始通过自身的函数来获取经纬度和其他一些数据。其获取数据的方法如下所示:
① 对于经纬度,getLatitude()返回维度数据,getLongitude()返回经度数据;
② 对于方向,hasBearing()判断是否有方向数据,而getBearing()则以度为单位返回其值;
③ 对于海拔高度,hasAltitude()判断是否有海拔数据,而getAltitude下则以m为单位返回海拔数据;
④ 对于速度,hasSpeed()判断是否有速度值,而getSpeed()则以m/s为单位返回速度值。
⑤ ***,LocationManager对象返回的数据及时地更新在电子地图上,并且随着物体和时间位置的变化,开发者可以利用LocationManager,使用定位监听器LocationListener根据时间和物体移动距离进行数据更新。
3.2 地图匹配算法设计
地图匹配以某个车辆位置点或某段车行轨迹曲线作为待匹配样本,以该点或该轨迹 曲线附近的所有道路上的位置点或道路曲线作为模板,通过待匹配样本或模板间的匹配,选择相似度***的匹配样本或模板作为匹配结果。***根据匹配结果校正定 位模块的定位误差。车载导航系统中将车辆定位显示在电子地图上时,应该根据车辆的行驶方向,将车辆定位显示于某一道路上。但是,由于各种误差(主要是定位 技术的误差),电子地图上显示的车辆会偏离实际的道路,失去其导航的功能;而地图匹配这一软件技术能校正定位技术的误差,使车辆位置准确地显示在电子地图 上。
可用来判断车辆当前可能在哪条路段上行驶的信息主要有3个:当前车辆定位点距 候选路段的投影距离、车辆当前行驶方向与候选路段方向的夹角以及候选路段与前一匹配路段的几何拓扑关系。一般来讲,投影距离和方向夹角越小的候选路段成为 匹配路段的可能性越大,反之亦然。此外,与前一匹配路段相同或拓扑相连的候选路段成为匹配路段的可能性大,其余的可能性小。车辆在行驶的过程中,把GPS 原始定位点向各待匹配路段作投影,可计算GPS原始定位点与待匹配路段之间的最短距离ri(i=1,…,n);另外车辆行驶方向与各待匹配路段之间的夹角 θi(i=1,…,n)也可以得到,进而计算各待匹配路段的匹配值λi(i=1,…,n)。
地图匹配算法在进行匹配时的步骤如下:
① 通过特征提取把所有的待匹配路段分析、描述,提取出相应的匹配因子。
图2 距离与夹角示意图
② 计算定位点P到各个待匹配路段的最短距离。距离与夹角示意图如图2所示。其中r1、r2为要求的最短距离;α1、α2为所求夹角。根据匹配规则,依次计算定点P到各个待匹配路段的匹配值。
③ 把匹配值中最小的路段作为最终匹配路段,并把在此路段上距离原始定位点最近的点作为最终匹配点。
3.3 电子地图显示模块设计
利用Android平台开发导航地图过程中,主要采用Android提供的 MapView和MapActivity两个类实现。其中MapView是一个展示地图的视图,它可以获取键盘事件来支持地图的移动和缩放功能,地图可以 以不同的形式来显示,如街景模式、卫星模式等,通过setSatellite(boolean) 、setTraffic(boolean)和setStreetView(boolean) 方法,同时也支持多层Overlay的使用。可以在地图上画坐标、写地名、画图片等。
MapView只能通过MapActivity来建立,因为MapView需要在后台使用文件系统和网络。所有这些线程需要在Activity的生命周期中被控制。
如何利用电子地图功能将GPS模块定位得到的经纬度信息在地图上显示出来呢? 地球上的任何一个地点都可以利用经纬度来表示。在Android的类库中,Point类代表了一个地点的经纬度,函数格式为:Pointment(int latitudeE6,int longitudeE6)。E6是微度,即度数乘以1000 000。如果要指定地图地点,须传递一个Point类到地图中。然后调用setMapLocationCenter方法将地图移动到合适的位置,***调用 MapController对象的animateTo方法将该坐标位置设置为地图的中心点。在实际应用中,可以使用zoomTo(int)缩放到需要的级 别,同时利用mapView.toggleSatellite()和mapView.toggleTraffic()来获得卫星图和路况图。
3.4 最短导航路径规划算法设计
求解最短路径问题的算法中,Dijkstra算法是国内外公认的比较成功的算法,该算法通用性强,而且编程实现简单,是目前理论上比较完善、应用最广泛的最短路径分析算法。Dijkstra算法按路径长度的递增次序,逐条产生最短路径。
Dijkstra算法的基本思想是:设从顶点V0出发,搜索从它到其他顶点的 最短路径。把有向图中的顶点集V分为两个集合,已求出最短路径的顶点集合S,尚未确定最短路径的顶点集合V-S(定义为T);按最短路径长度递增的顺序逐 个把集合T中的顶点加到集合S中,直到和出发点V0有路径相通的所有顶点都包含在集合S中。在整个过程中,V0到集合S中各顶点的最短路径长度都不大于 V0到集合T中的任意顶点的最短路径长度。
设带权有向图G={V,E},V={V0,V1,…,Vn-1},用带权的邻 接矩阵Arcs表示图G;Arcs[i][j]表示弧<Vi,Vj>上的权值,S表示已求得的从V0出发的最短路径终点的集合;向量D的每个 分量D[i]表示当前求得的从始点V0到每个终点Vi的最短路径的长度,算法描述如下:
① 初始化集合S、向量D。S={V0},D[i]=Arcs[0][i](i=0,1,…,n-1)。
② 选择Vj,使得D[j]=min{D[i]|Vi∈V-S},S=S∪{Vi}。
③ 修改从V0出发到集合V-S上任意节点Vk的最短路径长度。若D[k]>D[j]+Arcs[j][k],则修改D[k]为D[k]=D[j]+Arcs[j][k]。
④ 重复②、③操作n-1次,即可求得从V0到其余各顶点Vi的最短路径长度。
Dijkstra算法的时间复杂度是O(n2)。
在实际应用中往往只需要搜素从某一源点到某一或某几个特定终点的最短路径,用Dijkstra算法求解,此问题与求源点到其余各顶点的最短路径的时间复杂度相同,也为O(n2)。
4 性能测试分析
基于Android操作系统和ARM微处理器进行设计的车载导航系统,利用 Android通用框架和与设备无关的应用程序开发平台,实现了车载导航的软件总体架构。图3为车辆定位显示的应用程序窗口。截图所示范围为厦门软件园附 近,箭头为汽车所在位置。在实现的导航设备中,对导航设备的定位精度、电子地图显示速度以及在最短路径导航规划所需的时间进行性能测试。
图3 车辆定位显示的应用程序窗口
(1) 定位精度测试
现在国内民用较好的产品的导航定位精度基本控制在5~10 m,不太好的设备可能达到几十米甚至几百米,本次设计的导航终端经测试,定位精度约为7 m。
(2) 电子地图显示时间测试
当导航设备接收到GPS数据后,如果使用本地电子地图显示当前位置的时间为1 s之内;如果连网下载电子地图,显示当前位置的时间为3 s之内。
(3) 最短路径导航路径规划距离测试
通过最短路径规划后,测出从厦门到福州的最短路径是261 km,如果是普通的大路优先算法则是292 km;接着测试从厦门到北京的最短路径距离为2 106 km,如果是普通的大路优先算法,距离则是2 312 km。
结语
利用车载导航系统的设计方案,并结合Android系统特性设计的嵌入式系统 可嵌入到手机、PDA、POS机、机顶盒、数字电视、家庭媒体播放器等其他终端设备,具有很好的可移植性和可扩展性。在移动导航终端的应用中,以GPS导 航为代表的综合信息管理平台将是未来移动终端通信及导航产品的发展趋势,而Android系统在导航终端的应用将会逐步成熟和发展,产品价格也将最终接近 大众消费水平,届时导航产品将成为人们休闲、娱乐、旅游探险的必备工具。