基于嵌入式Linux的北斗二代接收机应用开发
2014-12-13路振民,邵琼玲,宋方
路振民,邵琼玲,宋方
摘 要: 基于嵌入式Linux,使用UM220和TE6410开发板,完成了北斗二代接收机的应用开发。通过嵌入式Linux和Qt/E的移植,实现了Qt的GUI界面显示,利用Linux多线程的特点,完整实现了NMEA 数据的接收、处理、显示以及可视星的星座图显示,对北斗二代系统终端的开发有一定的借鉴意义。
关键词: 北斗二代系统; 嵌入式Linux; 应用开发; 数据接收
中图分类号: TN927+.2?34; TP311.1; V19 文献标识码: A 文章编号: 1004?373X(2014)23?0155?04
Application development of BD2 receiver based on embedded Linux
LU Zhen?min1, SHAO Qiong?ling2, SONG Fang3
(1. Company of Postgraduate Management, the Academy of Equipment, Beijing 101416, China;
2. Department of Space Equipment, the Academy of Equipment, Beijing 101416, China; 3. Detachment 54, Unit 73678 of PLA, Xiamen 361009, China)
Abstract: In this paper, the application development of BD?2 receiver base on embedded Linux was performed on UM220 module and TE6410 board. By transplantation of the embedded Linux and Qt/E, the Qt GUI interface display was realized. NMEA data receiving, processing, display and constellation show of the visible satellite were completely implemented by means of the Linux multithreaded characteristics. It has certain reference significance for the development of BD?2 terminal.
Keywords: BD2 receiver; embedded Linux; application development; data acceptance
0 引 言
随着北斗二代系统在国内及周边区域无源定位的实现[1],北斗二代终端的设计及应用也逐渐成为研究热点。
Linux可在GNU公共许可权限下免费获得,并且符合POSIX标准[2]。采用开源的嵌入式Linux作为嵌入式操作系统,可以有效避免关于版权的纠纷,节省了大量的开发费用[3]。同时,嵌入式Linux还可以根据应用需求进行内核裁剪,可应用于多种硬件平台。
因此,本文提出基于开源的嵌入式Linux系统,实现了北斗无源定位数据的接收、提取,同时采用QT/E进行软件界面设计,实现数据的显示,满足了北斗接收机应用的基本需求。通过该方法,有效地降低了北斗接收机的开发成本,同时对北斗接收机的开发具备一定的借鉴意义。
1 硬件平台介绍
本文所采用的硬件开发平台为UM220导航模块和TE6410开发板。
其中UM220为BD/GPS双系统导航模块,可同时接收BD2 B1、GPS L1两个频点的信号,进行接收、解调、解算,生成定位相关信息,并从串口输出NMEA(National Marine Electronics Association)数据。
TE6410开发板采用基于ARM11的S3C6410作为主控制器,通过串口的控制完成数据的读取,在运行嵌入式Linux的基础上,实现了数据的提取和显示。
本文采用的硬件平台工作原理图如图1所示。
<;E:\2014年23期\2014年23期\Image\42t1.tif>;
图1 硬件平台组成框图
2 开发环境搭建
2.1 嵌入式Linux介绍
嵌入式Linux是运行在嵌入式设备上的Linux,是根据硬件设备进行定制的一种小型操作系统[2],由内核(kernel)及部分系统模块组成。
嵌入式Linux主要有跨平台、可裁剪、移植性好、开源、支持多任务多进程等优点,是用途最广,装备最多的嵌入式操作系统[4]。
2.2 嵌入式Linux移植
本文所述的软件开发环境是指运行在虚拟机上的Ubuntu 12,并已安装好gcc, g++,arc?linux?gcc, arc?linux?g++编译器和应用程序QT4.8。
Linux目前最新的版本是3.15,考虑到稳定及兼容性,本文采用Linux版本为2.6。下载并解压内核源码后,在Ubuntu终端中进入源码目录,输入命令“make menuconfig ARCH=arm”,之后系统进入内核配置界面endprint
进入System Type选项的子菜单ARM system type,选择Samsung S3C64XX。保存退出,这里选择S3C64XX系列的默认内核配置。
输入命令“make zImage”,进行内核编译。编译完成后,在目录“arch/arm/boot”中可找到编译好的内核映像zImage。
Linux系统启动的一般过程包括引导内核、启动内核和启动初始化程序等[5],因此运行一个完整的嵌入式操作系统除内核外,还需要bootloader和文件系统的支持。
这里选择的bootloader和文件系统分别是Uboot1.6和Yaffs2。因bootloader和文件系统的编译不是本文重点,这里不再赘述
2.3 Qt/E简介
Qt作为跨平台的图形界面开发平台,可以直接建立在简单的帧缓冲驱动上,并且有良好的可配置,可裁剪特性,因此也经常用在嵌入式系统上[6]。
Qt/Embedded Linux(即Qt/E或Qtopia)是为嵌入式Linux优化过的Qt版本。Qt/E提供了与Qt的桌面系统相同的API(应用程序接口),因此任何标准的Qt应用程序都可以被重新编译到Qt/E上进行运行[4]。
Qt/E图形引擎的基础是图形缓冲帧,它是一种采用mmap系统调用的驱动程序接口,在这个接口的支持下,系统屏幕才能显示内容[7]。
2.4 Qt/E移植
在运行Qt/E的API进行应用程序编写和调试之前,还有两项很重要的工作要做:
首先,必须编译和安装Qt/E的开发包,以Qt4.4.3为例,下载源码并解压后,开启终端并进入源码目录下的configure子目录,依次运行“make”和“make install”命令。
编译完成后,子目录“builddir/image”下的所有文件就是Qt4.4.3的运行文件,本质上这是Qt/E的一个文件系统。将其复制到开发板文件系统的opt目录下。
同时,也生成了移植Qt程序所需要的交叉编译工具,即 “builddir/sdk/qtopiacore/target/bin”下的qmake程序。
在应用程序编写完成后,使用qmake工具创建Makefile,然后输入指令“gedit Makefile”,在CFLAGS和CXXFLAGS的等号后面添加“?fno?rtti”参数,该参数表示禁用运行时类型信息,可降低程序的资源占用,有效提高程序运行效率。
修改完Makefile后,输出命令“make”即可完成程序编译。
3 应用程序开发
作为北斗二代接收机的一款应用,首先必须实现NMEA数据的获取,然后对数据进行处理,提取有用的数据,并使用Qt的API函数,实现定位数据的显示、卫星星座图显示以及地图上定位点的显示。
3.1 串口设备的控制
Qt本身提供了用于串口控制的头文件“termios.h”,该头文件声明了一个结构体用于串口的控制,同时宏定义了一些控制变量。
由于UM220默认串口输出波特率为9 600 b/s,数据位8位,停止位1,无校验位[8],硬件连接串口使用串口1,因此可在宏定义中进行如下定义:
#define BAURATE B9600
#define RS_DEVICE "/dev/ttySAC1"
使用头文件中的结构体必须先定义:
Struct termios Tioset;
在各项定义准备好之后,就可以打开串口了,下面语句以读写的方式打开串口1,打开成功返回0,失败返回-1:
fd=open(RS_DEVICE,0_RDWR);
串口成功打开后,则按照UM220的默认值进行设置,如下:
Tioset.c_cflag=BAURATE|CS8|CL0CSAL|CREAD;
Tioset.c_iflag|=IGNPAR; //忽略奇偶
以上设置完成后,还可以用同样方式设置串口读写字符的速度和单次读写字符数量等。
关闭串口使用close(fd)函数。
3.2 NMEA数据的接收
串口打开完毕后,就可以准备读写数据了,写入数据比较简单,使用write()函数写入到缓存即可,下面语句就从串口输出了字符串“RS 232 Data”。
write(fd,″RS 232 Data″,10);
读数据函数为read(),可从缓存读出指定长度的字符,返回值为实际读取长度,如下:
res=read(fd,buf,1024);
考虑到读取定位数据是一个连续的过程,因此可将串口的控制及数据的接收以多线程的方式运行。
开启线程,需引用头文件QThread,该头文件包含线程类QThread的声明,以单继承的方式生成一个新类,这样,新类就继承了QThread的所有方法。
线程的开启可使用start()函数,可在线程的实际执行函数内包含串口控制及数据读写,这样就可通过控制线程的各项参数来间接完成以上功能。
图2显示了读取到的部分数据。
<;E:\2014年23期\2014年23期\Image\42t2.tif>;
图2 串口数据读取
3.3 定位的数据的显示
当数据读取成功后,需要根据NMEA格式进行处理。NMEA格式采用Unicore协议,该协议中,输入的语句统称为消息,每条消息均为全ASCII字符组成的字符串。所有消息都以“$”开始,后紧跟消息名,之后有一定数量的参数或数据,消息名与数据之间均以逗号进行分隔[6]。endprint
NEMA格式对每一种数据类型都有严格的定义,其中位置数据格式如下:
$BDGLL,Lat,N,Lon,E,time,valid,Mode*cs
例子:$BDGLL,4002.2178,N,11618.1057,E,123400.00,A,A*5B
各部分参数含义[9]见表1。
表1 定位数据格式部分参数含义
[参数名\&;描述\&;参数名\&;描述\&;BDGLL\&;BD2系统单独
定位的地理位置\&;time\&;UTC 时间,格式为hhmmss.sss\&;Lat\&;纬度\&;Valid\&;位置有效标识\&;N\&;北纬或南纬指示\&;Mode\&;定位模式\&;Lon\&;经度\&;A*cs\&;校验和\&;E\&;东经或西经指示\&;\&;\&;]
定位精度因子信息的数据格式如下:
$BDGSA,Smode,Fs,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,HDOP,VDOP*cs
例子:$BDGSA,A,167,124…5.572,2.788,4.824*36
各部分参数定义[6]见表2。
表2 GSA数据格式部分参数定义
[参数名\&;描述\&;参数名\&;描述\&;BDGSA\&;GNSS精度因子与有效卫星信息\&;PDOP\&;位置精度因子\&;Smode\&;定位模式指定状态\&;HDOP\&;水平精度因子\&;Sv1~Sv12\&;参与定位的卫星号\&;VDOP\&;垂向精度因子\&;]
根据以上格式,对接收到的数据进行字符串处理,提取有用信息,即可进行显示,如图3所示。
<;E:\2014年23期\2014年23期\Image\42t3.tif>;
图3 定位数据显示
3.4 星座图的显示
Qt的视图体系包括一个由QGraphicsScenec充当的场景及由一些QGaraphicItem的子类充当场景中的项。QGraphicView是一个控件,可显示场景。GraphicView系统主要由QGraphicScene,QGraphicItem,QGraphicView组成[10]。他们之间的关系是场景是基础,项用来管理视图,并通过添加到场景中来完成显示。
对NEMA中的GSV语句进行字符串分割,即可得到可视星信息,主要包括卫星的编号、仰角和方位角。
星座图的显示,首先要进行坐标转换,即将卫星的仰角和方位角,通过简单的几何公式转换为星座图的坐标。
然后,定义类MySat,同样以继承的方式使用头文件“QGraphicsItem.h”中定义的类及方法,结合QPainter函数,可以很方便地将可视星以图形化的方式表现出来。
Class MySat:public QGraphicsItem
之后,分别使用Qpainter类的drawPixmap()函数和drawText()函数在进行画图。
Pos_ball=axis_transform(FYJ,BPJ);
Painter.drawPixmap(pos_ball,pix);
最后在控件QGraphicView里显示场景,并使用场景的addItem()方法来实现MySat类的画图功能。代码如下:
MySat *mysat=new MySat;
Scene?>;addItem(mysat);
Ui?>;graphicview.>;setScene(scene);
这样,就实现了星座图在控件里的显示,显示效果如图4所示。
<;E:\2014年23期\2014年23期\Image\42t4.tif>;
图4 卫星星座图显示
4 结 语
本文实现了从S3C6410开发板的串口读取NEMA数据,并进一步完成了定位数据提取和卫星星座图显示。经测试,程序运行稳定,定位精度优于10 m,验证了北斗二代接收机在Linux终端上开发的可行性,对北斗终端应用的发展有一定的借鉴意义。
参考文献
[1] 中国卫星导航系统管理办公室.北斗卫星导航系统发展报告(2.1版)[M].北京:中国卫星导航系统管理办公室,2012.
[2] 吴林城,胡庆新,李冬.基于Qt/Embedded的图形用户界面开发[J].仪器仪表学报,2009,30(6):371?374.
[3] 邵海东,周鹏,胡南军,等.基于Linux的嵌入式系统设计与实现[J].计算机工程,2002(6):262?264.
[4] 何永琪.嵌入式Linux系统实用开发[M].北京:电子工业出版社,2010.
[5] 杨水清,张剑,施云飞.精通ARM嵌入式Linux系统开发[M].北京:电子工业出版社,2012.
[6] BLANCHETTE J, SUMMERFIELD M.C++ GUI Qt4编程[M]. 2版.闫锋欣,曾泉人,张志强,译.北京:电子工业出版社,2012.
[7] 吴子平.基于Qt/E的嵌入式GUI技术研究与实现[D].荆州:长江大学,2012.
[8] 和芯星通有限公司.UM220用户手册[EB/OL].[2013?06?03].http://www.unicorecomm.com/down?64.aspx.
[9] 和芯星通有限公司.UM220北斗/GPS双系统导航授时模块数据接口协议[EB/OL].[2013?11?06].http://www.unicorecomm.com/down?64.aspx.
[10] 廖熹,易克非.基于嵌入式Linux系统下的Qt测试软件开发[J].兵工自动化,2013(8):98?100.endprint
NEMA格式对每一种数据类型都有严格的定义,其中位置数据格式如下:
$BDGLL,Lat,N,Lon,E,time,valid,Mode*cs
例子:$BDGLL,4002.2178,N,11618.1057,E,123400.00,A,A*5B
各部分参数含义[9]见表1。
表1 定位数据格式部分参数含义
[参数名\&;描述\&;参数名\&;描述\&;BDGLL\&;BD2系统单独
定位的地理位置\&;time\&;UTC 时间,格式为hhmmss.sss\&;Lat\&;纬度\&;Valid\&;位置有效标识\&;N\&;北纬或南纬指示\&;Mode\&;定位模式\&;Lon\&;经度\&;A*cs\&;校验和\&;E\&;东经或西经指示\&;\&;\&;]
定位精度因子信息的数据格式如下:
$BDGSA,Smode,Fs,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,HDOP,VDOP*cs
例子:$BDGSA,A,167,124…5.572,2.788,4.824*36
各部分参数定义[6]见表2。
表2 GSA数据格式部分参数定义
[参数名\&;描述\&;参数名\&;描述\&;BDGSA\&;GNSS精度因子与有效卫星信息\&;PDOP\&;位置精度因子\&;Smode\&;定位模式指定状态\&;HDOP\&;水平精度因子\&;Sv1~Sv12\&;参与定位的卫星号\&;VDOP\&;垂向精度因子\&;]
根据以上格式,对接收到的数据进行字符串处理,提取有用信息,即可进行显示,如图3所示。
<;E:\2014年23期\2014年23期\Image\42t3.tif>;
图3 定位数据显示
3.4 星座图的显示
Qt的视图体系包括一个由QGraphicsScenec充当的场景及由一些QGaraphicItem的子类充当场景中的项。QGraphicView是一个控件,可显示场景。GraphicView系统主要由QGraphicScene,QGraphicItem,QGraphicView组成[10]。他们之间的关系是场景是基础,项用来管理视图,并通过添加到场景中来完成显示。
对NEMA中的GSV语句进行字符串分割,即可得到可视星信息,主要包括卫星的编号、仰角和方位角。
星座图的显示,首先要进行坐标转换,即将卫星的仰角和方位角,通过简单的几何公式转换为星座图的坐标。
然后,定义类MySat,同样以继承的方式使用头文件“QGraphicsItem.h”中定义的类及方法,结合QPainter函数,可以很方便地将可视星以图形化的方式表现出来。
Class MySat:public QGraphicsItem
之后,分别使用Qpainter类的drawPixmap()函数和drawText()函数在进行画图。
Pos_ball=axis_transform(FYJ,BPJ);
Painter.drawPixmap(pos_ball,pix);
最后在控件QGraphicView里显示场景,并使用场景的addItem()方法来实现MySat类的画图功能。代码如下:
MySat *mysat=new MySat;
Scene?>;addItem(mysat);
Ui?>;graphicview.>;setScene(scene);
这样,就实现了星座图在控件里的显示,显示效果如图4所示。
<;E:\2014年23期\2014年23期\Image\42t4.tif>;
图4 卫星星座图显示
4 结 语
本文实现了从S3C6410开发板的串口读取NEMA数据,并进一步完成了定位数据提取和卫星星座图显示。经测试,程序运行稳定,定位精度优于10 m,验证了北斗二代接收机在Linux终端上开发的可行性,对北斗终端应用的发展有一定的借鉴意义。
参考文献
[1] 中国卫星导航系统管理办公室.北斗卫星导航系统发展报告(2.1版)[M].北京:中国卫星导航系统管理办公室,2012.
[2] 吴林城,胡庆新,李冬.基于Qt/Embedded的图形用户界面开发[J].仪器仪表学报,2009,30(6):371?374.
[3] 邵海东,周鹏,胡南军,等.基于Linux的嵌入式系统设计与实现[J].计算机工程,2002(6):262?264.
[4] 何永琪.嵌入式Linux系统实用开发[M].北京:电子工业出版社,2010.
[5] 杨水清,张剑,施云飞.精通ARM嵌入式Linux系统开发[M].北京:电子工业出版社,2012.
[6] BLANCHETTE J, SUMMERFIELD M.C++ GUI Qt4编程[M]. 2版.闫锋欣,曾泉人,张志强,译.北京:电子工业出版社,2012.
[7] 吴子平.基于Qt/E的嵌入式GUI技术研究与实现[D].荆州:长江大学,2012.
[8] 和芯星通有限公司.UM220用户手册[EB/OL].[2013?06?03].http://www.unicorecomm.com/down?64.aspx.
[9] 和芯星通有限公司.UM220北斗/GPS双系统导航授时模块数据接口协议[EB/OL].[2013?11?06].http://www.unicorecomm.com/down?64.aspx.
[10] 廖熹,易克非.基于嵌入式Linux系统下的Qt测试软件开发[J].兵工自动化,2013(8):98?100.endprint
NEMA格式对每一种数据类型都有严格的定义,其中位置数据格式如下:
$BDGLL,Lat,N,Lon,E,time,valid,Mode*cs
例子:$BDGLL,4002.2178,N,11618.1057,E,123400.00,A,A*5B
各部分参数含义[9]见表1。
表1 定位数据格式部分参数含义
[参数名\&;描述\&;参数名\&;描述\&;BDGLL\&;BD2系统单独
定位的地理位置\&;time\&;UTC 时间,格式为hhmmss.sss\&;Lat\&;纬度\&;Valid\&;位置有效标识\&;N\&;北纬或南纬指示\&;Mode\&;定位模式\&;Lon\&;经度\&;A*cs\&;校验和\&;E\&;东经或西经指示\&;\&;\&;]
定位精度因子信息的数据格式如下:
$BDGSA,Smode,Fs,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,HDOP,VDOP*cs
例子:$BDGSA,A,167,124…5.572,2.788,4.824*36
各部分参数定义[6]见表2。
表2 GSA数据格式部分参数定义
[参数名\&;描述\&;参数名\&;描述\&;BDGSA\&;GNSS精度因子与有效卫星信息\&;PDOP\&;位置精度因子\&;Smode\&;定位模式指定状态\&;HDOP\&;水平精度因子\&;Sv1~Sv12\&;参与定位的卫星号\&;VDOP\&;垂向精度因子\&;]
根据以上格式,对接收到的数据进行字符串处理,提取有用信息,即可进行显示,如图3所示。
<;E:\2014年23期\2014年23期\Image\42t3.tif>;
图3 定位数据显示
3.4 星座图的显示
Qt的视图体系包括一个由QGraphicsScenec充当的场景及由一些QGaraphicItem的子类充当场景中的项。QGraphicView是一个控件,可显示场景。GraphicView系统主要由QGraphicScene,QGraphicItem,QGraphicView组成[10]。他们之间的关系是场景是基础,项用来管理视图,并通过添加到场景中来完成显示。
对NEMA中的GSV语句进行字符串分割,即可得到可视星信息,主要包括卫星的编号、仰角和方位角。
星座图的显示,首先要进行坐标转换,即将卫星的仰角和方位角,通过简单的几何公式转换为星座图的坐标。
然后,定义类MySat,同样以继承的方式使用头文件“QGraphicsItem.h”中定义的类及方法,结合QPainter函数,可以很方便地将可视星以图形化的方式表现出来。
Class MySat:public QGraphicsItem
之后,分别使用Qpainter类的drawPixmap()函数和drawText()函数在进行画图。
Pos_ball=axis_transform(FYJ,BPJ);
Painter.drawPixmap(pos_ball,pix);
最后在控件QGraphicView里显示场景,并使用场景的addItem()方法来实现MySat类的画图功能。代码如下:
MySat *mysat=new MySat;
Scene?>;addItem(mysat);
Ui?>;graphicview.>;setScene(scene);
这样,就实现了星座图在控件里的显示,显示效果如图4所示。
<;E:\2014年23期\2014年23期\Image\42t4.tif>;
图4 卫星星座图显示
4 结 语
本文实现了从S3C6410开发板的串口读取NEMA数据,并进一步完成了定位数据提取和卫星星座图显示。经测试,程序运行稳定,定位精度优于10 m,验证了北斗二代接收机在Linux终端上开发的可行性,对北斗终端应用的发展有一定的借鉴意义。
参考文献
[1] 中国卫星导航系统管理办公室.北斗卫星导航系统发展报告(2.1版)[M].北京:中国卫星导航系统管理办公室,2012.
[2] 吴林城,胡庆新,李冬.基于Qt/Embedded的图形用户界面开发[J].仪器仪表学报,2009,30(6):371?374.
[3] 邵海东,周鹏,胡南军,等.基于Linux的嵌入式系统设计与实现[J].计算机工程,2002(6):262?264.
[4] 何永琪.嵌入式Linux系统实用开发[M].北京:电子工业出版社,2010.
[5] 杨水清,张剑,施云飞.精通ARM嵌入式Linux系统开发[M].北京:电子工业出版社,2012.
[6] BLANCHETTE J, SUMMERFIELD M.C++ GUI Qt4编程[M]. 2版.闫锋欣,曾泉人,张志强,译.北京:电子工业出版社,2012.
[7] 吴子平.基于Qt/E的嵌入式GUI技术研究与实现[D].荆州:长江大学,2012.
[8] 和芯星通有限公司.UM220用户手册[EB/OL].[2013?06?03].http://www.unicorecomm.com/down?64.aspx.
[9] 和芯星通有限公司.UM220北斗/GPS双系统导航授时模块数据接口协议[EB/OL].[2013?11?06].http://www.unicorecomm.com/down?64.aspx.
[10] 廖熹,易克非.基于嵌入式Linux系统下的Qt测试软件开发[J].兵工自动化,2013(8):98?100.endprint