ARM-Linux平台下GPS信号的采集与处理研究

发布时间:2009-9-2 09:00    发布者:ARM
关键词: arm , GPS , linux , 采集 , 信号
定位和导航是很多便携移动设备以及汽车电子设备的重要功能之一,所以GPS在上述设备中得到了广泛的应用。基于ARM-Linux的嵌人式平台以其开放性、安全性、健壮性和稳定性越来越成为各种便携设备和车载导航设备的主要开发平台。如何实现GPS模块和嵌人式 ARM-Linux平台之间的通信成了实现系统定位导航的基础。

  本文主要研究GPS模块与ARM-Linux平台之间采用异步串行传送方式进行数据传送的问题,利用多线程编程技术实现GPS信号采集与处理,并介绍了一种WGS坐标向地方坐标的转换方法。与GPS通信可选的协议有很多种,目前普遍采用的是NMEA-0183通信协议。

1 NMEA-0183通信协议

  NMEA-0183协议 [1]是为了在不同的GPS导航设备中建立统一的海事无线电技术委员会(BTCM)标准,由美国国家海洋电子协会NMEA(National Marine Electronics Association)制定的通信协议,其中规定了海用和陆用GPS接收设备输出的定位位置数据、时间、卫星状态、接收机状态等信息。除NMEA- 0183协议之外,还有差分用的RTCMSC-104格式,各个厂商互不兼容的二进制格式等,但以NMEA-0183使用最广泛。为实现ARM- LINUX平台与GPS之间的通信,应清楚协议规定的GPS输出的数据格式和报文。NMEA-0183规定的格式如下:

    波特率:4 800 b/s
    数据位:8 bit
    奇偶校验:无
    开始位:1 bit
    停止位:1 bit
    报文格式:报文的语句串(十进制ASCII码)格式全部信息如图1。





  图1中具体内容:$为串头,表示串开始;GP为交谈识别符。XXX为语句名,NMEA规定的常用语句有以下6种:GGA,卫星定位信息;GLL,地理位置-经度和纬度;GSA,GNSS DOP偏差信息,说明卫星定位的信号的优劣情况;GSV,GNSS天空范围内的卫星;RMC,最基本的GNSS信息,指能够达到定位目的的基本信息等语句。ddd为数据字段,字母或数字,“,”为域分隔符;*表示串尾;hh表示$与*之间所有字符代码的校验和;为回车控制符;为换行控制符。

    在实际的GPS应用中,并不会用到NMEA的全部信息,而是根据具体的需要,从中选取有用的信息,忽略其余的信息内容。下面以GPRMC语句为例来介绍。该语句包含时间、日期、方位、速度和磁偏角等信息,基本上可以满足一般的导航需求。GPRMC语句的结构为:$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,*hh。

    数据区说明如下:

    (1)UTC时间,hhmmss.sss(时分秒.毫秒)格式;
    (2)定位状态,A=有效定位,V=无效定位;
    (3)纬度ddmm.mmmm (度分)格式(前面的0也将被传输);
    (4)纬度半球N(北半球)或S(南半球);
    (5)经度dddmm.mmmm(度分)格式(前面的0也将被传输);
    (6)经度半球E(东经)或W(西经);
    (7)地面速率(000.0~999.9节,前面的0也将被传输);
    (8)地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输);
    (9)UTC日期,ddmmyy(日月年)格式;
    (10)磁偏角(000.0~180.0度,前面的0也将被传输);
    (11)磁偏角方向,E(东)或W(西)。

2 目标平台

    本文中使用的是以SAMSUNG公司的ARM9系列中的16/32位RISC处理器S3C2410A芯片为核心的目标平台。S3C2410A包含一个16 /32位的RISC(ARM920T)CPU内核、独立的16 KB的指令和16 KB数据缓存(cache)、用于虚拟内存管理的MMU单元、LCD控制器(STN&TFT)、非线性(NAND)Flash、系统管理器(包括片选逻辑控制和SDRAM控制器)及3个通道的异步串口(UART)。目标板资源包括S3C2410的微处理器,主频200 MHz;16 MB的Flash;64 MB的SDRAM;RS-232C UART接口;LCD液晶显示屏。

    在目标板上选配的GPS模块是HIMARK公司的GPS模块,此模块是符合民用标准的GPS接收器,信号接收性能好,功耗较小,整体工作比较稳定。整体硬件设计框图如图2所示。




3 交叉编译环境的建立

    基于嵌入式Linux操作系统的应用开发模式通常都是宿主机+目标机[2]。目标机用于运行操作系统和系统应用软件,而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主机(资源丰富处理能力强的PC)来完成,称之为交叉编译。双方之间一般通过串口、并口或以太网接口建立连接关系。

    (1)配置minicom:在宿主机Redhat Linux 9.0的X windows界面下新建终端,在终端命令提示符后输入minicom-s,回车,然后按照提示设置波特率115200,8位数据,1位停止位,无流控,保存退出。

    (2)TFTP服务的配置:在终端中运行setup->system service->tftp增加TFTP服务,并去掉ipchains和iptables 两项,然后在Firewall configuration,选中no firewall,保存退出,执行service xinetd restart启动TFTP服务。

    (3)NFS服务器的配置:在终端中运行setup->system service->NFS,增加NFS服务,然后编辑文件exports,添加与目标机共享的目录,并设置目标机对目录的访问权限,重新启动NFS服务。

    (4)Linux内核移植:通过并口,宿主机向目标开发板的Flash烧写引导程序ppcboot,烧写完毕后通过TFTP服务把经过裁剪的Linux内核镜像文件以及根文件系统下载到目标板的RAM中,然后由ppcboot完成内核及根文件系统从内存到Flash的烧写。最后需要在宿主机安装主编译器 Arm-linux-gcc,用来交叉编译应用程序。

4 GPS信号的采集和处理

    为实现ARM-Linux平台下GPS信号的采集与处理,涉及到Linux下串口编程技术,首先给出Linux串口通信的原理,然后利用多线程编程技术来完成GPS数据采集与NMEA数据格式的解析,因解析后得到的GPS定位坐标属于WGS84坐标,需转换到相应的54、80坐标或地方坐标供用户标图定位所用,因此介绍了一种坐标转换方法。

4.1 GPS数据采集与处理

    大多数GPS接收机与各种处理器平台进行数据交换时,都采用异步串行传送方式,提供一个符合RS-232C电气标准的数据接口。

    在Linux操作系统中,所有设备以设备文件的形式存储在目录/dev/下,串口设备文件为/dev/ttyS*,在Linux中,若要设置串口的参数,如改变串口的波特率、字符大小等,可通过POSIX标准终端接口[3],该接口被称为termios,在系统头文件中定义。它包括一个数据结构和一系列操纵这些数据结构的函数组成。有关串口的所有参数配置都保存在接口termios的结构struct termios中,该结构定义如下:

    struct termios
      {
      tcflag_t c_iflag; /*输人模式标志*/
      tcflag_t c_oflag; /*输出模式标志*/
      tcflag_t c_cflag; /*控制模式标志*/
      tcflag_t c_lflag; /*本地模式标志*/
      cc_t     c_cc[NCCS];/*特殊控制字符*/
    }

    其中的c_iflag成员是用来控制输入处理选项的,它影响到终端驱动程序将输入发送给程序前是否对其进行处理,及怎样对其进行处理。c_oflag成员是用来控制输出数据的处理,并决定在发送输出数据到显示屏和其他输出设备之前,终端驱动程序是否以及如何来处理它们。c_cflag用于存放各种决定终端设备硬件特性的控制标志,如串口的波特率、奇偶校验、停止位、数据位等。存放在c_lflag 中的本地模式标志用来操纵串口如何处理输入字符,比如是否将输入字符显示到显示屏上,一般可通过此成员来设置串口为正规模式或是非正规模式。c_cc数组成员用来定义支持的特殊控制字符以及一些timeout参数。

    除了上面的这个包含串口参数配置的数据结构之外,termios中还包含许多控制串口特性的函数。其中重要的几个函数如:tegetattr( )、tesetattr( )、cfsetispeed( )、cfsetospeed( )、tcflush( )。tegetattr( )用来初始化一个termios数据结构,之后可使用其他的函数来操纵由tegetattr( )返回的数据结构。完成这些操作后,使用tesetattr( )来更新串口的设置。cfsetispeed( )用来设置串口的输入速度。cfsetospeed( )用来设置串口的输出速度。tcflush( )用来清除所有队列在串口的输入与输出。

    在Linux下采用多线程编程技术可大大节省系统的开销,方便各线程之间通信,提高应用程序的响应,改善程序结构,从而可以提高嵌入式系统的性能。本文就是利用Linux下多线程编程来实现GPS数据的采集和处理,在GPS模块的初始化GPS_Initial函数中创建接收线程 GPS_Thread_Port_Svc,在接收线程中调用GPS信息语句的解析函数 GPS_Parse_Data(buf_GPS,&gps_data),进一步调用语句字符串解析函数 GPS_Parse_Data_Line(char*str_gprs_data_line,GPS_DATA_TYPE*GPS_DATA)。在GPS 语句的处理过程中,需对所读取的语句进行鉴别区分,只选取其中要用的信息进行处理而忽略其余的信息,这就要根据NMEA-0183协议中规定的语句格式来进行解析。图3给出了GPS数据处理流程。




    下面是程序实现的关键函数部分代码。

    /*包含必要的头文件*/
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    int GPS_Initial(int n_tty_no)
    {
    int ret_tty=-1;
    int ret_thread=-1;
    ret_tty=OpenComPort(n_tty_no,9600,8,“1”,‘N’);/*打开串口,并设置通信属性,如波特率,数据位,有无奇偶校验,停止位等*/
    ret_thread=pthread_create(&pthr_id,NULL,GPS_
    Thread_Port_Svc,NULL);/*创建接收线程*/
    …
    }
    void*GPS_Thread_Port_Svc(void*pData)
{/*接收线程函数*/
    unsigned char buf_GPS[256];
    int ret_rd_com;
    while(1) {
    bzero(buf_GPS,sizeof(buf_GPS));
    ret_rd_com=ReadComPort((void*)buf_GPS,
    sizeof(buf_GPS));/*读串口,接收数据*/
    GPS_Parse_Data(buf_GPS,&gps_data);
/*调用解析语句函数,*/
         …}
    在GPS_Parse_Data(buf_GPS,&gps_data)函数中每接收一个GPS语句,调用一次字符串解析函数。
    GPS_Parse_Data_Line(char*str_gprs_data_line,GPS_DATA_TYPE*GPS_DATA){
    char*temptr;
    temptr=str_gprs_data_line;
/*字符串赋给临时指针,然后对其解析*/
    if(strncmp(temptr,RMC_DATA_L,strlen(RMC_DATA_L))==0) {/*解析RMC语句串*/
   startchar(temptr,',');
    temptr=temptr+strlen(temptr)+12;
/*$GPRMC,HHMMSS.SSS*/
    GPS_DATA->Time.Flag=temptr[0];
    temptr=temptr+27;
/*A,DDMM.MMMM,N,DDDMM.MMMM,E*/
     …}

    以上只是GPS信息处理的部分代码。经过交叉编译调试下载至目标平台上,运行后可得到本地地理位置信息。实验所得数据为:时间10:28:35;纬度:北纬30°46’;经度:东经103°57’。用户也可以根据需要选择提取GPS的其他语句,只需编写解析相应语句字符串的代码即可。

4.2 GPS坐标的转换

    上述所得的结果属于WGS84坐标,而在工程上实用的大多是国家坐标系,因此GPS数据采集结果的使用就存在与国家坐标系间的坐标转换问题。一般要通过两步转换:首先将上述实测经纬度坐标即WGS84大地坐标(L,B)转换为对应于WGS84椭球的高斯平面坐标(X84,Y84),然后再经过平面坐标转换,将高斯平面坐标(X84,Y84)强制附合到本地高斯平面坐标系统[4]。

    (1)高斯投影换算

    将GPS采集所得出的大地坐标(L,B)转换为高斯平面坐标(X84,Y84)。有关的推导过程较复杂,本文只给出结果:
  



  由上述原理利用EXCEL就可以算出对应的高斯平面坐标。

    (2)平面坐标转换

    平面坐标转换的目的就是将高斯投影换算得出平面坐标(X84,Y84)转换为当地国家坐标系的平面坐标。下面介绍一种平均转轴相似转换法,以转换为北京54坐标系下的平面坐标(X54,Y54)为例,说明该方法实现过程。

    首先,根据公共点分别在WGS84和北京54系中的高斯平面坐标,求出该点在两个坐标系中同一边的方位角之差?驻?琢和长度比例系数?资,然后按下式计算任一点在北京54系中的平面坐标。


  
    将得到的X54,Y54坐标可应用于GIS系统标图,实现导航定位。

    GPS信息的获取是设计导航定位系统的首要环节,本文有针对性的研究了ARM-Linux平台与GPS接收模块之间的串行通信。基于NMEA-0183通信协议,在Linux下通过多线程编程实现了GPS基本定位信息的采集与处理,所得数据满足精度要求,为导航定位系统或GIS系统提供了数据基础。
本文地址:https://www.eechina.com/thread-2712-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
zx3113847 发表于 2011-3-29 17:42:53
学习
工程师甲 发表于 2015-9-10 22:21:54
我正好在做一个待GPS收音机,太给力la
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关在线工具

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表