嵌入式定位系统的实用设计与软件算法实现

发布者:pi26最新更新时间:2010-10-19 来源: 电子设计工程 关键字:GPS  MiniGUI  Linux  数据算法 手机看文章 扫描二维码
随时随地手机看文章

  定位系统自问世后便得到了蓬勃发展,其应用已渗入到各行各业。个人消费领域引领移动定位类型科技产品集中涌现,其他领域和行业也有大量技术更新。目前各领域的定位系统主要集中在平台和地图的研发上,平台配合应用要求选用硬件,地图根据显示要求实现软件算法。因而,它们在定位系统的研究工作中各成体系,兼容性不强。

  近年来,在定位系统设计中,硬件选择越来越集中在几个品牌的几个型号上。而软件设计方面比较分散。因而在一个兼容性强的平台上实现软件的集中研发,将是未来的研发方向。

  这里提出一种系统构造模式,弱化硬件平台的影响而力求最大限度的统一软件设计。

  1 系统整体设计方案

  这里提出一种实用的设计方案,通过对系统的各方面配置,实现GPS实时导航功能。系统主控器件采用韩国Samsung公司生产的ARM核32位RISC微处理器S3C2410,并在由其组成的开发板上移植Linux操作系统,Linux操作系统负责系统的整体调度和控制。通过S3C2410的UART接口连接GPS接收机,用以接收NEMA0183格式的GPS定位信息。通过UART接口和GSM/GPRS模块MC35进行通信。

  为了在移动LED上实现电子地图的绘制显示,系统的整体层次结构框图如图1所示。Linux操作系统负责底层硬件的初始化和管理,并向上层提供应用接口,MiniGUI完成电子地图在LED上的绘制,并通过Linux内核提供的应用接口与GPS接收机和GSM/GPRS模块完成通信等功能。

  2 图形界面支持系统——MiniGUI

  MiniGUI是一个针对嵌入式系统的轻量级图形界面支持系统。MiniGUI能够在各个不同的平台上提供最大程度的接口兼容性,可运行于AR-M、MIPS等各种主流嵌入式硬件平台之上。它能够提供一个轻型、资源开销少的嵌入式图形接口。

  这里利用MiniGUI Ver l.3.3版本,将其编译为lite版本并移植到基于ARM核的32位微处理器S3C2410上。在此基础上,开发基于MiniG-UI的电子地图显示应用程序,配合GPS信号接收机实现定位导航功能。

  2.1 交叉编译MiniGUI

  MiniGUI从结构层次上可以分为3层,最上层是APT层,中间层是MiniGUI核心,负责维护整个窗口系统的运行,最下层由2部分组成,即图形抽象层(GAL)和输人抽象层(IAL)。

  为了使MiniGUI能够在不同的目标平台上运行,必须有针对相应平台的交叉编译环境。根据本文的设计选用S3C2410器件,则选择交叉编译环境Linux-ARM,选择Mizi公司针对Samsung公司32位ARM核RISC微处理器S3C2410设计开发的工具链,这样的配置环境使软件和硬件具有更好的兼容性。具体交叉编译的步骤如下:

  1)修改configure文件。设置make环境变量CC、LD及AR等。

  2)GAL(图形引擎)和IAL(输入引擎)接口的实现。在MiniGUI中,GAL和IAL是MinGUI的2个基础设施,MiniGUI的高可靠度在很大程度上也是由于这2个接口提供了独立于硬件的抽象能力。这2个接口的抽象类似于Linux内核中的虚拟文件系统。

  在具体实现一个输入引擎(IAL)时,其中最为关键的是事件处理函数wait_event()的实现,MiniGUl会不断的调用该函数,来确定在输入引擎上是否有输入事件发生。这里需要特别注意的是,因为MiniGUI是通过select系统调用来实现进程间通信机制的,因此在实现lite版本输入引擎的wait_event函数时,一定要通过select函数或与其等价的poll函数实现。与此同时,在实现目标板的触摸屏驱动时,必须要实现对应file_operaTIons结构中的poll函数指针。即使触摸屏驱动未提供poll函数,也要在wait_event返回之前调用select,并传递相关参数。

  Linux系统提供了一种基础设施——FrameBuffer,通过这个设施Linux的图形输出有了统一的接口。由于MiniGUI可以通过FrameBuffer获得统一的图形引擎接口。

  因此其适应性大大提高,也就很少需要再为MiniGUI编写GAL驱动层。

  3)依次运行configure、make和make install命令,完成MiniGUl的配置和编译。

  经过上述编译过程,会将编译好的MiniGUI库文件安装在/home/MiniGUI-lite目录下。为了减小库文件的大小,根据需要利用config-ure命令去掉MiniGUI中一些不需要的功能,同时利用交叉编译工具链中的strip命令删除MiniGUI函数库中的符号信息和其他一些调试信息。

  2.2 MiniGUI向S3C2410上的移植

  在嵌入式系统开发过程中,编译完MiniGUI和应用程序后,把MiniGUI库和应用程序拷贝到为目标系统准备的文件系统目录中,然后使用相关工具生成文件系统映像,下载到目标板上。

  MiniGUI在运行时需要一个配置文件,用来配置MiniGUI运行所需要的环境参数。本设计中,将配置文件MiniGUI.cfg放到目标板的/etc目录下。另外,MiniGUI使用framebuffer作为其输入引擎,因此在编译Linux内核时,选择将framebuffer相关的功能编译到内核中去。

  3 绘制基于MiniGUI的电子地图的算法

  3.1 提取电子地图数据的算法实现

  由于GUI的程序和传统单一流程的程序不太相同,因此通过简单的循环获取GPS数据的方式是不可取的。该系统通过多线程的循环提取数据,每组数据的提取与处理是在一个单线程中完成的,从而避免了数据和处理的复杂交互,能更好地体现实时性。

  首先,对所采用的坐标系进行说明:假定有一个形状为严格矩形的地图,其像素坐标原点为(O,0),地图X轴方向上的宽度为W个像素点,Y轴方向上的高度为H个像素点,地图上某点的坐标为(X,Y),则定义该像素点的归一化坐标为(x/W,y/H)。对于终端而言,其覆盖的地理范围相对于地球半径来说几乎可以看作无穷小,故可以认为电子地图所对应的经纬度坐标在其覆盖的区域内是线性变化的。有了这2个点的坐标数据后,当从GPS接收机读取到经纬度坐标时,根据近似的线性映射关系,就可以算出该坐标在电子地图上的归一化坐标。这种映射关系,根据欧式几何原理即式(1)和式(2),由已知的2个点可以算出点A和点B的未知参数。

  要得到地图的左上角和右下角的经纬度坐标,只需知道地图边界范围内任取的2个参考点的4个参数即可。通过在某地实地采集的3个参考点,得到表l所列的坐标数据。

  根据公式,上面的3个参考点共有3种组合方式,分别得出3组经纬度值,对这3组取平均值,以减少误差,提高精度。最终求得左上角和右下角的坐标数据,如表2所示。

  从而得到基准点,并将其坐标数据保存到坐标数据文件taiyuan_gps.dat中。

  为了提高灵活性,这里为坐标源数据定义如下数据结构:

  3.2 GPS线程

  采用单线程对采集的一组数据进行读取、解析和计算。在程序中定义一个pthread_t类型变量,代表采集并解析GPS数据的后端线程。由于GUI的前端和后端GPS线程都要访问某些GPS数据,因此需要在线程间采用同步策略。这里利用线程锁来实现,将其定义为GPSL0CK。它是一个pthread_mutex_t类型的变量。

  对应于Point型、Pline型和Region型3种类型的地理信息,分别定义数据结构_POINT、_PLINE和_REGION。以道路为例,在程序中定义对应的_PLINE结构来描述相关信息,该结构定义如下:

  3.3 MiniGUI下电子地图的绘制

  MiniGUI程序的入口点为MiniGUIMain.main函数已在MiniGUl的函数库中定义,该函数在进行一些MiniGUI的初始化工作后调用MiniGUI-Main函数。先调用SetDesktopRect函数来设置程序的显示区域,然后调用CreateMainWindow函数创建并显示程序的主窗口,最终进入消息循环。

  MiniGUI是消息驱动的系统,一切运作都围绕消息进行,MiniGUI应用程序通过接收消息来与外界交互。在电子地图的绘制过程中,主要用到MiniGUI的窗口绘制消息MSG_PAINT。该消息在需要进行窗口重绘时发送到窗口过程。MiniGUI通过判断窗口是否含有无效区域来确定是否需要重绘,在需要进行重绘时,MiniGUI会向相应的窗口过程发送MSG_PAINT消息。MSG_TIMER则主要负责从后端GPS线程中取得当前的经纬度信息,格式化之后输出到文本框中。

  当MiniGUI主程序接收到其GPS通信子进程发送的SIGUSRl信号时,就会调用相应的信号处理函数。为了实时更新定位点在电子地图中的位置,必须在该函数中读取共享内存中的最新位置信息;同时根据定位点位置的变化确定需要重绘的区域,调用MiniGUI中的lnvalidateRect函数使该区域无效。通过这种方式使得最新的位置信息实时地显示在电子地图上。

  4 结束语

  随着社会信息化的发展,GPS导航终端的使用已成燎原之势,越来越多的设备配备定位或导航功能。本设计利用MiniGUI来实现GPS的基本功能,使地图的绘制工作脱离繁琐的底层硬件,大大简化了此项工作,再配合GPS信号接收机实现实时定位导航功能。同时,本设计还有许多地方值得改进,例如通讯反馈精度和矢量化地理信息的优化显示等。

关键字:GPS  MiniGUI  Linux  数据算法 引用地址:嵌入式定位系统的实用设计与软件算法实现

上一篇:合众达联手TI推出免费Code Composer Studio IDE v4
下一篇:ADISl6209 IMU在倾角测量中的应用

推荐阅读最新更新时间:2024-05-02 21:10

各国GPS产品新花样为步行导航商务雷达
在刚刚结束的青岛奥运帆船赛中,不仅所有工作车上安装了GPS系统,而且4个级别赛船上使用了GPS定位系统和电子海图同步系统,在运动员有异议的时候,GPS记录能帮助裁定。 在奥运赛场这样的特殊场合之外,GPS帮助驾驶者在陌生的地域自如穿行,其便利性不言而喻。 从全球最大的导航设备企业TomTom的二季度财报可以看出全球PND(便携式导航设备)市场正处于上升阶段。今年第二季度,TomTomPND出货量306.6万台,比第一季度增长54%,比去年同期增长70%。 在快速的增长中,各国GPS行业萌发出了丰富多彩的“新花样”。 谷歌:为步行者“导行” 不仅为驾驶者服务,GPS还可以为步行者服务。谷歌近日宣布
[汽车电子]
各国<font color='red'>GPS</font>产品新花样为步行导航商务雷达
基于ARM-LinuxMiniGUI的仿真与移植
近几年,随着嵌入式系统的日益发展和32位嵌入式处理器以及图形显示设备的广泛应用,目标产品对GUI(图形用户界面)的需求越来越多。由于嵌入式系统一般实时性要求很高,所以嵌入式系统下的GUI需要具有轻量级型、占用资源少、高性能等特点。此外,嵌入式系统往往是一种定制设备,它对GUI的需求各不相同,因此,GUI必须也可以定制。而MiniGUI是一个非常适合实时嵌入式产品的高效、可靠、可定制、小巧灵活的图形用户界面支持系统,被广泛的应用于高端科技产品中。利用MiniGUI开发出良好的人机交互界面已成为嵌入式开发中的迫切需求。本文实现了在ARM-Linux环境下进行基于QVFB的MiniGUI的模拟开发、调试,通过在PC机上的仿真模拟,将
[单片机]
基于ARM-<font color='red'>Linux</font>的<font color='red'>MiniGUI</font>的仿真与移植
OK6410A 开发板 (八) 17 linux-5.11 OK6410A start_kernel 功能角度 概览
根据功能对 linux启动过程的分类(注意:arm1176jzfs不支持多核) 对于 arm1176jzfs 的 s3c6410 来说,只有cpu0 1st 和 2nd 都正确 3rd 中跑的 是 所有的进程,包括 0 1 2 ... 第一阶段第二阶段 已经将内核初始化好了,但是还没有开始 大规模的使用内核 第三阶段主要是 进程0 进程1 进程2,负责使用内核的服务
[单片机]
OK6410A 开发板 (八) 17 <font color='red'>linux</font>-5.11 OK6410A start_kernel 功能角度 概览
口袋里的Linux:在您的U盘上运行SLAX
  您可以从光盘上运行某些版本的Linux,而现在您甚至可以从U盘上运行。Vincent Danen将告诉在这个小巧的设备上运行SLAX版Linux的一些基础知识。   随着所谓的“Live CD”的出现已经有一段时间了,它能够让您把Linux带在口袋里到处跑,因为一些版本的Linux可以完全从光盘上运行。像Knoppix这种能够在光盘上运行的Linux对于系统恢复真是太重要了,对于高手来说这真是太酷了。   随着U盘这种廉价存储设备的普及,在U盘上运行Linux使得进行系统恢复安装变得更加容易。虽然它要比光盘贵,但是U盘的体积可要小得多。   有一些版本的Linux可以在光盘或者U盘上运行;一个是SLAX,您可以从 ht
[家用电子]
基于AT91RM9200的I/O驱动程序(linux
#include linux/config.h #include linux/module.h #include linux/sched.h #include linux/slab.h #include linux/ioport.h #include linux/errno.h #include linux/kernel.h #include linux/fs.h #include linux/string.h #include linux/poll.h #include linux/init.h #include linux/devfs_fs_kernel.h #include linux/miscdevi
[单片机]
ARM Linux中断机制之中断的初始化
一,认识几个重要结构体: 1.中断描述符 对于每一条中断线都由一个irq_desc结构来描述。 //在include/linux/irq.h中 struct irq_desc { unsigned int irq;//中断号 struct timer_rand_state *timer_rand_state; unsigned int *kstat_irqs; #ifdef CONFIG_INTR_REMAP struct irq_2_iommu *irq_2_iommu; #endif /* 在kernel/irq/chip.c中实现了5个函数:handle_simple_irq(),handle_
[单片机]
ARM <font color='red'>Linux</font>中断机制之中断的初始化
Xen Project发布Xen Project Hypervisor 4.9
Linux基金会旗下的Xen Project今天发布Xen Project Hypervisor 4.9版本。这一最新版本的高级功能适用于嵌入式、汽车和原生云计算应用。它还改进了启动配置,方便在不同硬件平台间进行迁移,x86新指令可加速机器学习计算,并增强了与ARM®架构相关的现有功能及设备模型操作hypercall等功能。 Xen Project在嵌入式和汽车领域的应用保持持续增长,这是因为越来越多的公司希望把虚拟化扩展到嵌入式设备中,同时继续发挥hypervisor的优势,这包括通过整合降低成本;把硬件抽象出来,使应用程序与硬件分离;硬件隔离的好处是能够更好地保护软件免受漏洞的影响,并提高软件容错能力。此外,更多的贡献在于开始
[嵌入式]
linux环境下如何进行stm32的开发建议
工具链一般用gcc-arm-none-eabi,可以用包管理装,也可以到arm官网下,也可以自己编译,毕竟gnu源有这个配置。 纯用命令行的话,cubemx可以生成makefile工程,改下编译器路径就能make,会生成bin文件。 用IDE的话,可以用eclipse,参考wiced sdk。 可以用vscode,体验要优于sublime。网上搜搜怎么配环境,主要就是设置工具链的目录。 烧录程序,如果烧的是bin的话需要一个烧录程序。用jlink的话可以用segger官网下的jlinkexe工具。用stlink的话可以用github上的stutils什么的。用cmsis-dap或者ft2232的话就只能配openo
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved