APP下载

基于MFC和OpenGL的三维车载导航系统

2015-12-22刘旭东,葛俊杰

烟台职业学院学报 2015年3期

基于MFC和OpenGL的三维车载导航系统

刘旭东1,2,葛俊杰2

(1.烟台职业学院 科研处,山东 烟台 264670;2. 烟台职业学院 信息工程系,山东 烟台 264670)

摘要:近年来,随着我国经济的迅猛发展,城市机动车的数量和交通流量不断增加,交通堵塞频繁发生,给人们的出行带来极大的不便。因此,开发设计一种智能车载导航定位系统,是实现我国道路智能化管理的迫切需要。系统采用Visual C++设计,使用SQL SERVER为后台数据库,使用OpenGL进行三维场景绘制。不仅提供了传统车载导航所需的最优路径查询、语音提示以及信息查询等功能,还实现了测距、智能返航、行驶过程视角转换以及新增点等功能。

关键词:GIS;车载导航;MFC;OPENGL

收稿日期:2015-08-11

作者简介:刘旭东(1976-),男,山东龙口人,烟台职业学院科研处副教授,硕士.

中图分类号:U46

1系统可行性分析

现代人对于车载导航系统已经不是很陌生,汽车导航系统为地球表面上每一块土地提供了一个全新的、瞬时可知的地址,而且通过GIS/GPS的应用,该智能车载导航定位系统基本包含了现有车载导航系统的全部功能,主要包括导航功能、语音提示功能、测速功能、测距功能、智能返航、在虚拟环境中应用模拟车载系统、交互式视角转换、信息查询功能、新增点功能等。

1.1 技术可行性分析

人工智能的普及与掌握,如算法分析,语音识别等,使软件开发工作变得日益简单。使用MicrosoftVC++6.0开发环境,利用3dmax与OpenGL等开发技术,开发过程不是很长且难度适中。

1.2 经济可行性分析

本系统是在OpenGL技术基础上开发的三维车载导航系统,利用宿舍和机房电脑,图书馆等方便的资源,不需要太多人力和物力就可以设计并实现,考虑到整个系统所需要的硬件和软件环境,本系统的投资较小,具有经济上的可行性。

1.3 开发及应用环境

VisualC++6.0是微软公司推出的开发Windows环境下面向对象的可视化集成工具。它提供了功能强大的MFC类库,开发者只需做少量的工作就可以得到功能齐全的Windows应用程序。MFC使编程工作变得更加轻松容易。

SQLServer是基于客户机/服务器(Client/Server)模型的新一代大型关系型数据库管理系统(DBMS),为企业的数据管理提供强大的支持,它在电子商务、数据库解决方案和数据仓库等应用中起着重要的作用。它可以将VB、VC++作为客户端开发工具。随着其产品性能的不断改善和扩大,SQLServer在数据库系统领域已经占有非常重要的地位。

OS:Windows2000以上(Vista除外),编译和测试软件:VisualC++6.0(提供编程环境,编译环境),辅助库:OpenGL库。

2设计技术简介

OpenGL是OpenGraphicsLib的缩写,是一套三维图形处理库,也是该领域的工业标准。OpenGL是科学计算、专业图形处理等高端应用领域的标准图形库。它被设计成独立于窗口、独立于硬件,运行在具有操作系统的各类计算机上,在网络环境下以客户机/服务器(Client/Server)模式工作。

3dsMax(原名:3DStudioMax),是Autodesk传媒娱乐部开发的、运行在Win32和Win64平台上的全功能三维计算机图形软件。它首先开始运用在电脑游戏中的动画制作,后来更进一步开始参与影视片的特效制作,例如最后的武士,X战警II等。除外,朱邦复工作室所开发的“导演平台”也是以Plug-In方式建立在这个软件上。

3系统概要设计

融合三维虚拟场景漫游和电子交通GIS系统,将两者巧妙的联系在一起,使用户在更加逼真的三维场景中,实现交通信息的查询,测速,测距,智能导航等二维电子地图应有的功能;并提供第一人称与第三人称视角的切换功能,从而达到漫游与导航双重功能的实现;全程语音提示,使得用户使用更加方便。另外,本系统还有收音机、音乐播放等功能。

车载导航系统实现如下功能:导航、语音提示、测速、测距、智能返航、虚拟环境模拟车载导航系统、新增点、视角转换、信息查询、音乐、收音机等。根据这些功能,系统可分为以下8个模块:

①GIS操作模块,主要包括导航、测距、测速、电子地图放缩及移动、智能返航等功能;

②语音提示模块,主要包括全程转向及重要建筑物提示功能;

③三维场景生成模块,三维场景的显示;

④虚拟场景漫游模块,在虚拟环境模拟车载导航系统功能;

⑤信息查询模块,一定范围信息查询、制定地点信息查询、最短路径查询等三种信息查询方式;

⑥新增点模块,在电子地图上实现点的添加功能;

⑦音乐播放模块,播放音乐功能;

⑧车内仪表盘模块,汽车速度指针及发动机转速指针的偏转。

语音提示模块、信息查询模块的最短路径查询以及GIS模块的导航功能、智能返航功能都要共享同一个最短路径关键点数组。

数据库表的描述:

①Detail表——存储场景中建筑物的详细信息:编号、坐标、建筑物的长度和宽度,最近路的坐标等,用于输入查询,Detail见表1。

②KeyPoint表——存储路上的关键点的信息:编号和坐标,用于最短路径和智能返航,KeyPoint见表2。

③Point表——存储路上的信息点,用于最短路径,Point见表3。

④Road表——存储路的信息,编号,起始点和终点的坐标,以及路的名称。用于输入查询,Road见表4。

表1Detail表表2KeyPoint表

表3  Point表                表4  Road表

4系统实现

4.1 启动界面

由于场景较大,加载时间比较长,增加启动动画过程,使客户既可以对我们的系统有一个大概的了解,又使客户不会在这段时间感到枯燥。该启动画面的实现我们采用双线程同时运行,启动界面如图1所示:

图1 启动界面

4.2 最短路径

最短路径是车载导航系统最基本的功能之一,我们提供了最终最短路径的寻求方式:①当前点到任意点最短路径,②任意两点的最短路径。这两种最短路径的实现原理是一样的,即:首先在二维电子地图上选取点(根据不同的需求选择一个或两个),然后查询数据库得到选择点的序号,再调用计算最短路径函数ShortPath(intstart,intend)计算最短路径上的关键点,最后绘制计算出的最短路径。如图2所示:

图2 最短路径

主要代码如下:

//查询中间点的过程用到了DIKSTRA算法,但做了一定改进,即最短路径的关键点按顺序输出,方便最短路径的显示

for(w=1;w<=200;w++)

if(final[w]==0&&min

{

D[w]=min+G.arcs[v][w];

for(j=1;j<=200;j++)

{

BeginLink[w][j]=BeginLink[v][j];

if(w==end)

{

if(BeginLink[v][j]==1)//如果j是最短路径上的点,应当知道它是第几个,从而按顺序按顺寻显示

order[final[j]]=j;

else

order[final[j]]=0;

}

}BeginLink[w][w]=1;

}

4.3 智能返航

智能返航功能是客户在选择最短路径后,系统自动记录行驶轨迹,待用户想沿原始路线返回时,启动“智能返航”,即可绘制出用户的行车路线。如图3所示:

图3 智能返航

主要代码如下:

if(g_DrawCurrent==6)//记录终点并执行画线

{

if(m_bFindEnd)

{

m_bFindEnd=false;

m_NavKeyPoint[++m_NavLast].x= (int) (CCamera::m_Position.x*240/1000);

m_NavKeyPoint[m_NavLast].y= (int) (240+CCamera::m_Position.z*240/1000);

}

CPenpen(PS_SOLID, 2,RGB(248, 7, 0));

CPen*oldpen=ht.SelectObject(&pen);

ht.MoveTo((int)(m_NavKeyPoint[0].x*blc/240+m_xStart),(int)(m_NavKeyPoint[0].y*blc/240+m_yStart));

…}

4.4 信息查询

图4 信息查询

输入查询是车载导航系统的基本功能之一,用户可以在不确定目的地点的情况下,查询两点之间的最短路径;另外可以进行一定范围的信息查询,也可以查询特定地点的地理位置。信息查询对话框如图4所示:

三种查询方式的实现原理是一样的,即首先获得Combobox的信息,再根据相应要求做计算,最后在二维电子地图上绘制出需要显示的信息。下面以范围信息查询为例说明实现原理。

主要代码如下:

intrange=atoi(RangeStr);

if(m_DetailSet.Open())

{

m_DetailSet.MoveFirst();

while(!m_DetailSet.IsEOF())//根据类型距离判断目标信息

{

if(m_DetailSet.m_Type==g_ContentType&&sqrt((g_point.x-m_DetailSet.m_CenterX)*(g_point.x-m_DetailSet.m_CenterX)+(g_point.y-m_DetailSet.m_CenterY)*(g_point.y-m_DetailSet.m_CenterY))

g_SelectArr[g_t++]=m_DetailSet.m_ID;

m_DetailSet.MoveNext();

}

g_ContentType=0;

m_DetailSet.Close();

}

4.5 语音提示

语音提示也是车载导航系统的常用功能之一。我们的语音提示主要用于两个方面,一是转弯语音提示,二是重要建筑物提示。转弯语音提示的实现原理是根据当前点判断汽车是否转向,如果判断出转向,调用需要转向的语音;重要建筑物提示的实现原理是根据将二维电子地图上的建筑物划分为不同的区域,当汽车第一次进入该区域时,调用此区域的语音。

主要代码如下:

CStringstrz="SoundData/10z.mp3";

CStringstry="SoundData/10y.mp3";

if(c<=1.0f)

{

d=m_TempPoint3.y-m_TempPoint2.y;

if(a>=0)

{

if(d<-5&&m_bPlay) //左拐

{

m_Mp3Music.Play(strz);

m_bPlay=false;

}

elseif(d>5&&m_bPlay) //右拐

{

m_Mp3Music.Play(stry);

m_bPlay=false;

}

}

else

…}

5系统测试及结果分析

5.1 系统测试

系统的测试严格遵循软件测试中的测试原则,系统采用黑盒的方法,让程序设计之外的人员,在事先不了解程序设计的逻辑结构的条件下,以随机方式进行导航、语音提示、测速、测距、智能返航、虚拟环境模拟车载导航系统、新增点、视角转换、信息查询、音乐、收音机等操作。经过进行反复的测试和修改,使系统功能逐步完善。

5.2 结果分析

系统网站开发环境采用VisualC++6.0和SQLServer数据库。系统安装方便简洁,运行安全可靠。系统的功能基本达到预期目标,在三维场景中实现了传统车载导航系统的的各种功能,也可实现在三维场景中漫游,具有一定的借鉴和参考价值。

6结束语

开发设计的三维空间模拟车载导航系统已经基本实现了导航、语音提示、测速、测距、智能返航、虚拟环境模拟车载导航系统、新增点、视角转换、信息查询、音乐、收音机等功能,实现了程序最初的设计目标,适合在实际中应用。

参考文献:

[1]徐明亮,卢红星,王晚.OpengGL游戏编程[M].北京:机械工业出版社,2008.

[2]侯俊杰.深入浅出MFC(第二版)[M].武汉:华中科技大学出版社,2001.

[3]陈建春.VisualC++ 开发GIS系统(第2版)[M].北京:电子工业出版社,2004.

[4]殷人昆,陶永雷,谢若阳,盛徇华.数据结构——用面向对象方法与C++描述[M].北京:清华大学出版社,2006.

[5]高恩婷.基于VC++的OpenGL三维应用程序的设计[J]. 苏州大学学报(自然科学版),2007(4).

[6]周扬,刘永涛.基于OpenGL的事故三维综合演示平台[J].重庆理工大学学报(自然科学版),2015(4).

[7]程飞.基于MFC与OpenGL的可视化机械仿真设计系统[J].五邑大学学报(自然科学版),2014(3).

(责任编辑侯中岩)