基于MFC的AUV多传感器数据采集系统设计及测试
2014-12-18高菲张东昆侯建钊
高菲+张东昆+侯建钊
摘 要: 由于海底环境的复杂性与任务的多样性,这就对AUV航向位姿环境等信息的实时性和可靠性提出很高的要求。为了降低海试成本和风险,以智能小车为硬件平台,装载AHRS、GPS、激光测距仪(LMS)等多个传感器,组成数据采集系统,采用模块化分布,使用多线程编程技术和串口通信技术,创建基于对话框的MFC应用程序,实现人机交互。
关键词: AUV; 多传感器; 串口通信; 多线程编程; MFC
中图分类号: TN964?34 文献标识码: A 文章编号: 1004?373X(2014)24?0130?03
Design and test for AUV multi?sensor data acquisition system based on MFC
GAO Fei, ZHANG Dong?kun, HOU Jian?zhao
(College of Information Science and Engineering, Ocean University of China, Qingdao 266100, China)
Abstract: In the 21st century, the ocean resources have been attracting more and more attentions from human, and AUV research has gradually become the mainstream trend. A higher requirement for the real?time performance and reliability of the heading, altitudes and location information of AUV is proposed Due to the complexity of underwater environment and varieties of task. In order to reduce the test cost and risk on sea, an intelligent vehicle is taken as a platform with AHRS, GPS, laser range finder and several sensors to constitute a data acquisition system, and modular distribution, multi?thread programming technology and serial port communication technology are adopted to establish a MFC application program based on dialog box, so as to realize the human?computer interaction.
Keywords: AUV; multi?sensor; serial communication; multithread programming; MFC
众所周知,海洋底部蕴藏着非常丰富的生物及矿产资源,自主式水下机器人(AUV)作为一种高技术手段,在海洋开发和利用中扮演重要的角色,受到各国特别是发达国家的高度重视。除了军事海洋方面,学术界也对AUV进行了大量的研究工作[1]。2002年,Oxford的Paul Newman提出MOOS系统,每个传感器作为独立进程,通过数据库MOOSDB按照UDP协议进行通信[2]。MIT的Benjamin在MOOS中加入IvP算法,实现AUV的自主决策[3]。
MIT的Albert S.Huang提出了LCM系统,利用模块化分布,基于TCP/IP协议实现数据可靠传输[4]。该系统也采用模块化分布模块,但是采用多线程体系,通过RS 232串口通信协议传输数据。
1 数据采集系统简介
数据采集系统主要包括4个模块:控制界面、数据保存模块、传感器处理模块、上层控制指令响应模块。其中,主控界面是整个软件系统的总控,为软件的各个模块提供接口,实现人机交互;保存模块主要是将传感器数据处理后保存到磁盘文件中;传感器处理模块又包括AHRS、HGPS、编码器等子传感器处理模块,主要负责数据的接收处理;上层控制指令响应模块用来解析控制指令控制传感器的工作。
2 系统设计原理
(1) 基于对话框的MFC应用程序
微软基础类库(Microsoft Foundation Class,MFC)是微软为了简化程序员的开发工作所开发的一套面向对象的函数库,以类的形式提供给开发人员使用[5]。Windows系统的操作都是以消息形式存在的,MFC利用消息映射机制,在某特定类定义该消息响应函数,对消息进行处理。该系统中自定义WM_DIS***消息,在主线程中定义消息响应函数,处理和显示传感器数据。
(2) 多线程体系
采用多线程体系,一是因为多个线程占用同一进程的地址空间,占有的资源比较少,二是多个线程可以并发地同时运行,效率比较高[5?6]。在数据采集系统设计过程中,主线程负责主控界面的创建,在主线程中创建传感器子线程和保存子线程,利用事件对象实现多线程同步,通过调用接口WaitSingleObject()等待事件对象变为有信号状态[7]。
(3) RS 232串口通信
通信通过RS 232串口实现短距离数据传输,通信协议简单易操作,串口通信主要分为4步:
① 打开串口;
② 配置串口;
③ 读写串口;
④ 关闭串口。
串口数据均是以字节为单位,可以直接调用Win32提供的API函数进行串口编程[8?9]。
3 软件实现
创建基于对话框的MFC程序,在对话框资源控添加控件,用于控制传感器串口和显示传感器数据,系统对应的主控界面如图2所示。
在主线程中初始化对话框界面,创建保存文件目录,添加控件和消息响应函数,创建各传感器和保存子线程,等待WM_DIS**消息到来,调用OnHandleMsg消息响应函数,处理数据并显示在对话框中。主流程图如图3所示。
以AHRS为例,点击AHRS的Open按钮,创建AHRS传感器子线程,代码为:
//获取AHRS串口号
m_nPortAHRS=((CComboBox*)GetDlgIte m(IDC_COM_Portnum))?>GetCurSel()+1;
//创建子线程
pThreadProc_AHRS=AfxBeginThread((AFX_THREADPROC)Threadproc_AHRS,
LPVOID(&m_nPortAHRS));
每个传感器子线程实现步骤相似,其流程图如图4所示。
AHRS传感器子线程设置事件掩码,分配内存pstrMsgEnd_AHRS[]暂存从串口读取的数据,当读取数据检验有效,将保存事件hSave置为有信号状态,代码如下:
UNIT Threadproc_AHRS(LPVOID pParam)
{
…
hCommPort_AHRS=CreateFile(pstrCommPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0); //异步打开串口
//配置串口
SetCommState(hCommPort_AHRS,&dcb);
SetCommTimeouts(hCommPort_AHRS,&CommTimeouts);
SetCommMask(hCommPort_AHRS,EV_R
XCHAR);
…
WaitCommEvent(hCommPort_AHRS,&Event,&ovEol_AHRS); //等待事件掩码
…
ReadFile(hCommPort_AHRS,pstrMsgEnd_AHRS,dwReadThreshold_AHRS,&BytesRead,&ovEol_AHRS);
//读串口数据
CheckAHRSMsg(); //检验数据是否有效
//如果数据有效
SetEvent(hSave);
::PostMessage(hWnd,WM_DISAHRS,(WPARAM)pstrMsgCopy_AHRS,(LPARAM)nMsgLength);//将消息传递主线程处理
…
}
点击Save按钮后,创建保存子线程,申请中转区,将pDataBuffer中的数据暂存到中转区,从中转区读取数据计算变量值,添加时标和系统时间,通过写文件fwrite()函数将数据保存到磁盘中,通过时标和系统时间将各传感器数据同步起来,实时监测机器人航姿和路径。
4 结 语
经过反复测试,通过串口采集的数据很少出现丢失,实时性好,运行效率高,虽然发现程序中还是存在一定问题,但不影响该系统的运行,为了更好地适用于AUV,将对系统继续扩展,加入声呐,高度计,DVL,摄像头等传感器,对于同样要考虑的怎么将水下数据送达岸基平台,拟采用以太网Socket实现远距离数据传输,对于传感器的启动和关闭也将以控制指令的形式通过写串口加以实现[10]。
参考文献
[1] 徐玉如,李彭超.水下机器人发展趋势[J].自然杂志,2011(3):5?12.
[2] NEWMAN P M. MOOS: a mission oriented operating suite [R]. USA: Department of Ocean Engineering, MIT, 2008.
[3] BENJAMIN M R, NEWMAN P M, SCHMIDT H, et al. A tour of MOOS?IvP autonomy software modules, MIT?CSAIL?TR?2009?006 [R]. USA: MIT Computer Science and Artificial Intelligence Lab, 2009.
[4] HUANG A S, OLSON E, MOORE D C. Lightweight communications and marshalling for low latency inter?process communication, MIT?CSAIL?TR?2009?041 [R]. USA: MIT, 2009.
[5] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2007.
[6] 侯俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2001.
[7] 齐林庆.自主式水下机器人测控系统软件设计与实现[D].青岛:中国海洋大学,2011.
[8] 龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:电子工业出版社,2007.
[9] 李日云,王来禄,刘汇江.利用Win32API通信函数实现串口通信[J].地球科学与环境学报,2004,26(3):61?63.
[10] 张鹏,张水平,安红征.基于UDP与串口通信的训练台监控系统[J].通信技术,2008,41(1):159?161.
(3) RS 232串口通信
通信通过RS 232串口实现短距离数据传输,通信协议简单易操作,串口通信主要分为4步:
① 打开串口;
② 配置串口;
③ 读写串口;
④ 关闭串口。
串口数据均是以字节为单位,可以直接调用Win32提供的API函数进行串口编程[8?9]。
3 软件实现
创建基于对话框的MFC程序,在对话框资源控添加控件,用于控制传感器串口和显示传感器数据,系统对应的主控界面如图2所示。
在主线程中初始化对话框界面,创建保存文件目录,添加控件和消息响应函数,创建各传感器和保存子线程,等待WM_DIS**消息到来,调用OnHandleMsg消息响应函数,处理数据并显示在对话框中。主流程图如图3所示。
以AHRS为例,点击AHRS的Open按钮,创建AHRS传感器子线程,代码为:
//获取AHRS串口号
m_nPortAHRS=((CComboBox*)GetDlgIte m(IDC_COM_Portnum))?>GetCurSel()+1;
//创建子线程
pThreadProc_AHRS=AfxBeginThread((AFX_THREADPROC)Threadproc_AHRS,
LPVOID(&m_nPortAHRS));
每个传感器子线程实现步骤相似,其流程图如图4所示。
AHRS传感器子线程设置事件掩码,分配内存pstrMsgEnd_AHRS[]暂存从串口读取的数据,当读取数据检验有效,将保存事件hSave置为有信号状态,代码如下:
UNIT Threadproc_AHRS(LPVOID pParam)
{
…
hCommPort_AHRS=CreateFile(pstrCommPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0); //异步打开串口
//配置串口
SetCommState(hCommPort_AHRS,&dcb);
SetCommTimeouts(hCommPort_AHRS,&CommTimeouts);
SetCommMask(hCommPort_AHRS,EV_R
XCHAR);
…
WaitCommEvent(hCommPort_AHRS,&Event,&ovEol_AHRS); //等待事件掩码
…
ReadFile(hCommPort_AHRS,pstrMsgEnd_AHRS,dwReadThreshold_AHRS,&BytesRead,&ovEol_AHRS);
//读串口数据
CheckAHRSMsg(); //检验数据是否有效
//如果数据有效
SetEvent(hSave);
::PostMessage(hWnd,WM_DISAHRS,(WPARAM)pstrMsgCopy_AHRS,(LPARAM)nMsgLength);//将消息传递主线程处理
…
}
点击Save按钮后,创建保存子线程,申请中转区,将pDataBuffer中的数据暂存到中转区,从中转区读取数据计算变量值,添加时标和系统时间,通过写文件fwrite()函数将数据保存到磁盘中,通过时标和系统时间将各传感器数据同步起来,实时监测机器人航姿和路径。
4 结 语
经过反复测试,通过串口采集的数据很少出现丢失,实时性好,运行效率高,虽然发现程序中还是存在一定问题,但不影响该系统的运行,为了更好地适用于AUV,将对系统继续扩展,加入声呐,高度计,DVL,摄像头等传感器,对于同样要考虑的怎么将水下数据送达岸基平台,拟采用以太网Socket实现远距离数据传输,对于传感器的启动和关闭也将以控制指令的形式通过写串口加以实现[10]。
参考文献
[1] 徐玉如,李彭超.水下机器人发展趋势[J].自然杂志,2011(3):5?12.
[2] NEWMAN P M. MOOS: a mission oriented operating suite [R]. USA: Department of Ocean Engineering, MIT, 2008.
[3] BENJAMIN M R, NEWMAN P M, SCHMIDT H, et al. A tour of MOOS?IvP autonomy software modules, MIT?CSAIL?TR?2009?006 [R]. USA: MIT Computer Science and Artificial Intelligence Lab, 2009.
[4] HUANG A S, OLSON E, MOORE D C. Lightweight communications and marshalling for low latency inter?process communication, MIT?CSAIL?TR?2009?041 [R]. USA: MIT, 2009.
[5] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2007.
[6] 侯俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2001.
[7] 齐林庆.自主式水下机器人测控系统软件设计与实现[D].青岛:中国海洋大学,2011.
[8] 龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:电子工业出版社,2007.
[9] 李日云,王来禄,刘汇江.利用Win32API通信函数实现串口通信[J].地球科学与环境学报,2004,26(3):61?63.
[10] 张鹏,张水平,安红征.基于UDP与串口通信的训练台监控系统[J].通信技术,2008,41(1):159?161.
(3) RS 232串口通信
通信通过RS 232串口实现短距离数据传输,通信协议简单易操作,串口通信主要分为4步:
① 打开串口;
② 配置串口;
③ 读写串口;
④ 关闭串口。
串口数据均是以字节为单位,可以直接调用Win32提供的API函数进行串口编程[8?9]。
3 软件实现
创建基于对话框的MFC程序,在对话框资源控添加控件,用于控制传感器串口和显示传感器数据,系统对应的主控界面如图2所示。
在主线程中初始化对话框界面,创建保存文件目录,添加控件和消息响应函数,创建各传感器和保存子线程,等待WM_DIS**消息到来,调用OnHandleMsg消息响应函数,处理数据并显示在对话框中。主流程图如图3所示。
以AHRS为例,点击AHRS的Open按钮,创建AHRS传感器子线程,代码为:
//获取AHRS串口号
m_nPortAHRS=((CComboBox*)GetDlgIte m(IDC_COM_Portnum))?>GetCurSel()+1;
//创建子线程
pThreadProc_AHRS=AfxBeginThread((AFX_THREADPROC)Threadproc_AHRS,
LPVOID(&m_nPortAHRS));
每个传感器子线程实现步骤相似,其流程图如图4所示。
AHRS传感器子线程设置事件掩码,分配内存pstrMsgEnd_AHRS[]暂存从串口读取的数据,当读取数据检验有效,将保存事件hSave置为有信号状态,代码如下:
UNIT Threadproc_AHRS(LPVOID pParam)
{
…
hCommPort_AHRS=CreateFile(pstrCommPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0); //异步打开串口
//配置串口
SetCommState(hCommPort_AHRS,&dcb);
SetCommTimeouts(hCommPort_AHRS,&CommTimeouts);
SetCommMask(hCommPort_AHRS,EV_R
XCHAR);
…
WaitCommEvent(hCommPort_AHRS,&Event,&ovEol_AHRS); //等待事件掩码
…
ReadFile(hCommPort_AHRS,pstrMsgEnd_AHRS,dwReadThreshold_AHRS,&BytesRead,&ovEol_AHRS);
//读串口数据
CheckAHRSMsg(); //检验数据是否有效
//如果数据有效
SetEvent(hSave);
::PostMessage(hWnd,WM_DISAHRS,(WPARAM)pstrMsgCopy_AHRS,(LPARAM)nMsgLength);//将消息传递主线程处理
…
}
点击Save按钮后,创建保存子线程,申请中转区,将pDataBuffer中的数据暂存到中转区,从中转区读取数据计算变量值,添加时标和系统时间,通过写文件fwrite()函数将数据保存到磁盘中,通过时标和系统时间将各传感器数据同步起来,实时监测机器人航姿和路径。
4 结 语
经过反复测试,通过串口采集的数据很少出现丢失,实时性好,运行效率高,虽然发现程序中还是存在一定问题,但不影响该系统的运行,为了更好地适用于AUV,将对系统继续扩展,加入声呐,高度计,DVL,摄像头等传感器,对于同样要考虑的怎么将水下数据送达岸基平台,拟采用以太网Socket实现远距离数据传输,对于传感器的启动和关闭也将以控制指令的形式通过写串口加以实现[10]。
参考文献
[1] 徐玉如,李彭超.水下机器人发展趋势[J].自然杂志,2011(3):5?12.
[2] NEWMAN P M. MOOS: a mission oriented operating suite [R]. USA: Department of Ocean Engineering, MIT, 2008.
[3] BENJAMIN M R, NEWMAN P M, SCHMIDT H, et al. A tour of MOOS?IvP autonomy software modules, MIT?CSAIL?TR?2009?006 [R]. USA: MIT Computer Science and Artificial Intelligence Lab, 2009.
[4] HUANG A S, OLSON E, MOORE D C. Lightweight communications and marshalling for low latency inter?process communication, MIT?CSAIL?TR?2009?041 [R]. USA: MIT, 2009.
[5] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2007.
[6] 侯俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2001.
[7] 齐林庆.自主式水下机器人测控系统软件设计与实现[D].青岛:中国海洋大学,2011.
[8] 龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:电子工业出版社,2007.
[9] 李日云,王来禄,刘汇江.利用Win32API通信函数实现串口通信[J].地球科学与环境学报,2004,26(3):61?63.
[10] 张鹏,张水平,安红征.基于UDP与串口通信的训练台监控系统[J].通信技术,2008,41(1):159?161.