1、红外定位的研究与计算机辅助轮滑轨迹仿真系统的实现摘 要:红外定位技术是研究三维运动物体的常用方法,将其与光电测速、接触检测和数据存储等技术相结合,并通过参考物体的选择、变换等算法,在轮滑运动中加以应用,能够较好的再现轮滑步态的三维轨迹。所得到的研究成果有助于进一步实现轮滑的智能控制。关键字:轮滑运动,红外,定位,轨迹,仿真Research on Infrared Locating and Computer Aided Simulation System for Human Skating TraceAuthor: YAN Jin, LI Guan-Yi(School of Automation
2、 Science and Electrical EngineeringBeihang University, Beijing, 100083, China)Abstract: It is conventional to use infrared in 3D for locating objects. And it is combined with measuring speed by photoelectricity, contact detection and data storage in my research of human skating. It is easy to playba
3、ck every step of foots trace in 3D. The achievement in my research report would have contributed to intelligence control of human skating.Keywords: human skating, infrared, lacating, trace, simulation目 录1.绪论12.整体构想与系统组成33.硬件部分53.1.电路设计53.1.1.整体电路结构53.1.2.微处理器63.1.3.存储设备73.1.4.其他电路73.2.红外定位模块83.2.1.电
4、路连接83.2.2.元件安装103.2.3.程序代码分析113.3.光电测速模块143.4.地面接触检测模块153.4.1.元件连接153.4.2.程序代码分析153.5.串口通讯模块163.5.1.电路连接163.5.2.程序代码分析163.6.存储卡读写模块173.6.1.电路连接173.6.2.程序代码分析184.软件部分19致 谢20参考文献21附 录22附录一红外定位模块源代码22附录二地面接触检测模块源代码24附录三文曲星通讯源代码26附录四SD存储源代码28附录五VB代码(部分)351. 绪论轮滑运动作为年轻人热衷的一项体育运动,风靡于世界各地。医学研究表明:轮滑与跑步、骑车一样
5、都能达到健身的效果,即消耗了热量,提高了心肺机能,强化了肌肉等。但和跑步相比,轮滑运动对关节的冲击力只有一半。所以,轮滑运动是一项安全的体育运动。但由于没有佩戴合适的头盔与护具,没有合适的指导老师,以及滑行场地存在安全隐患等往往会造成意外事故。所以针对轮滑的智能控制就成为一种行之有效的解决方案。智能控制的基础是对于轮滑步态轨迹的准确分析与判断。而在这方面的研究成果很少,可行的方案一般认为有以下两种:一是利用加速度传感器测量轮滑鞋的轨迹,二是利用多个摄像头采集步态轨迹。以上方案存在着种种不足:一方面由于价格原因,另一方面是安装困难,难于实现。因此,我提出一种利用红外定位、光电测速、接触检测和数据
6、存储等技术相结合的解决方案,原理图见图 11所示。这样,可以得到实时的速度值,轮滑鞋的位置关系,与地面的接触情况,而避免利用加速度传感器得到加速度后,再进行位置的求算于状态的判断。右脚:左脚:红外定位光电测速接触检测红外定位光电测速接触检测微处理器存储器个人计算机文曲星图 11原理图具体的方案基于以下事实:在轮滑鞋的运动过程中,至少有一只鞋是和地面接触的,因为即使双脚同时离地,受重力作用,时间也很短。这样,我们总以和地面接触的一只鞋为参照,测定其轮的转速,并且认为是轮滑鞋的速度,而另一只轮滑鞋的相对位置可以测定,这样两只轮滑鞋的运动状况就测定了,也就是说三维的轨迹可以再现出来。2. 整体构想与
7、系统组成计算机辅助轮滑轨迹仿真系统在硬件上由以下几部分组成:测量系统分红外定位模块、光电测速模块、地面接触检测模块三部分,最终的目的在于测定每只轮滑鞋的状态数据(包括速度、加速度等),在计算机上再现步态的轨迹。受资金条件的限制,本项目并没有采用传统的微型加速度传感器(例如FreeScale的产品,可用作硬盘或汽车等的测量)作为测量手段,而是基于以下的假设做出了简化:在轮滑鞋的运动过程中,至少有一只鞋是和地面接触的,在非特技表演的少数特定情况下,即使双脚同时离地,受重力作用,时间一般也不会超过0.30.4s。这样,我们总以和地面接触的一只鞋为参照,测定其后轮的转速,即绝对速度,而另一只鞋的相对的
8、变化,即为相对速度,这样两只鞋的运动状况就测定了。具体见图 21所示。左脚:处于与地面接触的状态,作为参考目标右脚:测定相对左脚位置和角度光电测速:决定轮滑鞋的速度光电测速图 21轮滑鞋位置与速度的测定一般来讲,轮滑鞋的4个轮子与地面接触面并不是严格的平面,也就是说可能只有3个轮子接触到了地面。但是,当鞋子承受人的重量后,轮子被压缩产生微小的形变,此时4只轮子都能和地面接触。而且正常情况下,人的重心偏后,所以测定后轮的转速成为理想的选择。但正常滑行过程中,人的重心会前倾,这时只需要判断究竟后轮是否离地即可,而且这是容易通过地面接触检测模块实现的。另一个需要考虑的问题就是,是否存在两个后轮同时离
9、地,而依靠前轮支撑完成一些动作,当然这种情况不能排出,但根据轮滑的经验可以想见,这种动作的持续时间不会太长,而且没有必要采用这种方法完成某个动作。在这里举一种比较常见的类似情况的例子是一只脚的脚尖着地,另一只脚的脚根着地做原地旋转的动作,而通过地面接触检测模块是可以判定那只脚是脚根着地状况,是可以测定的,这样仍然满足前面的假设。对于一些单脚完成的一些花样动作,在速度方面后加速度方面往往具有周期性,通过对变化率的判断仍然可以实现轨迹的再现。3. 硬件部分3.1. 电路设计3.1.1. 整体电路结构硬件电路采用常用的数字逻辑电路实现,由单片机进行控制。电路图见图 31所示。图 31原理图考虑到项目
10、仍是验证阶段,没有制PCB版。硬件焊接在通用的PCB版上,具体的元件介绍参见下文。3.1.2. 微处理器硬件的微处理器(MCU)采用Atmel公司51系列的AT89S52,其主要特性如下:与MSC-51单片机产品兼容;8K字节在系统(In-System)可编程Flash存储器;1000次擦写周期;033MHz工作频率;256字节的内部RAM;32条可编程I/O线;3个16位定时器/计数器;8个中断源,两级优先级;1个全双工通用串行异步收发器(UART);实际电路采用自控协会51系列开发版,MCU采用的AT89S52-24PI即工业用40脚双排塑料直插封装(DPIP),工作温度-4085,最高工
11、作频率24MHz。,其封装见图 32所示,工作频率由24MHz的晶振(Crysital)提供,为兼融SD卡的工作电平,AT89S52的工作电压为3.3V。图 32微处理器3.1.3. 存储设备存储器采用Kingston公司的1GB SD卡,封装如图 33所示。图 33SD卡封装其主要特性如下:2.7V3.6V工作电压;025MHz可变工作时钟;最高10MB/s读/写速度;3.1.4. 其他电路其它的硬件电路主要包括安装在每只轮滑鞋的逻辑电路,其主要实现红外的发射与接收和地面接触检测功能,具体参见后面的红外定位模块和地面接触检测模块章节。此外还包括光电测速和文曲星通讯接口电路和声音发生电路,具体
12、请参看后面章节。以上采集到的数据通过约1m长排线传输到单片机,记录到SD卡中。3.2. 红外定位模块3.2.1. 电路连接红外线的产生装置包括波形产生电路和放大电路。通过数据线和单片机连接,其中AT89S52的引脚安排如表 31下:表 31MCU引脚定义P3.4TTL输入接红外接收头输出P3.5TTL输入接红外接收头输出P1.4TTL输出接译码器门控端,右脚使能P1.5TTL输出接译码器输入端P1.6TTL输出接译码器输入端P1.7TTL输出接译码器输入端波形产生电路由555定时器、最小项译码器74LS138和电阻、电容等构成。实际采用的NE555P定时器(Single Precision T
13、imer)可以构成频率可调、占空比可调的多谐振荡器,电路图见图 34所示。设滑动变阻器RV1左右两部分电阻为R3和R4,可以证明,震荡频率为:通过调节RV1,使得Q输入占空比近似为1的38kHz方波,R3=10和R4=24.99k为近似解,通过和函数发生器产生的方波比较可以实现比较精确的调节。图 34定时器外部电路74LS138译码器(3-Line to 8-Line Decoders/ Demultiplexers)结构图如图 35所示。图 35最小项译码器真值表如表 32所示:表 32译码器真值表门控端输入端输出端E1E2+E3CBAY7Y0X1XXX11111111,0xff0XXXX1
14、1111111,0xff10000,0x011111110,0xfe10001,0x111111101,0xfd10010,0x211111011,0xfb10011,0x311110111,0xf710100,0x411101111,0xef10101,0x511011111,0xdf10110,0x610111111,0xbf10111,0x701111111,0x7f最小项译码器的使能端由多谐振荡器和单片机共同控制,其中左脚的74LS138的E1接NE555P输出,和接单片机P2.7口,其中右脚的74LS138的E1接单片机P2.7口,和接NE555P输出。当单片机P2.7口输出为1时,
15、右脚的电路工作,输出为0时,左脚的电路工作。在一只脚处于工作状态的时候,NE555P输出驱动对应的74LS138的使能端,使得74LS138的输出随着NE555P的输出周期性变化,而地址端ABC由单片机P2.4P2.6口控制,使得74LS138依次循环输出。也就是说,NE555P的输出产生38kHz的载波,单片机P2.4P2.7口的输出共同起调制作用。放大电路采用PNP型三极管T,基极B接输入信号(低电平有效),发射极E接高电平,集电极C接输出,以此实现数字信号的放大,驱动红外发光二极管(LED),经T放大之后,流过LED的电流约为5mA,足以产生有效距离1米左右的红外光。输出的波形见所示,图
16、代表LED依次发射红外线,图 36是放大的波形,清晰的表明间断的载波信号。图 36红外波形图红外的接收装置为中心接收频率38kHz的集成红外线接收器HS38b,如图 37所示,安装在每只鞋的底部,图 38为其典型的连接电路,其中C为单片机。红外接收头的中心接收频率为38kHz,输出TTL电平,在没有信号是输出高电平,收到信号则输出低电平。图 37红外接受头图 38典型红外接收电路3.2.2. 元件安装轮滑鞋的安装位置如图 39所示,在每只鞋四周安装8个红外发光二极管(LED的安装位置允许一定的精度误差,通过在程序上进行修正,参见后面第4章的软件部分),在轮滑鞋的底部中央安装一个红外接收头。图
17、39红外定位系统安装图接收端安装在轮滑鞋的底部,由于任意时刻只有一个红外发光二极管发射载波,也就至多只有一个对应的红外接收头(位于另外一只轮滑鞋上)收到载波,依次循环,一个周期(实际上约为510ms)内,左右两只轮滑鞋便能得到来自对方某个位置确定的信号,实际中采用38kHz的载波信号,一方面为了满足接受头的中心频率,另一方面也能防止干扰,即接受端只有收到若干个稳定的低电平后,才认为收到了相应的信号,由于平面内非平行的两条直线必定存在一个交点,通过矩阵运算,能够得到两只轮滑鞋的相对角度,由于红外LED有一定的发射角度,根据接收端收到的稳定低电平的个数,利用概率分布,可以得到两只轮滑鞋的相对位置。
18、3.2.3. 程序代码分析AT89S52工作在24MHz的晶振下,一个振荡周期约为42ns,而一个机器周期包含12个振荡周期,即约为0.5s。经过一个机器周期,内部定时器(Timer0)加1,直到溢出后将产生中断,而38kHz的时钟周期约为26s,也就是52个机器周期,当Timer0工作在模式0(13位计数器)下,为保证至少有10个周期的载波信号,定时器初值可以设定为1D00,但每次的初值需要有软件重新装载。软件部分在Keil Cx51 V7.0下编写,单片机复位之后,进入主程序,首先函数Infrared_Init()初始化红外定位模块,当产生中断后,进入相应的中断函数Infrared(),函
19、数的流程图如图 310、图 311和图 312所示。Infrared_Init():开始初始化定时器设置初值启动定时器结束InfrCnt=0x0f InfrCode=0x07RecvCnt=0x00开中断图 310红外流程图(一)Infrared():NYYN中断InfrCnt-InfrCnt=0x0fP1.4= InfrCnt&0x01输出P1.5P1.7InfrCode-InfrCode=0x07中断返回调用InfrReceive()图 311红外流程图(二)InfrReceive():开始结束InfrCnt=0x0fYNRecvCnt=0x00RecvCnt+调用数据存储函数RecvPo
20、rtXNX=0,1图 312红外流程图(三)程序代码见附录一。3.3. 光电测速模块光电测速模块是利用光电鼠标的原理,在每只轮滑鞋的后部加装一个光电鼠标,通过鼠标内的DSP处理,经过PS/2接口传到单片机中,实现对轮转向和转速的测量。鼠标的PS/2接口为6针的PS/2插座(Socket),如图 313所示。图 313PS/2插座1为数据(Data),3为电源地(GND),4为电源5V(Vcc),5为时钟(CLK),2和6为预留(RSV)。3和4与电源相连接,1和5经上拉电阻与单片机连接。鼠标和单片机遵从同步串行协议:鼠标发送到单片机的数据在时钟的下降沿被读取,而单片机发送的数据在时钟的上升沿被
21、读取,鼠标会一直产生时钟,而且数据和时钟是集电极开路(OC门),很容易下拉到地,通过单片机拉低时钟能够抑制来自鼠标的通讯。标准的PS/2鼠标发送位移和按键信息给主机采用如表 33的3字节数据包格式:表 33鼠标数据包格式Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0Byte1Y OverflowX OverflowY Sign BitX Sign BitAlways 1Middle ButtonRight ButtonLeft ButtonByte2X MovementByte3Y Movement3.4. 地面接触检测模块3.4.1. 元件连接在每只鞋内前后分别安装2个薄膜
22、开关,当脚离开地面,或者部分离开地面,由于重力作用,脚和鞋之间产生缝隙,相应的薄膜开关就会断开。考虑到4个开关会有同时开、关的状态,所以使用AT89S52的4个I/O端口,而没有对按键进行编码。电路如图 314所示。其中的电容器和电阻器到消除开关噪声的作用。图 314地面接触检测模块电路连接其中AT89S52的引脚安排如表 34所示。表 34MCU引脚定义P1.0TTL输入接按键输出P1.1TTL输入接按键输出P1.2TTL输入接按键输出P1.3TTL输入接按键输出3.4.2. 程序代码分析程序代码见附录二。3.5. 串口通讯模块3.5.1. 电路连接为简化操作,控制端为文曲星,这样能避免键盘
23、输入电路和液晶显示电路占用过多的I/O端口,只需通过串口即可和文曲星实现数据交换,而且很方便地,在没有PC的情况下,达到修改系统设置和显示信息的作用。文曲星和单片机的连接为串行数据线,电路如图 315所示。图 315文曲星电路连接其中AT89S52的引脚安排如表 35所示。表 35MCU引脚定义P3.0/RXDTTL输入接文曲星TXD端P3.1/TXDTTL输出接文曲星RXD端3.5.2. 程序代码分析文曲星端的程序在LavaX集成开发环境(LavaXIde)下编写,由于不同型号机型的通讯函数的差异,所以目前的程序是针对TC800而编写的。AT89S52端的软件部分仍在Keil Cx51 V7
24、.0下编写。程序代码见附录三。3.6. 存储卡读写模块3.6.1. 电路连接由于实时存储的数据量比较大(MB10MB量级),外扩存储器是不现实的。故采用SD卡作为存储空间,这样一来,也简化了和PC通讯的电路设计以及通讯软件开发的烦恼,只需PC上装有读卡器即可。SD卡有两种工作模式:SD模式和SPI模式。当工作于SD模式下时,引脚定义如图 316和表 36所示。图 316SD卡引脚图表 36SD卡引脚定义1RSV预留位(Reserved),复位之后为高电平则进入SD模式2CMD命令/响应(Command/Response3VSS1地(GND)4VDD1电源(VCC)5CLK时钟(Clock)6V
25、SS2地(GND)7DAT数据(Data in/out)和单片机SPI协议,连接采用4线(CLK、MOSI、MISO和CS),典型的电路连接如图 317所示。图 317SD卡典型电路其中AT89S52的引脚安排如表 37所示。表 37MCU引脚定义P0.0TTL输出接CLKP0.1TTL输入/输出接MOSIP0.2TTL输入/输出接MISOP0.3TTL输出接CS3.6.2. 程序代码分析软件部分仍然在Keil Cx51 V7.0下编写,函数流程图如图 318所示。SD_Init():开始结束软件复位读OCR寄存器获得硬件标识设置RCA图 318SD卡函数流程图由于AT89S52部包含硬件的S
26、PI,所以采用软件模拟SPI协议。程序代码见附录四。4. 软件部分软件部分的主要功能分为三个部分:第一个部分是数据的处理,在cf卡上读取数据后,将数据优化,去掉错误数据,将数据格式变为:分钟,秒,毫秒,速度,加速度,X,Y 这部分用c语言来编写。其中(X,Y)坐标由速度v,角度 算出。第二个部分是数据的显示,在数据处理完毕后,将数据保存在一个文件中,用数据显示软件读取文件,将数据以折线图的形式显示出来,并将其优化,拟合成为一个更加光滑的曲线,并保存拟合的函数,让分析软件部分分析。第三个部分是数据的分析,在得到拟合的函数后,将函数做导数,分析其拐点与导数为0的点,将其与数据库中的文件进行对比,找
27、出不一样,或差别很大的点,保存在一个临时文件夹中,在用软件读取这个文件夹里的文件内容,对其进行分析,得出结论,也就是需要改进的地方。其中后两个部分使用VB 编写,VB在桌面程序的编写方面有很大的优势,简单,明了,在数据的拟合成为函数,调用M 文件,Matlab完全可以进行函数的拟合,不用再次编写相应的程序来进行拟和函数。其中的难点在于第一个部分的数据处理,(X,Y)的算法很重要,在测量角度与速度后,开始以一只鞋为绝对坐标,对另一只鞋的速度作积分,用角度可以知道鞋子的方向。轮滑一般都是两只鞋交替着地,无论那一只鞋着地,都以那一只鞋为绝对坐标的原点,在记录数据后,对数据进行处理,将数据段与上一个数
28、据段进行连接,得出整个过程的数据。部分VB代码请参见附录五。致 谢在项目的制作过程中得到自动化科学与电气工程学院自动控制协会的大力支持,以及陈胜功老师林新老师指导,温阳同学提供了轮滑鞋,还有曹建秋,欧阳春节等学长的热情帮助,并对项目组成员李观一同学的大量工作,在此一并谨致谢意。参考文献1于永权ATMEL89系列单片机应用技术M北京:北京航空航天大学出版社,2002.42王幸之,钟爱琴,王雷,王闪AT89系列单片机原理与接口技术M北京:北京航空航天大学出版社,2004.53徐爱钧,彭秀华Keil Cx51 V7.0单片机高级语言编程与Version2应用实践M 北京:电子工业出版社,2004.6
29、4苏瑞, 韩中孝著Visual Basic开发实用编程200例M 北京:中国铁道出版社,20065马忠梅,籍顺心,张凯著单片机的C语言应用程序设计M北京:北京航空航天大学出版社,19996日汤山俊夫数字电路设计与制作M 北京:科学出版社,20057林凌,李刚,丁茹,李小霞新型单片机接口器件与技术M 西安:西安电子科技大学出版社,2005.18徐子力,吕恬生,费守勇双足交替支撑轮滑步态的实验研究J 机械设计与研究,2006.129SDA Seminar Technical PresentationR 台北:2003.910SD Memory Card SpecificationsS SD Gro
30、up(MEI, SanDisk, Toshiba),2000.311Adam Chapweske 著,Roy Show译PS/2技术参考Z2002.1112Vishay TelefunkenHS0038B使用说明Z2005.1213Texas InstrumentsNE55,NE555Y,SA555,SE555,SE555C PrecisionTimersZ14Microsoft CorporationMicrosoft Extensible Firmware Initiative FAT32 File System SpecificationS 2000.12附 录附录一红外定位模块源代码/
31、* 头文件 */#include /* 端口定义 */sbit HC138E=P14; /74HC138门控位sbit HC138A=P15; /74HC138输入位sbit HC138B=P16;sbit HC138C=P17;sbit RecvPort0=P00; /红外接收头输出位sbit RecvPort1=P01;/* 全局变量定义 */unsigned char InfrCnt; /红外发射计数unsigned char InfrCode; /74HC138输入值unsigned char RecvCnt; /红外接收计数(高4位:RecvPort1,低4位:RecvPort0)/
32、* 函数声明 */void Infrared_Init();/初始化红外定位模块void Infrared(void) interrupt 1; /红外定位模块中断函数void Infr_Receive ();/处理红外接收函数/* 函数原形:void Infrared_Init();* 函数功能:初始化红外定位模块。*/void Infrared_Init ()EA=0; /关中断TR0=0; /停止定时器T0InfrCnt=0x0f; /装入发射计数初值InfrCode=0x07; /装入74HC138输入值RecvCnt=0x00; /装入接收计数初值TMOD=0x02; /设置定时器T
33、0为8位自动装载模式TH0=0xf4; /设置定时器T0自动装载的初值TL0=0xf4; /初始化过程中需手动装载初值ET0=1;/T0中断使能TR0=1; /启动定时器T0EA=1;/中断总禁止位使能/* 函数原形:void Infrared() interrupt 1;* 函数功能:红外定位模块中断函数。*/void Infrared(void) interrupt 1/定时器T0中断if(InfrCnt-)/红外发射计数HC138E= InfrCnt&0x01; /写P1.4HC138A=InfrCode&0x04; /写P1.51.7HC138B=InfrCode&0x02;HC138
34、C=InfrCode&0x01;Infr_Receive ();/处理红外接收函数elseInfrCnt=0x0f; /重置红外发射计数if(!(InfrCode-)/74HC138输入值InfrCode=0x07; /重置74HC138输入值/* 函数原形:void Infr_Receive ();* 函数功能:处理红外接收函数。*/void Infr_Receive()if(InfrCnt=0x0f)/调用数据存储函数RecvCnt=0x00; /红外计数清零elseif(!RecvPort0)RecvCnt+;/低4位计数if(!RecvPort1)RecvCnt= RecvCnt+0x
35、10; /高4位计数附录二地面接触检测模块源代码/* 头文件 */#include /* 端口定义 */sbit TCL0=P10; sbit TCL1=P11;sbit TCR0=P12;sbit TCR1=P13;/* 全局变量定义 */unsigned char TC_Pointer;unsigned char TC_Buffer8;/* 函数声明 */void TC_Init();void TouchCheck();/* 函数原形:void TC_Init();* 函数功能:初始化地面接触检测模块。*/void TC_Init()unsigned char i;TC_Pointer=1
36、6;for(i=0x00;i0x08;i+)TC_Bufferi=0;/* 函数原形:void TouchCheck();* 函数功能:地面接触检测模块。*/void TouchCheck()unsigned char tmp;tmp=TCL03|TCL12|TCR01|TCR1;if(TC_Pointer-)TC_BufferTC_Pointer/2= TC_BufferTC_Pointer/24|tmp;else/调用数据存储函数TC_Pointer=16;附录三文曲星通讯源代码/* 头文件 */#include #include /Cx51的标准I/O函数库/* 端口定义 */* 全局变
37、量定义 */unsigned char WQX_SBuffer8; /发送缓冲区unsigned char WQX_Pointer; /发送区指针/* 函数声明 */void WQX_Open();/初始化串口通讯模块void WQX_Send() interrupt 4;void WQX_Close();/* 函数原形:void WQX_Open();* 函数功能:初始化串口通讯模块。*/void WQX_Open()WQX_Pointer=0;EA=0; /关闭中断SM0=0;SM1=1; /设置为标准异步通信方式REN=1; /允许接收TI=0; /清除发送中断标志位RI=0; /清除接收中断标志位ES=1; /允许串行口中断ET0=0;/关闭T0中断使能ET1=1;/T1中断使能TR1=0; /停止定时器T1TMOD&=0xf0;TMOD|=0x20; /设置定时器T1为8位自动装载模式TH1=0xfd; /设置波特率为9600TR1=1; /启动T1EA=1; /开中断/* 函数原形:void WQX_Send() interrupt 4;* 函数功能:发送数据*/void WQX_Send() interrupt 4TI=0;SBUF=WQX_SBufferWQX_Pointer+;if(WQX_