基于USB半物理仿真平台的实现.docx_第1页
基于USB半物理仿真平台的实现.docx_第2页
基于USB半物理仿真平台的实现.docx_第3页
基于USB半物理仿真平台的实现.docx_第4页
基于USB半物理仿真平台的实现.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于USB、Socket和Quest3D的半物理仿真平台的实现钟爱平、魏风波、师光飞摘要:QUEST3D是一款优秀的3D仿真软件,其优秀的实时3D、强大的物理仿真引擎以及图形化的编程界面,使用户在很短的时间内就可以构建出3D展示、漫游等实景仿真程序,但是由于QUEST3D与外部硬件的通信方式比较简单,目前与硬件直接通信的方式只有串口,当构建半物理仿真器时,其与硬件部分的通讯将变得困难。本文提出了一种使用Visual C+编写的通讯中介程序,融合USB总线、Socket套接字通讯,有效解决QUEST3D与硬件的通讯问题,并以此为基础搭建一种虚拟驾驶的半物理仿真器。关键字:仿真、Socket、USB、Abstract: Quest3D is an excellent3D simulation software, with the real-time3D engine,good graphic programminginterface,users can build a3Dscene in a very short period of time, such as virtual roaming simulation, virtual showing program,but the communication method to external hardware in QUEST3Dis relatively simple,the currentwayis onlyserial, when constructing asemi-physicalsimulator,thecommunicationwill be difficult. This article presents aVisualC+ writtencommunicationmedium program,integrats of USB bus,Socket communication,effectively solve thecommunication problembetween QUEST3D and hardware,Base on this program build a semi physicalsimulation of virtualdriving.KEYWORDS: simulation Socket USB0、 系统构成Quest3d在制作高效、逼真的三维交互式仿真程序中有着不可比拟的优势,但在外设通讯等功能上却显得力不从心。为了弥补quest3d与USB设备通讯功能的不足,采用Visual C+搭桥的方式,通过TCP/IP协议与quest3d通讯,同时通过Cypress公司提供的API函数与USB设备进行通讯,从而实现虚拟平台quest3d与物理平台USB设备之间的通讯,以达到结合两者的优点,以长补短的目的。系统的结构构成如下图所示:图1:半物理仿真平台总体架构通信中介程序与外部设备的通信使用USB总线,与三维仿真程序的通信使用了TCP/IP协议。三维仿真程序中的客户端必须知道服务器端的IP和端口号才能与之连接,而quest3d在获取本机IP、端口方面并不擅长,因此,由通讯中介程序获取本地IP和端口,通过文本文件与三维仿真程序共享。由于通信中介程序和三维仿真程序分别基于不同的平台构建,本质上是2个独立的程序,为了使三者能构成一个协调的整体,应设置程序的启停顺序,使系统的启停与单一程序没有区别,即通信中介序启动后最小化到系统托盘上,然后创建服务器端,查询USB接口,然后启动三维仿真程序。在退出时,先退出三维仿真程序,之后通信中介程序自动退出。这样,整个系统在启停上成为一个整体。1、 QUEST3D中的套接字编程Quest3d目前版本中关于Socket的通信功能并不完备,只能作为TCP Client与已经建立好的TCP Server进行连接。在quest3d中封装好的有关socket通讯的channel有socketaction、socketstring。前者主要用于执行创建客户端的一些命令,如:connect、disconnect、senddata等,后者用于接收服务器端发送来的数据。因为quest3d的程序运行方式是从上到下、从左至右扫描运行的,如果对一个命令不加以限制,将会无限运行下去,造成错误。用这2个channel进行通讯编程时必须与one time模块配合使用。图2:Quest3d中的程序运行流程socketaction的属性如图3 所示,可见执行Connect命令时,需要两个参数:服务器端的IP和端口,仿真程序运行于本机,因此应该使用本机的IP。这两个参数可以事先写入到quest3d的代码中固定下来,但是带来的后果就是程序的可移植性变差,一旦更换电脑或是更改IP地址将导致程序的失效,所以参数应该在程序中动态获取。Quest3d是一款着重于3D仿真的系统,使用quest3d获取本地计算机的IP和端口将是十分困难的,因此获取IP和端口由通信中介程序完成,通信中介程序与仿真程序以文本文件作为中介,即通信中介程序获取本地计算机IP后,将IP和端口号写入到文本文件中,QUEST3D在运行通讯程序时,先读取文本文件中的参数,并以此建立客户端。图3:Quest3D中完成socket通讯程序的主要channelQUEST3D提供了一个lua通道,用户可以在这个通道中写lua脚本来实现一些quest3d难以完成的任务。通讯中介程序通过文本告知三维仿真程序本地IP和端口,在quest3d中调用一个lua通道来实现文本的读取,在lua通道中输入如下代码:function CallChannel()local file=io.open(c:IP_PORT.txt,r)local ip_port=file:read(*line)local ip=channel.GetChild(0)ip:SetText(ip_port)ip_port=file:read(*line)local port=channel.GetChild(0)port:SetText(ip_port)file:close()endluascript打开位于C盘的名为IP_PORT.txt的文本文件,从该文件中分别读取IP地址和端口,并赋予通道下的子通道0和子通道1。获取的IP参数为txt类型,可以直接作为socketaction的第一个参数,获取的端口号则需要将文本转化成整型后作为第二个参数。最终的通道连接如下图所示:图4:quest3d连接服务器的实现2、 基于visual c+的通信中介程序构建通信中介程序需要在quest3d和硬件平台上搭桥,一方面需要与socket通讯,另一方面需要与USB设备通讯。通讯中介程序的结构框图如下所示:图5:通讯中介程序框图由于三维仿真程序只能作为客户端与服务器端进行连接,因此,使用Visual C+创建服务器端,在创建服务器之前,程序先获取本地的IP,并将IP和端口号写入到位于C盘的文本文件IP_PORT.txt中供三维仿真程序读取。实现IP、端口获取和写入的流程如下图:图6:通讯中介程序获取IP和端口与三维仿真程序共享的流程完成IP和端口的写入后,程序开始创建服务器端,服务器端的创建流程如下:图7:通讯中介程序创建服务器端的流程在启动侦听后,创建一个接收线程来与客户端的socket交换数据,客户端的数据来自于三维仿真程序,接收到的数据需要反馈给USB设备,因此,在接收线程中接收到数据后直接将数据发送给USB从机设备。3、 基于Visual C+和Cypress SDK的USB通讯上位机编程Cypress公司为其USB协议芯片提供了上位机程序开发库CyAPI.lib,封装了对USB芯片进行识别、通信的大部分功能,用户只需要调用库函数就可以完成与USB芯片的通信。在这里使用USB芯片cy7c68013a,为了避免编写驱动程序的麻烦,使用控制端口0进行通讯,由主机向从机发送数据的自定义描述符为0xa1,由从机向主机发送数据的自定义描述符为0xa2。使用CyAPI.lib与从机进行通信,使用的是同一个函数ept-xferdata();而传输的方向(即相对于主机是发送还是接收)由控制端点中的direction定义,完善控制端点结构体之后就可以进行发送和接收了,发送和接收的结构体初始化如下所示。 主机发送数据:ept-Target = TGT_DEVICE; ; /目标为设备ept-ReqType = REQ_VENDOR; /请求类型为自定义请求ept-Direction = DIR_TO_DEVICE; /传输方向为由主机到设备 ept-ReqCode = 0xA1; /自定义请求代码 ept-Value = 0; ept-Index = 0;ept-XferData(buf,buflen);主机接收数据:ept-Target = TGT_DEVICE; /目标为设备 ept-ReqType = REQ_VENDOR; /请求类型为自定义请求 ept-Direction = DIR_FROM_DEVICE; /传输方向从设备到主机 ept-ReqCode = 0xA2; /自定义请求代码 ept-Value = 0; ept-Index = 0;根据通讯中介程序的结构可以知道,发送数据应放在socket的接收线程中,而接收数据的线程中应使用socket向客户端发送数据。4、 基于Cy68013A芯片与上位机通讯的实现通讯中介程序包含了上位机与USB从机通讯的功能,而要实现USB主机与从机的通讯,只有上位机程序还远远不够,还要编写USB固件程序,即利用USB协议芯片Cy7c68013a实现对上位机各种请求代码的解析并作出回应,特别是在其自定义请求的响应中,负责将数据采集器采集的数据发送给主机或是接收主机发送的数据。在此系统中,使用两个开关SW1、SW2分别连接到Cy7c68013a的PA4、PA5上,用来模拟两路开关量(如下图中红圈所示),使用四个LED灯D1、D2、D3、D4连接到PA0、PA1、PA2、PA3上(如下图中绿圈所示),用来显示上位机上传来的数据状态。图8:半物理仿真平台使用的硬件原理图及实物图USB固件程序主要用来完成USB设备的识别、重列举、设备请求、USB协议处理等任务,具体请参看USB 2.0协议,在本程序中,USB固件使用自定义请求与主机交换数据,在固件程序中定义:#define SC_SetData0xa1/自定义请求 #define SC_ReadData0xa2/自定义请求 这两个自定义请求分别于USB主机程序中的接收和发送段代码定义的描述符相同。从机在通过控制端点0与主机建立通讯的过程中,固件程序根据描述符类型做出响应,过程如下段代码所示:Switch(SETUPDATA1)Case:Case:case SC_SetData: /向端口发送数据DR_SetData();break;case SC_ReadData: /读端口数据DR_ReadData();break;5、 模拟汽车驾驶的实现连接USB设备,启动通讯中介程序,启动三维仿真程序,三者构成了一套半物理实景仿真系统。在USB固件程序中定义:如果SW1按下,则发送数据0x10;如果SW2按下,则发送数据0x11;如果接收到数据0x12,则D0-D3全亮,如果接收到数据0x13,则D0-D3全灭。在仿真程序中定义:收到数据0x10,汽车前进,收到数据0x11,汽车后退,汽车左拐时发送数据0x12,汽车右拐时发送数据0x13.系统运行效果如下:图9:使用按键控制汽车转向运行效果图6、 系统顺序启停的实现6.1、顺序启动的实现顺序启动时,当通讯中介程序完成服务器端搭建后,通过调用ShellExecute函数,启动三维仿真程序。ShellExecute函数原型及参数含义如下: ShellExecute( HWND hwnd, /父窗口句柄 (如:NULL,Handle等)LPCSTR lpOperation, /操作类型 (如:open)LPCSTR lpFile, /要进行操作的文件或路径 LPCSTR lpParameters, /当lpOperation为“explore”时指定要传递的参数,通常设为NULL LPCSTR lpDirectory, /指定默认目录,通常设为NULL INT nShowCmd /文件打开的方式,以通常方式还是最大化或最小化显示,一般为SW_SHOWNORMAL )ShellExecute(NULL,open,虚拟汽车驾驶系统.exe,NULL,NULL,SW_SHOWNORMAL);在调用三维仿真程序后通讯中介程序最小化到系统托盘,完成启动过程。6.2、顺序停止的实现系统处于运行状态时,由于通讯中介程序最小化到了托盘,退出系统有两种模式:(1)通过三维仿真程序中的退出按钮,点击按钮后三维仿真程序退出,同时通讯中介程序退出;(2)从系统托盘退出,通讯中介程序退出之后三维仿真程序退出。为了实现这样的停止逻辑,约定任意一方在退出之前向对方发送字符串”quit”,双方在只要收到字符即退出进程。 图10:quest3d中实现顺序停止的方法通讯中介程序在在退出响应函数退出对话框之前向仿真程序发送”quit”,并在接收线程中收到”quit”字符串后向窗体发送WM_CLOSE消息。if (temp.Mid(0,4)=quit)dlg-SendMessage(WM_CLOSE);CSt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论