基于GPS的自主移动机器人导航定位系统的实现
2011-07-13宋玉龙常然然
宋玉龙,常然然
(1.西北工业大学 电子信息学院 陕西 西安 710129;2.西北工业大学 管理学院 陕西 西安 710129)
移动机器人是一种在复杂的环境下工作的,具有自规划、自组织、自适应能力的机器人。在移动机器人的相关技术研究中,导航技术可以说是其核心技术,也是其实现真正的智能化和完全的自主移动的关键技术。移动机器人的导航方式很多,有惯性导航、视觉导航、基于传感器数据导航、卫星导航等[1]。对于室外环境来说,GPS卫星导航是首选,而且为了提高机器人导航定位精度以及应变复杂环境的能力,可以与视觉导航和传感器数据导航相结合,这样机器人就可以独立完成导盲、勘探、自动货运等复杂任务。
这里我们让机器人事先采集行进路径上某些点的位置坐标构建路线,行进过程中实时获取当前坐标和移动方向,并与构建的路线作比较,从而指导机器人运动。
图1 系统结构Fig.1 System structure
1 系统介绍
2 硬件部分
如图1所示,本系统采用以GPS导航为主,以摄像头和超声波传感器为辅的方式来实现机器人的自主移动。不过要想自主移动,只有实时GPS导航数据是不够的,机器人要到达某地还必须知道该目的地的位置,以及可走的路径,这就需要有地图作为参照。可以使用具有经纬度信息的电子地图来作匹配,也可以采用更简单的办法,即事先在行进路径上用GPS接收装置测得几个点的经纬度信息,从而构成简易的行进路线图,这种方法适用于目的地比较固定且数量较少的情况。
本设计以Samsang公司的ARM芯片S3C6410为处理器,嵌入Windows CE 6.0操作系统,外围除了常用的显示(LCD、LED)、接口(串口、USB接口、网络接口、电源接口)资源外,还连接了GPS模块(包括GPS天线)、摄像头和超声波传感器。以这块电路板作为机器人的上位机,综合3个模块获取的数据来指导机器人的运动。下面将主要介绍GPS模块部分。
2.1 GPS模块简介
采用广州鑫图科技有限公司的GPS模块GS-91。这是一款体积小巧、高性能、低功耗的GPS引擎板,它使用SiRF Star III芯片组,可以一次跟踪20颗卫星,跟踪灵敏度高达-159dBm。模块具有两个串口,4 MB的Flash,支持NMEA-0183数据格式输出[2]。
2.2 应用电路
图2是GS-91模块的应用电路原理图。其中,RXA是GS-91用于接收软件指令的主要接收通道,TXA是用于输出导航和测量数据的主要发送通道。
2.3 输出电文格式[3]
GS-91模块导航数据输出采用NMEA-0183标准,它是由 NMEA(National Marine Electronics Association,美国国家海事电子协会)于1983年制定的。NMEA-0183数据采用ASCII标准。数据传输以“语句”的方式进行,每个语句均以“$”开头,然后是两个字母的“识别符”和三个字母的“语句名”组成的ID信息头,接着就是以逗号分割的数据体,语句末尾为校验和,整条语句以回车换行符结束。
图2 GS-91应用电路原理图Fig.2 GS-91 application circuit schematic
NMEA-0183的数据信息有十几种,例如:$GPGGA、$GPGLL、$GPGSA、$GPGSV、$GPRMC 等,我们所关心的定位数据如经纬度、速度、时间等均可以从“$GPRMC”开头的语句中获得。下面是一条GPRMC语句实例,表1对该语句的各字段进行了说明。
$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.130,309.62,120598,23.1,E*10
表1 GPRMC数据格式Tab.1 GPRMC data format
3 软件部分
软件部分以微软的Visual Studio 2008为开发工具,安装完 WinCE6.0的 SDK(Software Development Kit,软件开发工具包)后,创建智能设备MFC工程,即可开始软件编写。这里的SDK可以使用标准的,也可以自己编译生成。
3.1 软件界面
图3所示为本系统获取GPS导航数据并处理的软件界面。打开界面后,选择端口号和波特率,点击“打开串口”按钮,然后点击“开始接收”按钮,左侧“接收区”的编辑框就会不断地显示从GS-91模块输出的NMEA格式导航数据,并且在“经度”、“纬度”编辑框中实时显示相应信息。
制作路线图的方法为,将机器人带到目标路径上的几个位置,点击“采点”按钮,即可把当前的经度纬度信息保存,并显示在“采点区”的列表框中。路线图制作完成后,机器人在行进过程中即可根据实时获取的当前位置信息和运动方向来判断下一步的运动策略。
3.2 读串口
获取GPS导航数据实际上就是通过串口读取GS-91输出的NMEA格式数据的过程,下面将介绍WinCE下读取串口程序的开发过程。
3.2.1 打开串口
点击“打开串口”按钮,进入此按钮的消息响应函数,函数中执行打开串口和串口参数配置等操作。
图3 软件界面Fig.3 Software interface
首先调用CreateFile()函数打开指定的端口。
接着对串口进行参数配置,如波特率、数据位、停止位、奇偶校验等。参数设置过程为:首先调用GetCommState()获取串口的当前配置,得到结构体DCB(Device Control Block,设备控制块)的指针,通过它给DCB结构体赋值,然后传给SetCommState()函数对串口进行配置。
最后设置串口的超时参数,设置方法与上述参数设置类似,先通过GetCommTimeouts()得到一个结构体指针,赋值后传给SetCommTimeouts()进行设置。
3.2.2 开始接收
点击“开始接收”按钮,进入此按钮的消息响应函数,函数中调用CreateThread()开辟了一个线程,用于接收串口数据。由于接收过程需要调用WaitCommEven()函数来不停地等待数据到来事件,会致使程序无法响应其他操作,因此用开辟线程的办法来防止信息拥堵。
3.2.3 接收线程
图4所示为接收串口数据的线程中执行的操作流程。程序实现了串口数据的接收,并把接收到的数据传递给Dlg类,用于后期进行定位信息提取及显示等操作。
3.2.4 消息响应函数
获得串口接收线程中得到的数据,进行格式转换后则开始提取定位数据等有用信息,并将提取结果显示到对话框界面上。
3.3 定位数据的提取
定位数据的提取过程专注于“$GPRMC”语句,表1中对该语句结构作了详细说明,我们可以从中得到当前的经纬度信息。在3.2.4介绍的消息响应函数中,得到NMEA导航数据后,按照图5所示的流程即可完成数据提取。
图5 接收数据处理流程图Fig.5 Flow chart of processing the received data
图6是图5中“寻找目标ID头‘$GPRMC’”子过程的流程图。值得注意的是,程序中不可出现m_strRecv[i+k](k为大于0的整数)这样的表达式。有人会以(m_strDataReceived[i]== ’$’&&m_strDataReceived[i+3]== ’R’)为判断条件来提取ID头,看起来方便但会很容易造成超出数组元素个数的错误。
图6 寻找目标ID头流程Fig.6 Flow chart of finding wanted ID header
图7是图5中“提取经纬度信息”子过程的流程图,同样也要应遵循每次循环应仅处理当前一位数据m_strRecv[i]的原则。
4 试验结果
连接GPS天线,在空旷的场地给电路板上电,运行开发的软件,获得如图8所示的运行结果。可以看到,当前的位置为东经 108.458035°,北纬 34.018866°。
上面是摘取图8中“接受区”编辑框里的一条语句,参照表1可以看出各项信息都合乎常理,系统成功运行。
图7 提取经纬度信息流程Fig.7 Flow chart of picking up position information
图8 软件运行结果Fig.8 Results of runnig
5 结 论
系统在ARM硬件平台下,用ARM芯片的串口引脚连接GPS模块GS-91,并在Visual Studio 2008下开发了读取串口以获取导航数据的软件,该软件还实现了实时提取当前经纬度信息并显示,以及采点构建行进路线的功能。本系统可为自主移动机器人提供GPS导航定位服务,简单可行,极具借鉴价值。
[1]邓旭玥,王伟,易建强,等.移动机器人导航研究现状及其发展趋势展望[J].可编程控制器与工厂自动化(PLC FA),2004(11):4-8.
DENG Xu-yue,WANG Wei,YI Jian-qiang,et al.Mobile robotnavigation and development trend research[J].Programmable Controller&Factory Automation,2004,11:4-8.
[2]广州鑫图科技有限公司.GPS Engine Board GS-91[EB/OL].Http://www.gzxintu.com.
[3]百 度 百 科.NMEA[EB/OL]. (2011-06-25).http://baike.baidu.com/view/1303668.htm.
[4]孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2006.
[5]张欢,钮文良.Windows CE系统开发基础与实例[M].北京:中国电力出版社,2009.
[6]李景峰,杨丽娜,潘恒,等.Visual C++串口通信技术详解[M].北京:机械工业出版社,2010.