概述
现代的导航有单机版与在线版之分。
单机版,即本机有完整的地图,完整的导航引擎和导航应用模块。无需连接服务器,本机就能完成导航的各种功能。这个一般又称离线版。单机版也分为多进程和多线程结构,多进程结构是将各个子系统用独立的程序来实现,当一个子系统出错,重启时,尽量不影响其他系统的执行,这种结构对系统配置要求较高,一般用于高端系列;而多线程结构是将所有模块在一个程序/进程中实现,当一个模块挂死、出问题,整个导航系统可能就需要重启。
在线版,即用户的界面只是一个图片和交互,其真正的地图资源,路径规划,展示图片的渲染都放在服务端完成。用户必须联网才能使用,如google地图。
二者的导航功能性都基本相同,但是其软件的架构,因为用户的数量(容量),基础设施(软硬件平台)的不同,会由较大的不同。
我们先从小的单机版开始,分析导航的内部结构。
导航一般是由HMI,逻辑控制层,导航引擎,数据驱动层,地图组成,并且是一个单向顺序分层的结构。整体模块的区分非常简单明了。
我们这里主要研究一下导航引擎的结构,并包括数据管理模块DataAccess。
导航引擎engine,也是由一系列的小模块组成。每个模块都能完成一些导航中必须的功能,并提供对应的使用接口API,当然也有一些内部模块,由于安全性,不对外开放,为其他模块提供服务。
如何划分导航引擎的这些模块?考虑的因素有哪些?
1. 相对独立性,也可以说是模块化因素。一个模块的内部改变不会影响其他的集成和测试。并且,模块的源码、文档原理也可以相对独立。
2. 性能。涉及性能的部分有两个,一个是算法,另外一个是数据通信或缓存。
3. 可变性。整体结构被重构或添加新需求的可能性有多大?或者哪个部分可能有变化?
总体上来讲,信息隐藏/封装是最重要的因素,也直接影响着其他因素。
由此,我们可以暂时列出以下几个模块:
common: 是导航各模块提取出的公共使用的部分,是导航引擎、导航控制器共同使用到部分,包括一些公共对象类型的定义,一些导航引擎和控制器的使用的代码,以及引擎内部子系统的公共代码。
data access:数据管理模块,数据共享,数据传输模块
核心功能模块:
destination input
positioning
routing
guidance
显示渲染模块
mapviewer
guidance viewer
增强功能模块:
drive assistance
...
由模块的名字,就可以猜出模块的功能,其依赖关系也是比较明晰了。
主要模块的依赖关系图
为保持模块的独立性,尽量减少模块间的依赖关系,环形结构是严格禁止的。
模块间数据通信的方式:
一般来说,模块间的数据通信分为异步和同步。大部分模块间的通信方式是异步形式,对实时性要求不是那么高;而部分模块如common和一些data access接口,这些内部接口,直接调用库或函数接口。DataAccess的设计,关系到导航引擎的性能、结构复杂度,它起着承上启下的作用。应该是导航引擎中最复杂、最重要的模块。
对于进程通信,基于socket的通信方式,一种非常灵活的方式,如D-bus.
其他进程通信方式
如管道,匿名管道,用于父子进程、子子进程间通信,而有名管道,可用于两个无关线程间通信。
文件映射,是进程将文件内容当做一块内存那样来对待。这种方式,只用于本机进程间通信方式,无法用于网络间通信,而且需要开发者控制进程间同步。
共享内存,是文件映射的一种特殊情况。
以上是导航引擎的整体结构,及其与周围模块的关系。后面会试着分析下各个子模块的结构设计。
最后
以上就是柔弱小笼包为你收集整理的导航引擎结构分析之一的全部内容,希望文章能够帮你解决导航引擎结构分析之一所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复