热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中怎么实现一个车载导航系统

这篇文章给大家介绍Android中怎么实现一个车载导航系统,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1Android操作系统介绍

这篇文章给大家介绍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所示。

Android中怎么实现一个车载导航系统

图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)。

地图匹配算法在进行匹配时的步骤如下:
① 通过特征提取把所有的待匹配路段分析、描述,提取出相应的匹配因子。

Android中怎么实现一个车载导航系统

图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]表示弧上的权值,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为车辆定位显示的应用程序窗口。截图所示范围为厦门软件园附 近,箭头为汽车所在位置。在实现的导航设备中,对导航设备的定位精度、电子地图显示速度以及在最短路径导航规划所需的时间进行性能测试。

Android中怎么实现一个车载导航系统

图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中怎么实现一个车载导航系统就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • SLAM优秀开源工程最全汇总
    https:zhuanlan.zhihu.comp145750808 1、CartographerCartographer是一个系统,可跨多个平台和传感器配置以2D和3D形式提供实 ... [详细]
  • 如何更好地解决高速公路的视频管理与应急通信指挥问题?
    高速公路的信息化建设,历经了最初的集群通信、软件作业系统、视频监控部署、视频指挥调度、以及智能化管理等阶段。如今,不少省份已经在开始建设3G专网 ... [详细]
  • Android和iOS的数据库都是用SQLite来实现.一,SQLite数据库简介:轻量级:SQLite数据库是一个轻量级的数据库,适用于少量数据的CURD;文件本质:SQL ... [详细]
author-avatar
宜宾开心花行
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有