《41Google Earth在无人机地面控制站中的应用刘龑(8).doc》由会员分享,可在线阅读,更多相关《41Google Earth在无人机地面控制站中的应用刘龑(8).doc(8页珍藏版)》请在三一办公上搜索。
1、第二十八届(2012)全国直升机年会论文Google Earth在无人机地面控制站中的应用刘 龑 宋彦国(南京航空航天大学直升机旋翼动力学国家级重点实验室,南京,210016)摘 要:本文介绍了利用Google Earth二次开发技术,将其应用到无人机地面控制站中的方法。首先简单介绍了Google Earth应用程序开发接口及KML文件;其次介绍了地面控制站软件开发环境;然后分别阐述了地面控制站中打开并嵌入Google Earth、实现无人机航迹实时显示以及航点编辑的实现方法;最后对程序运行结果进行验证。关键词:地面控制站;航迹显示;航点编辑1 引言地面控制站作为无人机系统中的一个环节,不仅是
2、无人机飞行状态的显示终端,也是飞行任务设置以及无人机飞行的操纵端。它的稳定运行对完成飞行任务、确保飞行安全起着重要作用。为了提供精确的地理定位信息,大部分的无人机地面控制站都结合了地理信息系统(GIS)。本文介绍了在Visual C+ 6.0(VC 6.0)环境下将Google Earth加载到某型无人机地面控制站的程序窗体中,生成并打开KML文件实现无人机地理位置实时显示以及地面航点编辑功能。最后使用外部飞行数据驱动地面控制站以观察定位信息在Google Earth中的显示结果。2 Google Earth二次开发技术2.1 Google Earth简介2谷歌地球(Google Earth)
3、是Google公司开发的虚拟地球仪软件,它把卫星照片、航空照相和GIS布置在一个地球的三维模型上。Google Earth的卫星影像,并非单一数据来源,而是卫星影像与航拍的数据整合。Google Earth采用C/S(Client/Server)模式,通过Google Earth客户端向服务器发送请求,服务器响应并返回当前地图数据以实现地图的加载。Google Earth 广泛应用于石油、水利、房产、通信、电力、海事、物流、农业等多种行业。利用Google Earth 电子地图将空间特征信息进行可视化表达,能快速获得无人飞行器所处环境地物的基本特征,为导航定位和监控系统提供直观、清晰的信息服务
4、。2.2 Google Earth应用程序编程接口1为了实现Google Earth的二次开发,需要在VC 6.0中调用其应用程序编程接口,即Google Earth COM API。Google Earth COM API 是Google Earth 发布的基于组件技术的应用程序开发接口。Google公司以Google Earth COM API 函数作为公共接口,允许第三方应用程序从Google Earth 查询信息并能给Google Earth 发送命令。Google Earth COM API类型库中主要有11 个类,如表2.1所示。表2.1 Google Earth COM API中
5、的常用类类名说明IApplicationGE入口类,通过该类,进一步调用其它类ICameraInfoGE相机类,通过该类,可以调整观看当前视图的方式IFeatureGE要素类,通过该类,可以控制要素的属性IFeatureCollectionGE要素集合类,通过该类,进一步获取要素IPointOnTerrainGE地理坐标点类,通过该类,获取屏幕点的地理坐标IViewExtentsGE视图窗口类,通过该类,可以控制当前窗口大小ISearchControllerGESearch 面板类,通过该类,可以完成相应的搜索功能ITourControllerGETour 面板类,通过该类,可以动态播放当前的
6、要素IAnimationControllerGE通过该类,可以动态播放当前的时间要素ITimeGE时间类,通过该类,可以获取和设置要素的时间属性ITimeIntervalGE时间间隔类,通过该类,可以获取要素的时间间隔属性2.3 Google Earth中的KML文件2-3KML,是 Keyhole 标记语言(Keyhole Markup Language)的缩写,是一种采用 XML 语法与格式的语言,用于描述和保存地理信息(如点、线、图像、多边形和模型等),可以被 Google Earth 和 Google Maps 识别并显示。Google Earth 和 Google Maps 处理 K
7、ML 文件的方式与网页浏览器处理 HTML 和 XML 文件的方式类似。像 HTML 一样,KML 使用包含名称、属性的标签(tag)来确定显示方式。KML 的对象模型主要包括了Placemarks,Geometry,Image Overlays,Style 以及Network Links 五大元素,并定义了88 个标签项用以描述相应元素的属性。常用的制图元素主要有两类:点状元素即 Point 元素,其坐标采用真实的空间位置表示,即以经纬度、高度表示其位置,可以自定义文字的大小、颜色、透明度等。在航路绘制中可以用来表示单个航路点;线状元素,包括LineString(线段)和LinearRing
8、(闭合线)两种。也支持自定义颜色、宽度、透明度等。“线/折线”默认状态是无法显示相应线段的,这需要通过“点”(即经纬度和高度)数据来完成相应的配合处理。Google Earth 的标签项具有明显的层次关系,这种层次关系是树状的。下面是一个简单的KML 地标文件。其中,标签用来描述一个地标,标签用来显示一个地标的简单名称, 标签定义地图上一个点的坐标, 标签用来描述每一个点的经度(Longitude)、纬度(Latitude)和高度(Altitude),经纬度按照WGS-84 标准进行设置。3 Google Earth在无人机地面控制站中应用的实现3.1 程序开发环境及总体框架3.1.1 程序开
9、发环境利用Visual C+ 6.0的微软基础类库(MFC)创建基于对话框的可执行应用程序,在此基础上完成相应的程序编译和运行。Google Earth使用其plus版本,版本号为6.0.3.2197。为了实现Google Earth显示无人机航迹以及航点编辑功能,地面控制站需要实时生成并且打开保存地理位置信息的KML格式文件。KML实质上和XML语言是一致的,可以利用Microsoft XML Core Services (MSXML) SDK中msxml.dll定义的API接口,根据KML对象模型来生成所需的各个标签项。3.1.2 程序总体框架由VC 6.0编写的无人机地面控制站通过Goo
10、gle Earth COM API接口实现Google Earth启动和地图窗口嵌入,通过实时生成和打开KML文件实现航迹显示与航点编辑。 地面控制站 Google EarthGoogle Earth COM API打开Google Earth并嵌入航迹显示 Link航迹显示及航点编辑卫星地图屏幕坐标转换为经纬度KML处理 定时打开无人机当前位置KML文件的KML文件经纬度打开该KML文件Msxml接口创建KML文件 无人机当前位置KML文件 航点编辑航点编辑 定时打开地图航点编辑KML文件的KML文件经纬度 地图航点编辑KML文件图1 程序总体框架3.2 Google Earth的启动和退出
11、与其在程序窗体中的嵌入3.2.1 Google Earth的启动和退出在无人机地面控制站中利用Google Earth作为地理信息工具,首先要能够通过地面控制站本身启动和关闭Google Earth。为了程序的整体性,还应该将其卫星地图窗体部分嵌入到地面站窗体相应位置。通过VC类向导,将所需的类加入到程序中,地面控制站程序打开Google Earth的流程及部分代码如下: 开始 创建地面站程序窗体Google Earth COM库初始化N 初始化成功? 结束 Y 打开Google Earth地图窗口内嵌 结束图2 通过程序控制Google Earth打开流程图static const CLSI
12、D CLSID_Application=0x8097D7E9,0x1D,0xF7,0x84;/Google Earth标识码IApplicationGE m_geApplication;/IApplicationGE类对象:CoInitialize(NULL);/初始化COM库if (m_geApplication.IsInitialized()m_geApplication.CreateDispatch(CLSID_Application,NULL);/打开Google Earth在主程序窗口销毁时产生ON_WM_DESTROY()消息,在其消息处理函数中执行关闭Google Earth的操
13、作。通过直接查询其进程并将其关闭以彻底退出Google Earth:if (hwnd=:FindWindow(NULL,Google Earth):GetWindowThreadProcessId(hwnd,&processid);hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, processid ); :TerminateProcess(hProcess,4);:CloseHandle(hProcess);3.2.2 Google Earth在程序窗体中的嵌入打开Google Earth后需要将其地图窗口部分嵌入至地面控制站窗体指定位置,
14、其基本原理是通过二次开发接口获取卫星地图窗口句柄之后,将地面控制站窗体中需要嵌入地图的窗口设为它新的父窗口,并将Google Earth原来的主窗口隐藏。其实现代码如下:/获取Google Earth主窗口HWND hWnd=(HWND)m_geApplication.GetMainHwnd();long lMainWndStyle=:GetWindowLong(hWnd,GWL_STYLE);:SetWindowLong(hWnd,GWL_STYLE,lMainWndStyle&(WS_CAPTION);/去除标题栏/内嵌Google Earth区域RECT PlotRec;CWnd* Pl
15、otAera=GetDlgItem(IDC_STATIC_GE);/将Google Earth放置到该区域PlotAera-GetWindowRect(&PlotRec);/获取该区域大小信息long Width=PlotRec.right-PlotRec.left;long Height=PlotRec.bottom-PlotRec.top;:SetWindowPos(hWnd,NULL,0,0,Width,Height+50,SWP_HIDEWINDOW);/设置主窗口位置,并将其隐藏/获取卫星地图窗口句柄HWND hRender=(HWND)m_geApplication.GetRend
16、erHwnd();:SetWindowPos(hRender,NULL,0,0,Width,Height,SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER);/地图窗口相对新父窗口的位置参数:SetParent(hRender,PlotAera-GetSafeHwnd();/将地图父窗口设置为放置窗口至此,地面控制站实现了Google Earth启动并将其嵌入至指定窗口,程序退出时自动关闭相关进程。程序运行结果如图所示:图3 Google Earth嵌入至地面站窗体3.3 无人机航点、航迹的显示与重绘在Google Earth上实时显示无人机的当前位置并且画出飞行轨迹,这是
17、需要实现的主要功能,也是整个地面控制站中无人机地理信息显示最为重要的部分。实现该功能的重点在于参照谷歌公司相应的说明文档了解KML语言结构和各个标签项属性,难点在于如何利用VC 6.0结合MSXML来生成相应的KML文件。主要通过生成KML文件来保存采集到的当前无人机GPS位置数据,并不断更新;把当前航点和前一航点用线段相连,从而形成航迹;其中还定义了航迹属性,包括线宽、颜色等等。通过另一个KML文件与记录位置信息的KML文件链接,该KML文件设定了所链接KML文件的路径和打开频率,通过不断打开保存经纬度信息的KML文件来刷新显示无人机当前位置。VC 6.0中通过MSXML编程接口来生成这一系
18、列标签并组成树形结构,最终保存成特定的KML格式文件。编程需要用到的语句并不复杂,主要是要了解所需KML文件的结构。以下是通过MSXML创建一个标签的例子:/初始化MSXML库并创建实例MSXML2:IXMLDOMDocumentPtr pDoc;HRESULT hr=pDoc.CreateInstance(_uuidof(MSXML2:DOMDocument40);/创建标签MSXML2:IXMLDOMElementPtr pKml;pKml=pDoc-createElement(_bstr_t)kml);pKml-setAttribute(xmlns,pDoc-appendChild(pK
19、ml);MSXML2:IXMLDOMElementPtr pDocument;pDocument=pDoc-createElement(_bstr_t)Document);pKml-appendChild(pDocument);/“kml”标签项中加入子标签“Document”上述语句所生成的KML文件如下所示:kml xmlns=根据谷歌公司提供的KML说明文档3,生成相应的标签项,在标签项中写入对应的值,记录当前地理位置信息并将各个航点相连,形成航迹。要实时显示航迹需要生成另一个KML文件与保存位置信息的KML文件链接,并定时刷新用以更新地图显示。该KML文件实现这一功能的相关语句为:D:
20、/Airline.kml /所链接的KML文件路径onInterval 0.1 onStart 4 /刷新频率若要清除地图上的航迹,只需要将记录位置信息KML文件中记录经纬度坐标的标签项下的值清空即可。3.4 基于Google Earth的航点编辑的实现实现在Google Earth上进行航点编辑的功能,其方法和显示航迹基本一致,只不过显示航迹所记录的位置信息是无人机当前的经纬度和海拔高度,而航点编辑时所记录的位置信息来源于鼠标在地图上所点击点的经纬度。因此实现该功能的重点在于获取鼠标所点击点的地图坐标。地图坐标实时获取需要用到Google Earth 所提供的类IPointOnTerrain
21、GE,IPointOnTerrainGE 类调用IApplicationGE 类成员函数GetPointOnTerrainFromScreenCoords(double screen_x, double screen_y)将卫星地图窗口坐标转化为经纬度坐标。2Google Earth嵌入到地面站程序窗体中后,当鼠标移动到其窗口之上时,焦点被Google Earth所获取,主程序无法响应鼠标点击所发送的消息,这是实现航点编辑遇到的主要难题。为了解决这一问题,可以利用HOOK技术屏蔽Google Earth进程中的鼠标点击消息,依靠自定义鼠标点击时的消息相应函数来实现鼠标焦点的获取。而在实现过程中
22、为了防止所有鼠标点击消息被屏蔽以及自定义各个鼠标点击响应函数的繁琐,采用了一种更为简便的实现方法,即在发送航点编辑指令之后,创建一个透明子对话框,其大小与Google Earth窗口大小一致,覆盖在其窗口之上,鼠标点击时焦点重新被获取到透明对话框之上,从而使得主程序能够响应鼠标点击所发出的消息。鼠标在窗口上的坐标值是Windows默认的坐标,通常为该点所在屏幕像素坐标,屏幕左上角规定为原点。将该坐标转换为经纬度还需要通过换算将其转换成Google Earth规定坐标系下的坐标值,其规定屏幕中心点为原点。Google Earth屏幕坐标系如下图所示:2图4 Google Earth屏幕坐标系假设
23、当前鼠标坐标为(x,y),将此坐标转换为Google Earth屏幕坐标,其转换公式为:X=(x-m)/Width*2 Y=(n-y)/Height*2 (3-1)在式(3-1)中,Width 为Google Earth窗口的左边框到右边框的宽度,Height 为上边框到下边框的高度。(m,n)为窗口中心点的坐标。经过上述坐标转换公式后计算出的(X,Y)坐标为Google Earth屏幕坐标系内的坐标。将此坐标值代入函数GetPointOnTerrainFromScreenCoords 中,便可得到鼠标点击点所代表的地图经纬度值。部分代码如下:/获取鼠标坐标:GetCursorPos(&m_C
24、ursoPoint); /转换为Google Earth屏幕坐标m_ge_screen_x=(double)(m_CursoPoint.x-Width/2)/(Width/2);m_ge_screen_y=(double)(Height/2-m_CursoPoint.y)/(Height/2); gePoint=m_geApplication.GetPointOnTerrainFromScreenCoords(m_ge_screen_x,m_ge_screen_y); /屏幕坐标转换为经纬度m_ge_lon.Format(%f,m_googleearth_dlg.gePoint.GetLong
25、itude();/地理坐标经度m_ge_lat.Format(%f,m_googleearth_dlg.gePoint.GetLatitude();/地理坐标纬度4 Google Earth在地面控制站中的运行结果将程序编译并运行,测试上述功能的运行情况,能够达到预期要求。运行结果如图所示: 图5 航点编辑运行结果 图6 航迹显示运行结果5 结论利用Google Earth二次开发技术并结合KML语言,通过Visual C+将其应用到无人机地面可控制站之中,为地面站提供了无人机航点航迹直观显示和航点编辑功能。通过程序运行结果,得到以下结论:(1)为实现无人机航迹实时显示,采用通过一个KML文件
26、链接到另一个保存位置信息的KML文件的方法,通过设置其打开频率来确定航点信息在地图上显示的更新频率。(2)为了在航点编辑时响应鼠标点击消息,采用了在Google Earth窗口上覆盖透明子窗口从而获取鼠标焦点的方法,扩展了Google Earth二次开发能力。(3)将进一步丰富视角设置、三维航迹显示等功能,充分利用其二次开发能力。参 考 文 献1 Google, Inc. Google Earth COM API Documentation.2009-9-122 江宽,龚小鹏. Google API开发详解:Google Maps与Google Earth双剑合璧.北京:电子工业出版社, 20
27、083 Google, Inc. Google Earth Keyhole Markup Language Documentation Introduction.2010.74 胡朝晖.利用MSXML解析XML文档N.计算机世界,2000(50) 5 王艳,何凭宗.基于VC+的Google Earth KML地标文件的自动生成及应用.北京测绘,2009,(02):32346 张春波,陈琰,李灿等.基于Google Earth的电网GIS应用研究.机电工程, 2009,26(11):34377 马俊,杨忠,杨成顺,等.基于Google Earth的人机交互平台设计.应用科技,2010,37(7)
28、:610 On the Application of Google Earth in UAV Ground Control StationLIU Yan SONG Yan-guo(Science and Technology on Rotorcraft Aeromechanics Laboratory,Nanjing University of Aeronautics and Astronautics,Nanjing,210026,China)Abstract: How to use the redevelop technology of Google Earth in UAV ground
29、control station is described in this article. First of all ,it gives an overview of the Google Earth application programming interface and KML files. Secondly, the programming environment of software is introduced;.Then it expounds ways to open and embed Google Earth in the ground control station, display UAV real-time track and edit waypoint; Finally, to verify the result when running this program.Key Words: ground control station; track display; waypoint edit258