相关体育教学论文

3D无线鼠标的优化算法科学研究

发布时间:2019-11-29 19:11

  摘要

  随着PPT演讲的流行,演讲者几乎人手一个激光翻页笔。但是因为投影设备的进步以及PPT功能的增多,传统的激光翻页笔在会场、教学等场景就有了它的局限性。比如,激光射束在相对较亮的液晶或LED屏幕上显得很不明显,不易识别。同时它对音频视频播放,画笔的实现,重点标注等的功能显得无能为力。

  此时3D无线鼠标应运而生,但是目前市面上的3D无线鼠标在使用时,仍然存在一些问题:首先是不灵敏,有滞后感。其次是不准确,存在漂移的问题。最后是功能比较复杂,设计不人性化,存在按键过多的情况。

  本论文主要针对目前3D无线鼠标出现的四个问题进行分析以及提出解决方案:如何实现鼠标跟随手的移动而移动?怎样减小滞后感?怎样降低漂移感?以及人性化的功能怎么实现?

  本文的研究内容包括3D无线鼠标的实现,姿态算法的优化以及自定义功能的实现。首先进行3D无线鼠标相关硬件的软件配置与结构设计,然后根据手持场景进行姿态解算的优化,降低漂移感和滞后感,最后实现一些便于PPT控制的功能,在此基础上配合低成本的硬件,实现低功耗。

  关键词:无线鼠标,激光翻页笔,姿态解算

  课题背景

  随着PPT演讲的流行,几乎人手一个激光翻页笔,但是因为投影设备的进步以及PPT功能的增多,传统的激光翻页笔在会场、教学等场景就有了它的局限性。比如,激光点在液晶或LED屏幕上显得很暗,不易识别。同时它对音频视频播放,画笔的实现,重点标注等越来越多的功能显得无能为力。但是随着时代的发展,PPT的功能只会越来越绚丽,演示器里丰富的功能也越来越重要,而这些很多都离不开鼠标指针的基本功能。

  3D无线鼠标是利用一些传感器,获得鼠标在三维空间中的移动轨迹或者角度变化,通过无线传输的方式将数据传输给PC端,如此来实现鼠标键盘等复杂的功能。因为它可以脱离桌面的限制而在三维空间中运动,所以也被形象的成为空中飞鼠。

  Alan H. F. Lam等人研制出基于二维加速度计的虚拟键盘鼠标系统[1], 操控者只需将加速度计装在指环上,数据信息就可以通过戴在手腕上的无线传输模块传送至电脑,然后通过解析和显示的软件实时解算这些数据,最后完成输入控制。这个方案比较久远,目前来看,大部分的空中飞鼠采用的类似这种方案。只是把加速度计换成了六轴传感器,比如周获制作的无线空中鼠标[4]。

  然而接下来无线空中鼠标的痛点就集中在了鼠标轨迹上。起初,是利用加速度二次积分,偏移非常的大,例如王海红设计的三维鼠标[5],也有利用加速度的数据计算鼠标的翻滚角,来对应鼠标的位置,这样做出来的效果体验感并不好。后来的3D无线鼠标大都用上了陀螺仪,情况才有所改善,比如罗技的MX Air利用两轴陀螺仪进行控制,实际效果就已经很好了。现在用上了六轴传感器之后姿态算法更加精确,轨迹也更加准确。

  但是低端产品滞后感以及漂移感依旧存在,因此有不同的传感器的出现,比如基于视频采集的方案,刘刚开发的激光笔辅助教学系统[6],是通过识别投影屏幕上的激光点的位置,来确定鼠标的位置,这样可以达到像鼠标一样指哪点哪的操作体验,但是系统的便捷性和成本限制了这种方案的发展。赵士龙发表的无线手持控制器[2]是借助触控屏来移动鼠标指针的,想法比较新颖,但并不实用。

  另外3D无线鼠标并不是只有鼠标的功能,最大的需求还是在它功能的实现上,但是纵观淘宝,空中飞鼠的产品有些就把键盘直接移过去,或者按键繁多,演讲紧张的环境,按错一个怎么办,甚至实现一个画线功能甚至要多个按键实现,我们需要人性化的功能,让每个按键都变得更加自然实用。罗技 Spotlight 无线演示器[3]在这方面做得很好,但是价格很高。当然我们希望实现的功能不止这些,各行各业也有着不同需求,因此功能方面我们需要更多的创新。

  对此提出了以下四个问题,怎么实现鼠标跟随手的移动?为什么又会有滞后感?为什么会有漂移感?人性化的功能怎么实现?

  本文的研究内容与意义

  本文的意义是为了解决以上四个问题,首先如何实现鼠标跟随手的运动。一个方案是检测手的轨迹,但是事实证明加速度计的数据并不可靠,同时目前的算法并不能将轨迹完美的还原,如果想要达到较好的体验,需要达到毫米级别的轨迹识别,这并不现实,经过调研本文认为可以尝试增加传感器,比如光流传感器可以更加精确直观的获得二维平面上的移动,但是目前并没有人尝试,由于镜头较大,考虑到系统的便携性,本文并不考虑第一个方案。另一个方案是,将手运动时设备的航向角和俯仰角速度映射为垂直平面上X,Z轴的速度,由于手持设备的运动一般都是绕着一个支点,比如手肘或者手腕,在半径不变的情况下,角速度和运动速度成正比。但是缺点是,其实半径会有较小的变化,所以不同的姿势灵敏度不同,不是按照真实轨迹,手感来说并没有第一种方案真实。但是由于陀螺仪的数据很准确,得出来的角速度很可靠。因此本文采用这种方案,并在本文介绍具体的实现过程。

  然后是滞后问题,滞后问题需要系统的考虑,首先传感器采集,传感器数据本身是否有滞后,传感器数据的采集是否不及时,其次是数据处理,算法处理也需要时间,我们怎么减少计算时间?本文采用两个方案,一是简化算法,二是将算法分解,分别在姿态算法和数据采集与传输章节进行详细说明。最后是数据传输,由于是无线传输,存在接收的不稳定性,例如没有接收到,需要重新发送,可以减少重新发送的间隔时间;数据接收不稳定,经常接收不到,就会缺少一些数据,同样会造成滞后。

  接下来是漂移感,由于第一个问题的考虑,我们采用的方案会和真实的轨迹有出入。但这并不是造成主要的原因,更大的原因是我们并不能精确的知道鼠标相对于水平面的倾角。加速度计测的是手运动的加速度加上重力,用来测量重力方向必然不准,而陀螺仪测到的只有角速度,具体的角度需要积分,但是积分会有累计误差,时间一长就不准了,因此需要参考四旋翼的姿态算法。但是四旋翼算法是趋于稳定的,而手持鼠标一直是晃动的,这个时候我们就需要根据手持场景对姿态算法加以优化。

  最后是人性化功能的实现,首先我们需要按键去实现各种功能,但是按键在按下的过程中抖动很厉害,因此需要消抖,但是又必须要能够很快的和拖拽动作区分开来。其次,按键过多会带来繁琐的操作,因此本文希望用更少更简洁的按键达到想要的功能。这就需要区分按键的单击,双击,长按等操作。最后我们希望我们做的3D鼠标可以控制电脑,这个时候有两种方案,一种方案是电脑可以自动识别设备,并实现我们的功能;另外就是用上位机接收数据,用PC端软件的方法去实现我们需要的功能,但是第二种方案需要安装驱动,编程复杂且操作不方便,因此我们采用的第一种方案。本文在第三章和第五章介绍了具体的实现方法。

  另外对于一个手持设备来说,一般用电池供电的,经常换电池是很麻烦,即使用锂电池,经常充电一样很麻烦,但是如果能够将休眠时功耗做的很低,例如休眠时电流10μA,一节5号电池的容量是2000mAh,也就是电量在休眠状态可以持续20年,不仅如此,我们同时也要减少工作时的电流,这些需要软硬件的联合设计,本文主要研究软件部分,具体内容见第二章的低功耗设计。

  因此本文的研究内容主要包括3D无线鼠标的实现,姿态算法的优化以及自定义功能的实现。而3D无线鼠标功能的实现,需要数据采集,无线传输,以及USB接口的支持,我们需要根据数据手册完成相关配置。姿态算法的优化,需要我们去比较其他常用算法,并进行优化并简化实现步骤,最后进行试验比较。自定义功能的实现需要我们解决按键抖动,按键状态判断以及所需要实现的功能。

  本文的主要结构

  第一章:绪论。主要分析了3D无线鼠标发展过程以及现状,介绍了选题的背景并提出四个问题,接着给出论文的研究内容和主要结构。

  第二章:数据采集与传输。本章将从芯片配置的角度出发,详细分析应该如何采集传感器数据并用MATLAB分析,采集数据的软件框架应该怎么实现,详细介绍无线传输芯片的工作模式及使用方法,提升数据传输的稳定性,最后是如何实现最大限度的实现传感器芯片和无线传输芯片低功耗。

  第三章:USB接口的实现。本章将从如何实现USB设备的角度出发,详细介绍USB设备各种配置的原理以及过程,应该如何实现自定义USB接口的功能,最后能够实现模拟按键的功能。

  第四章:轨迹算法研究及优化。在充分了解姿态解算的实现原理的基础上,对常用的四旋翼的姿态解算算法进行分析和比较,结合手持设备的特点,简化并优化姿态算法。通过试验比较本文所用算法的优势。

  第五章:组合功能实现。本章将从功能实现的角度出发,首先优化按键的消抖,同时不影响鼠标拖拽的功能;其次优化按键状态的判断函数,使它能够更容易的实现更多功能。最后就是能够实现功能的具体介绍。

  第六章:总结与展望。总结和介绍本文所做的工作内容以及本文的创新点。指出本文的不足,提出修改意见和改进方向。

  数据采集与传输

  数据采集传输平台介绍

  如图2-1,这是3D无线鼠标硬件系统的大致框图。本文的数据采集平台就是基于这个平台,分别由集成六轴运动跟踪芯片MPU6050[10],微控制器以及无线传输模块组成。这块传感器芯片具有陀螺仪和加速度计以及内部数字运动处理器(DMP)。在手持端利用陀螺仪,可以得到欧拉角的角速度,利用加速度计,得到的是实时的加速度。再通过微控制器实时采集,并利用无线发送模块将数据发送出去。USB端则通过无线接收模块接收,接着通过微控制器控制电脑的操作,同时将传感器数据通过串口发送到电脑上,以便进行分析。

  采集出数据不能直接进行分析,我们可以将它导入到MATLAB中,然后更加方便具体的比较各种算法的实现。串口是最常用的方案,我们需要先把传感器数据转成字符串的形式,以一定的格式发送出去。注意,采样的数据一定要在这个采样周期内发送,否则,可能几个采样周期才发送了一次数据,造成数据的缺失,因此我们最好将波特率调至921600bps,波特率再高的话,数据接收会有误码的情况。

  如图2-2,这是电脑接收串口数据的效果截图,把传感器数据按照表2-1的格式保存成TXT文件。MATLAB中只要调用importdata函数就可以进行数据储存和使用。

  数据陀螺仪俯仰角速度陀螺仪翻滚角速度陀螺仪偏航角速度按键情况加速度计X轴加速度计Y轴加速度计Z轴传感器的量程有四档可选,需要估测传感器需要的量程,平时的运动既不能超过量程,量程又不能过大,造成精度降低。本文经过实验,选择了陀螺仪±500dps以及加速度计±4g的量程,查阅手册[11]得到,此时陀螺仪精度是65.5LSB/(o/s),加速度计精度是8192LSB/g,一般来说计算中需要将角速度化成rad/s,那就需要将陀螺仪得到的数据进行单位换算,需要将数据乘(1/65.5)*(2π/360),也就是0.00026646,就可以转换成rad/s。而加速度计则除以8192就是以g为单位了。

  接下来本文分析一下传感器数据本身是否有延时。从表2-2我们可以看到,传感器芯片的采集延时和数字低通滤波器有关系,当带宽越大,延时越小。为了使数据采集延时更短,要让数字低通滤波器的带宽越大。但是当带宽为260Hz时,我们可以看到,加速度计没有任何的延时,而陀螺仪却有接近1ms的延时,这意味着我们处理的数据并不是同一时间采样的,同时FIFO的配置也会存在问题,可能会对我们的姿态解算带来不确定的问题,因此,我们选择将数字低通滤波器寄存器配置为1,这样加速度计和陀螺仪的数据几乎是同步的,此时读出的数据和实时的数据有2ms的时差。这可以帮我们计算整个系统的延时。

  这样的好处是可以降低主控芯片唤醒的频率,从而降低系统功耗,同时可以提高算法一次处理的数据,提升算法执行的效率,缺点是处理并不及时,可能会有滞后感。

  MPU6050包含一个1KB的FIFO寄存器。FIFO配置寄存器可以选择陀螺仪数据、加速计数据、温度读数、辅助传感器读数和FSYNC输入中的一个或者多个写入FIFO。 FIFO计数器会记录FIFO中包含的有效数据字节数。可以利用中断功能确定数据是否更新,并支持burst读取。利用FIFO我们甚至可以同时读取其他有IIC控制的芯片数据,大大减小了系统的复杂性。

  我们需要配置寄存器把FIFO打开,首先在USER_CTRL寄存器中打开FIFO的使能,然后在FIFO_EN寄存器中选择我们需要的数据,接着利用定时器定时读出FIFO_R_W寄存器中的数据:此时需要判断FIFO中的数据量FIFO_COUNT,如果数据量不等于一个周期应该采集到的数据,说明我们这次的采集是有问题的,从下个周期重新开始,我们需要将FIFO清零,这个时候我们必须先在USER_CTRL寄存器将FIFO使能关闭,然后将FIFO清零,如果正好等于一个周期应该采集的数据,那么我们就直接读出。

  我们最后计算一下这个方案数据的滞后时间,由于定时器采集并不清楚数据更新时间,如果设置为8ms读取一次数据,那么这个数据采集的滞后时间就是0到8ms,接下来要进行FIFO读取、清零、算法处理、发送数据,我们可能会滞后达十几毫秒。可以通过缩短读取周期来减少滞后。

  方案二、利用外部中断,读取FIFO

  这种方案延时较少,数据也可以集中处理,提高效率。如表2-3,我们采样周期设置的为1kHz,也就是1ms一个采样周期,我们四个采样周期进行一次算法处理。每当采样一次之后进入中断进行判断,如果次数可以被4整除,那么读取FIFO数据,然后对FIFO进行重置,以接收下面的数据,然后对上个周期的数据进行算法处理,最后发送数据。这种方案属于定时器读取的改进版,如果算法处理很简短,那么就可以采用方案三。

  表2-3 FIFO数据采集与处理流程

  时间(ms)12345678910

  触发周期判断周期一:外部中断计数4次周期二:外部中断计数4次…

  系统流程…读取周期一的FIFO数据FIFO清零算法处理发送读取周期二的FIFO数据…

  方案三、利用外部中断直接读取数据

  这种方案的优点是程序简单,处理速度快,延时很短;缺点也很明显:如果传感器输出频率很高,那么定时器中断的每个周期时间都很短,而一个周期不足以设置无线发送,可能会缺少数据。另外算法不能过于复杂,如果一个周期没有处理完成,会拖累下个周期的处理。

  如表2-4,这种方案软件处理的延时可以大大缩短,将算法处理分割到每个中断触发之后去处理,理论上前4毫秒动作,滞后的时间只有第4步算法处理的时间加发送时间,可以控制在2ms以内。由于发送时间较长,加上第四步算法处理,已经超出了一个周期的时间,我们需要考虑中断是否会打断数据发送。而无线传输芯片使用硬件SPI控制的,不会受到影响,所以本文采用的这个方案。

  表2-4 本文采用的数据采集

  时间(ms)123457

  触发中断中断中断中断中断中断

  系统流程算法处理1算法处理2算法处理3算法处理4发送算法处理1算法处理2

  无线传输功能实现

  工作模式的转换如图2-3所示,通过不同的配置方式,可以在不同的状态中转换。本文详细介绍一下发送端和接收端的配置过程:

  1、发送端:

  通过将使能引脚(CE)设置为高电平来启动发送模式。当发送FIFO寄存器中有数据包,无线芯片就会进入发送模式并发送。发送完成后,无线芯片将自动进入接收模式以接收应答数据包。如果收到的应答数据包为空,则只有发送成功中断位被置位。如果应答数据有效,发送成功中断位和接受成功中断位都同时置位返回待机I模式。

  如果在超时发生之前未收到应答数据包,则无线芯片返回待机II模式。如果重发次数还没有达到配置的重发次数(ARC),无线芯片进入发送模式并再次发送最后一个数据包。在执行自动重发功能时,重发次数可以达到最大次数。如果发生这种情况,无线芯片将判断为超过最大重发次数中断并返回到待机I模式。如果CE为高电平且发送 FIFO为空,则无线芯片进入待机II模式。

  其中需要注意的是,我们配置自动重发时,可以配置每次重发之间的间隔,为了让数据传输更加快速,我们将重发间隔调至最短——86us。

  2、接收端:

  通过将使能引脚(CE)设置为高电平来启动接受模式,并开始搜索数据包。如果收到一个数据包并启用了自动确认功能,无线芯片将决定数据包是新的或先前收到的

  数据包的副本。如果数据包是新的,则有效数据在接受 FIFO寄存器中可用,并且接受成功中断位被置位。如果从发射机接收到的最后一个数据包通过带有有效载荷的应答数据包进行确认,则发送成功中断为指示收到带有有效负载的应答数据包。如果接收数据包中没有设置应答标志,则接收端进入发送模式。如果发送 FIFO中有一个挂起的有效载荷,它将附加到应答数据包。发送应答数据包后,无线芯片返回到接受模式。如果应答数据包丢失,可能会收到先前收到的数据包的副本。在这种情况下,接收端丢弃接收到的数据包并在返回接受模式之前发送应答数据包。

  低功耗软件实现

  作为手持便携设备,低功耗的要求十分高,功耗直接决定了使用时间的长短。本文将从软件的角度出发,降低工作时的平均电流,以及待机模式下的电流。主要分为两个部分,传感器的低功耗和无线传输芯片的低功耗实现。

  传感器模块低功耗

  我们可以用传感器芯片实现静止一段时间后进入待机模式,运动之后进入正常模式的功能,来减少系统平时的功耗。以下共有两种方案:

  方案一:主程序中定时检测陀螺仪数据,当小于一定的阈值认为没有动,并在没有动的状态连续保持一段时间,就把主控芯片和传感器芯片设置成低功耗模式,关闭陀螺仪,加速度计的采样频率设置为1.25Hz,让芯片功耗更低,再利用外部中断去唤醒主控芯片判断是否依旧处于静止状态。如果处于静止状态,就继续待机模式。如果检测到运动,就立刻将传感器芯片设置为正常工作模式,主控芯片也从待机模式进入正常的工作模式。

  表2-5 加速度计低功耗电流

  1.25 Hz 更新速率10uA20 Hz 更新速率70uA

  5 Hz 更新速率20uA40 Hz 更新速率140uA

  方案二:采用传感器芯片中断唤醒。首先设置传感器芯片中断来源,加入ZRMOT(zero motion)中断使能。当没有检测到运动就触发中断,中断触发的传感器阈值可以在ZRMOT_THR中设置。中断触发的时间阈值在ZRMOT_DUR寄存器中设置。当检测到ZRMOT中断之后,主控芯片进入待机模式,将陀螺仪关闭,加速度保留X轴,采样频率设为1.25Hz,设置传感器芯片为MOT中断模式,灵敏度阈值可以设置MOT_THR寄存器,时间检测阈值在MOT_DUR中设置。当检测到运动时,产生外部中断来唤醒主控芯片,在休眠状态下不需要频繁唤醒主控芯片,从而达到软件最低功耗,本文采用这种方案。

  虽然,这套方案更加低功耗,但是实现起来比较复杂,需要了解传感器芯片的中断模式。但是芯片手册里并没有具体的内容,厂商并不开放。尝试想用官方的数字运动处理库,但是代码较长,占用较大的flash空间,同时并不能自定义修改。因此参考网站[8]上的资料,他是通过反向工程的方法,推出所需要得寄存器的地址。并阅读Rowberg[9]的代码,了解每个寄存器的作用和使用方法。

  无线传输模块低功耗

  无线传输芯片不同模式下电流消耗如下表2-6所示,需要分为发送和接受两个部分来考虑:

  表2-6 各种模式下平均电流列表

  掉电模式900nA待机I模式26μA

  待机II模式320μA晶振启动平均电流400μA

  发送模式(0dBm)11.3mA接受模式(1Mbps)13.1mA

  1.发送端:

  由于待机I模式比待机II模式低近300μA的电流,因此在3D鼠标工作时,尽量让发送端芯片保持在待机I模式。当鼠标处于休眠状态,向PWR_UP写入0让发送端芯片处于掉电模式,唤醒时只需要向PWR_UP写入1,晶振启动时间为1.5ms,可以忽略。

  由于NRF24L01+一旦发生中断,IRQ引脚拉低,正常想法是将IRQ作为中控芯片的外部中断输入口。检测下降沿,并在外部中断处理程序中检测然后清除中断标志位。但是实际效果不能让人满意,发送成功率较低,并且会出现中断没有检测到的情况,因此不采用。

  本文采取的方法是,设置定时器,一段时间后检测IRQ的电平。如果依旧是高电平,就是仍然在发送,如果低电平了,从中断状态INT_STATE判断上一次数据接受成功,还是超出了最大发送次数,如果是超过了最大发送次数,说明发送不成功,上一次的数据跳过,清除FIFO,这样的数据发送成功率很高,并且提高了稳定性,不会出现一段时间后中断检测不到的情况。

  2.接收端:

  由于不清楚发送端何时发送数据,我们需要一直把芯片设置在接收模式下,当接收到数据后,IRQ引脚拉低,我们可以将IRQ引脚作为外部中断,下降沿触发,仅有当接收到数据才唤醒接收端的主控芯片,这样降低接收端的功耗。

  USB功能实现

  USB简介

  本文采用USB的方案去实现3D鼠标的功能,因此需要了解USB的实现过程。USB(Universal Serial Bus)[12]是一个很常用的总线标准,用来规范电脑与外部设备的连接和通讯,支持外部设备的即插即用和热插拔功能。最多支持127个USB设备,是最通用的电脑接口。

  USB的系统构成分为主机,设备和物理连接三个部分。在本文中主机指的是PC端,设备是3D无线鼠标,物理连接就是USB线,本文使用的USB2.0是四根线,一个是电源线,一个是地线,中间两根线使用差分信号传输数据。

  为了更好的描述USB设备的特性,USB提出了设备构架的概念。如图5-1所示,USB设备由一些配置,接口,端点组成,每个框架下都有对应的描述符。一个设备只能有一个描述符,可以描述设备的总体信息,如名称,厂商等。一个USB设备可以包含多个配置,比如配置设备的低功耗模式。而一个配置可以包含多个接口,每一个接口都有接口描述符,比如说存储接口,音频接口。接口是多个端点的集合,而端点是USB设备中实际物理单元,决定了与主机通信的传输类型。

  USB描述符的具体设计

  在本节具体介绍一下USB各种描述符的设计。最先定义到的是设备描述符,设备描述符只是编写设备信息,比如说设备名称,厂商名称,USB版本号,本论文将设备名称设置为” 3D MOUSE ” ,USB版本用的是2.0,由于采用的STM32的芯片,因此厂商是STMicroelectronics。

  接下来就是编写配置描述符,我们有两种方案去实现键鼠的功能,首先是采用复合设备的方案,让USB识别成键盘加鼠标的模式,另一种方案是用自定义HID(人机交互)的方法,自己去定义一个鼠标和自定义的键盘。相比于第一种方案来说,第二种方案更加复杂,但是自定义的功能更加丰富,发送的数据更加简洁,还可以获取来自PC端的信号。

  首先,我们传输的时候需要告诉USB设备,每个描述符的长度,来判断那些每个描述符的范围,因此我们的每个描述符定义之前都需要定义描述符的长度。接下来就是定义描述符的类型,用来告诉主机这段描述符是哪种描述符,我们一开始是配置描述符,通过查找表格[13]获取对应的数据。接着定义这串描述符的总长度,这个总长度需要写完所有的描述符才能确定,因为本文定义的描述符是41个字节,因此定义0x29。接下来配置基本信息,由于本论文使用的是CUSTOM HID,因此一个接口就够了。配置字符串描述符描述配置的索引,以及供电要求,我们按照最常用来配置。

  然后需要描述接口,依旧是一开始定义描述符长度,以及接口描述符类型,由于一个配置里可能有多个接口,因此,要告诉主机这是第几个接口,我们只需要用一个接口,就第0个接口。我们希望可以把数据发送给主机,同时也可以接受到主机的数据,所以设置两个接口。将接口设置为CUSTOM HID,开机进入boot界面是不启用。接下来定义CUSTOM HID描述符,主要是定义的国家和报告描述符的长度。

  最后是定义端点描述符,选择一个输入和一个输出的端点,以及定义发送数据的长度和轮询间隔(发送的频率)。这个是由具体的功能决定的。

  USB自定义功能实现

  我们需要实现的功能包括鼠标和部分键盘的功能,通过模拟键盘方式可以实现一些快捷键。报告描述符的作用就是告诉主机,发送的每个数据的作用。

  如表3-1,我们每隔4ms发送一帧数据,先发送ID为1的数据,用来控制鼠标,再发送ID为2的数据,用来自定义按键,如此循环发送,可以实现自定义键鼠的功能。首先需要定义一个数据的功能,可以查找表格[13],比如鼠标指针在Generic Desktop功能列表中的Mouse中,按键在Button功能列表中的Button 1-3,其次设置报告符的ID,可以将HID的功能分为几个部分,然后传送某个功能的数据最大值和最小值。再次,设置数据的长度与个数。长度就是实现某个功能所需要的数据长度,个数是这串数据可以实现功能的个数。接着,设置数据输入输出的类型,告诉主机,这些数据是输入还是输出,是变量还是定值等。最后以COLLECTION和END_COLLECTION结束。

  模拟按键的方法:设置倒数计数器,每个定时器周期减1,在计数器不为0的时候发送相应的自定义HID数据,这样就模拟了按键一段时间。如果只发送一次HID数据,或者按键时间过短,可能导致主机捕捉不到按键按下。

  1、 欧拉角

  欧拉角是用来表达姿态旋转的最简单直观的一种方式,描述了物体绕坐标系三个轴(x,y,z轴)的旋转角度。绕x轴旋转是俯仰角θ(pitch),绕z轴旋转是偏航角ψ(yaw),绕y轴旋转是翻滚角Φ(roll)。可以通过二维旋转公式以及矩阵的乘法,推出坐标系旋转矩阵:

  有两个缺点,一是由于存在多个坐标值对应同一个位置,可能会导致万向节死锁。二是这里正弦余弦值较多,运算较复杂。

  2、 四元数[15]

  四元数定义为超复数: 它的运算规则在这里就不详细介绍了,可以用四元数表示坐标系的旋转。

  由于这个矩阵里不包含正弦余弦值,计算效率比较高。更重要的是四元数的旋转不存在万向节锁问题。不过接下来我们可以简化一下3D无线鼠标的姿态。

  其实四元数就是为了解决三维空间内的旋转,而3D无线鼠标水平和垂直两个方向上的运动情况根本不需要加速度计去校正,所以其实姿态解算只需要得到3D无线鼠标的滚转角ψ,但是用欧拉角的方法需要计算sin ψ和cos ψ,这就需要用到泰勒公式,运算中带来了很多的乘法,造成了效率低下。我们可以用复数的思想去构造,如在旋转ψ的基础上继续旋转θ,其e1,e2分别表示旋转了ψ和θ。用复数很方便地表示出二维矢量的旋转变化,这样以来,在接下来的运算里不需要带入角度,简化了很多运算。

  同时由于在四旋翼的姿态算法中,加速度计会对偏航角和俯仰角造成干扰。为了减少加速度计偏航角和俯仰角的影响,本文采取的方案是完全相信陀螺仪来确定偏航角和俯仰角的角速度,只对翻滚角进行解算。

  常见姿态算法比较

  1、MPU6050的数字运动处理器(DMP)

  MPU6050自带一个数字运动处理器,可以减少主机处理器的时序要求和处理能力。它自动获取加速度计和陀螺仪的数据,计算出当前姿态的四元数,大大简化了微处理器的压力,但是通过查阅手册,发现使用DMP后,数据采样率较慢,滞后感严重,初始化时间较长,另外就是内部算法并不开源,不好改进,只能得到结果。

  MPU6050中陀螺仪的采样速度[10]=陀螺仪输出速度/(1+SMPLRT_DIV)。但是当DMP开启时,陀螺仪被设置在200Hz,并不允许修改。当DMP关闭时,陀螺仪采样速率可以最高到8kHz,这取决于MPU设备规格。当数字低通滤波器关闭时,陀螺仪输出速度可以到8kHz,但是数字低通滤波器关闭时,采样率最多为1kHz。如果采样速度超过1kHz,相同的加速度数据可能输出到FIFO, DMP, 传感器寄存器等等,因此不能超过1kHz。而采样频率也影响了算法的收敛速度,经过测量,从初始化到稳定要近8秒的时间,这个方案收敛速度较慢,因此本论文不采用这个方案。

  2、互补滤波

  加速度数据测到的不仅仅是重力,但测得的加速度会在重力周围波动,因此趋势是对的,我们可以用数字低通滤波器,滤除高频噪声。而角速度比较准确,但是积分会产生累计误差,因此使用数字高通滤波器,滤除低频噪声,采样时间越短积分值越精确。把两个数据的优点结合,用权重的方式得到一个相对准确的值。一般来说,二阶滤波的效果会比一阶滤波好,因为通带和阻带之间存在一个过渡带,而二阶滤波过渡带更小一些。同时截止频率可以根据采样的频率来设置,当阶数增加时可以选择不同滤波器的设计方式,比如说凯撒窗,汉明窗等,可以得到更好的滤波效果,但是也更加复杂,但是更容易用数字电路的方式去实现。

  3、卡尔曼滤波[15]

  卡尔曼滤波(也称为线性二次估计(LQE))是一个最优化自回归数据处理算法,利用状态方程对下次的状态进行估计,根据估计量和测量值的概率分布,以概率最大的状态作为最优值。因此,卡尔曼滤波可以分为两个部分,时间更新方程和测量更新方程。时间更新方程是用来根据状态方程推算状态变量和误差协方差的值,以便为下一个时间状态构造先验估计;而测量更新方程负责反馈与校正。

  卡尔曼滤波缺点就是计算量比较大,但是如果状态方程构造的比较好,卡尔曼滤波的实时性和精确性最好。但是从实验的结果来看,和Mahony互补滤波的结果差不多,但是计算量大很多。

  4、Mahony互补滤波[16]

  由于加速度计测量的不仅仅是重力加速度,还有手运动的加速度,因此加速度计的静态稳定性较好,而在运动时其数据相对不可靠,但是大致方向是对的;陀螺仪的动态稳定性更好,但是静止时数据相对不可靠,不运动也会有噪声的存在。所以,我们可以通过加速度计的输出来修正陀螺仪的漂移误差,对陀螺仪和加速度计得出的角度误差用比例积分的方法逐步收敛误差。本文采取了这种方案,并加以简化。

  同时文献[14]提供了一个自适应增益控制的方法。根据加速度计的幅度和重力g比较,根据比例的不同,用一个分段函数去构造一个增益函数。但是由于手的加速度方向并不确定,存在合加速度的大小和重力加速度的大小相近的可能性。因此本文并在此基础上进行优化,用更加准确的陀螺仪来确定增益,下面在实现步骤中具体介绍。

  姿态解算实现步骤

  1. 获取角速度ω和加速度a,详见第二章。

  2. 根据陀螺仪计算得到的角加速度估计水平方向的加速度的大小,确定比例增益Kp和积分增益Ki的大小。

  由于手持设备和四旋翼使用场景不同,有着手持的特殊性,可以近似为绕着一个支点(比如手腕,手肘)的圆弧运动,在很短的时间内可以认为半径不变,因此3D无线鼠标受到的加速度可以分为向心加速度,切向加速度和重力加速度。向心加速度与鼠标的Y轴平行,并不影响翻滚角的测量。Z轴方向上的切向加速度与重力加速度平行,不会对重力方向造成影响。但是当在X轴方向做加速运动,切向加速度会与重力加速度垂直,加速度的方向和重力方向并不平行,而Mahony互补滤波是利用加速度计数据计算重力方向的,这样会严重的干扰对重力方向的判断,因此我们需要降低此时加速度计的增益。

  具体增益调节的过程:当水平加速度很小时,处于稳定状态,可以降低比例因子Kp让姿态角更加稳定,当水平加速度较大时,不能完全舍弃加速度计,否则可能会不收敛,导致轨迹完全由陀螺仪决定。我们需要降低增益,尤其需要降低比例增益Kp,而积分增益可以告诉我们在一段时间之后的总体情况,因此最好不要降到0。当水平加速度更大时,此时的加速度计的数据就不可信了,我们可以忽略,因为这么快的加速度,对于手持设备来说不会持久,所以可以不用担心收敛的问题。而做圆周运动的半径不同,影响也很大,因此需要多测数据观测规律。

  这个误差是上一次陀螺仪得到的姿态估算的重力和此时实际加速度测出的重力的差距。这里用叉积来表示两个矢量之间的误差,实际上的叉积是两个向量夹角的正弦,而且必须在±90度以内,并不完全与误差角度成线性相关。这个修正对于误差来说是收敛的,所以误差会越来越小。而正弦又可以通过和差公式拆解成估计的翻滚角和加速度计测量的翻滚角之间的关系。

  为这次陀螺仪的数据,Kp为调节误差比例的增益。可以根据不同的情况,调节增益,类似比例积分控制里的比例控制,In是误差的积分。

  8、根据一阶龙格库塔法得出估计的重力矢量dn龙格库塔(Runge-Kutta)方法是一种应用广泛的高精度单步算法,可以用于数值求解微分方程,本文利用它进行积分,更新重力矢量。在这个方程就是步长。融合出的重力矢量和姿态角翻滚角ψ存在着一定的关系,d=cosψ+isinψ,写成矩阵的形式就是

  9、归一化d

  上一步融合出的d并不是单位向量,不能够继续执行算法,因此需要归一化。

  10、重复步骤1

  具体核心代码可以参考附录一。除去归一化所需要的必要步骤,姿态解算部分只用了九次乘法,执行效率非常的高。

  实验分析与比较

  在本节中,本文尝试评估增加了自适应增益的姿态算法的性能。由于卡尔曼滤波等算法姿态解算出的结果和互补滤波得到的结果的差距很小,我们用Mahony互补滤波代替传统的四旋翼姿态解算算法。本文通过两个实验,将传统Mahony互补滤波得到的结果,和增加了自适应增益的互补滤波得到的结果进行比较

  本节实验,主要是将Mahony互补滤波算法和本文姿态算法解算出的姿态角进行实时对比。实验数据是通过手顺时针画圆得到的,实验刚开始的姿态角和实验结束时的姿态角是相同的。

  由于本文没有仪器去实时的测量姿态角,所以通过比较不同曲线的趋势去分析结果。在图4-1中,绿色的曲线是加速度计得到的姿态角,红色的曲线是陀螺仪得到的姿态角,蓝色的曲线是采用Mahony互补滤波得出的姿态角,黑色的为本文采用的算法得出的姿态角。

  本实验的条件开始和结束的姿态角相同,从图中可以看出,陀螺仪(红线)得到的姿态角从1.60 rad的位置起始,到1.62 rad的位置结束,可以看出存在漂移,漂移量为0.02rad。加速度计(绿线)得到的姿态角开始和结束时都是在1.60 rad,不存在漂移。另一方面,陀螺仪(红线)得到的姿态角曲线噪声很小,加速度计(绿线)得到的姿态角噪声很大。所以姿态算法需要结合两者的优点。

  从图中可以看出,Mahony互补滤波和本文的算法都很好的控制了姿态角积分的漂移,曲线比较平滑,噪声控制较好。而Mahony互补滤波相对于本文采用的算法来说,在某些动作(如在采样次数为250-300次)时,受到加速度噪声的影响更大,因此在图中体现出来的是姿态变化的滞后性。比如在实际情况中,当水平运动加速度较大的情况下,姿态角会因为加速度的噪声而漂移严重。根据对实验数据的分析,初步得出这就是漂移感的原因的结论,下面的实验将对轨迹的漂移现象更好的呈现。

  高非重力加速度实验

  本文利用快速的水平循环移动代替专业的高非重力加速度实验,水平循环移动能够让水平方向上的加速度很大,从而达到了高非重力加速度的要求,我们可以用这个实验去测试它的动态特性。实验数据是用手在水平方向上反复移动得到的,并保持姿态角基本不变。但是由于手部运动并不统一,有一定的噪声影响,因此描绘出来的轨迹并不是标准的直线。

  图4-2是用不同的算法,将每次处理后计算出的位置描绘出来,可以显示鼠标的运动轨迹。红色的曲线是用陀螺仪原始数据画出的未量化的轨迹,因为不受加速度的影响,短时间内偏移并不严重,理论上我们可以将它作为参考标准

  如图4-3,加速度计测量的加速度是水平加速度和实际重力加速度的合加速度,当水平移动较快,水平方向上的加速度大小较大时,水平方向上的加速度不能够忽略。而Mahony互补滤波认为加速度测量的只是重力加速度,因此导致算法估计出的重力方向和实际的重力方向有偏差,如果不降低此时加速度计数据的增益,会使轨迹向上偏移。从图4-2看出原始的Mahony互补滤波(黄线)偏移很严重,画直线都会向上翘,同时也可以很明显的看出本文的方法得出的轨迹更加不容易向上漂移。

  图4-4显示的是在水平移动的过程中不同的算法解算出来的姿态角,红色的曲线是陀螺仪积分出的姿态角,绿色的曲线是加速度计得到的姿态角,蓝色的曲线是原始Mahony滤波,黑色的曲线是本文采用的方法。

  因为在水平方向快速移动时,水平方向上的加速度较大,影响了合加速度的方向。往返运动中水平方向上存在一个先加速后减速,再反向加减速的过程,因此加速度计(绿线)计算出来的角度呈现出一个震荡的趋势。而陀螺仪的数据和加速度没有关系,更加可靠,姿态角基本上没有变化。

  Mahony互补滤波(蓝线)认为加速度测量的只是重力,这会让姿态角随着加速度方向的变化而变化,形成震荡较大。我们可以看到相比于原始的Mahony滤波,本文采用的方法,姿态角受到加速度噪声的影响更小,但同样没有达到像陀螺仪一样平坦,依旧有需要改进的空间。

  组合功能实现

  按键消抖的实现

  3D无线鼠标所有的功能都是通过按键来控制。首先,我们需要试验3D无线鼠标的硬件是否有做按键消抖的必要性。试验方式是当手原地悬空时,尝试单击和双击,用MATLAB描绘出此时鼠标的轨迹曲线。但是由于是在原地悬空,水平方向基本不移动,画出的图像会重叠,因此在程序中将x轴方向赋予了一个初速度,用来模拟横向方向上的移动,将每次处理后的位置描绘出来,得到了图5-1。从图中可以看出,按键抖动还是很严重的,不仅按下时会抖动,在按键按下之前也会有很大抖动,但是按键按下之前的抖动并不好判断,因此本论文仅考虑按键按下之后的抖动。

  根据按下的抖动曲线,我们正常消抖的策略是加一个延时,再去检测,但是如果是一个拖拽动作,同样会造成一段时间静止,这样会影响拖拽功能的实现。第一种方案是设置一个角速度阈值,当检测到大于这个阈值,说明有拖拽行为,但是不幸的是,按键抖动同样会大于这个阈值,所以仅这个方案并不可行。因此我们可以记录按键抖动超过阈值的时间,如果时间较短,类似高频噪声,就是普通的按键抖动,如果时间较长,就是拖拽行为,因为拖拽行为会持续很长一段时间。时间的具体阈值设置既要不影响正常操作,又能够解决按键抖动的问题,就需要多次试验。如图6-2,是按键消抖的流程图,其中shake_time是按键按下后的一段延时,如果是按键抖动,将在这段时间内静止;drag_flag是拖动行为的标志位,shake_drag_time是超过阈值的时间。实际测试中感觉不到拖拽的滞后,同时能比较好的消除按键抖动。

  通过MATLAB图形化,可以更好的了解按键按下的哪些时候会出现噪声,出现噪声的幅度以及出现噪声的时长,从而来设置各种阈值。如图5-3,本文通过这个图表简单的说明如何设置这些阈值。本节实验数据是在手悬空的情况下,尝试单击和双击,记录按键状态和抖动情况。红色的折线是按键状态,按下为1,没按下为0。绿色的折线是按键抖动情况,这里通过是否超过角速度阈值来判断抖动状态,当超过角速度阈值时判断为按键抖动,状态为1,没有超过角速度阈值则判断为按键没有抖动,状态为0。

  通过观察按键按下后出现抖动的时间长度,确定流程图中消除按键抖动的时间长度shake_time,这段时间内在程序中实现鼠标不移动。例如本次实验,我们可以设置时间长度shake_time为200个采样周期,当检测到按键按下,在200个采样周期内保持鼠标不动,这样就不会受到按键抖动的干扰。另一方面,根据检测到连续超过角速度阈值的次数去修改程序中shake_drag_time,这个参数将和角速度阈值一起用来判断是否是拖拽行为。而以上提到的角速度阈值需要不断的实验,如果这个阈值比较大,那么就将很难触发这个阈值,导致状态的判断不准确,如果阈值比较小,那么就将很容易触发,同样导致状态的判断结果出现偏差,这个参数的设置会影响其他阈值的选取,所以需要选取合适的角速度阈值。

  按键按下为1,未按下为0,按键抖动为1,未抖动为0

  按键状态判断流程

  在按键较少的情况下,想要实现更多功能,就需要判断同一个按键更多的状态,比如长按,短按,双击等等。我们就以实现鼠标滚轮键举例。

  图5-4是本论文按键扫描的基本流程,采用定时器循环判断,以无阻塞的方式,实现了短按,长按,双击等状态的判断,功能之间互相不冲突(比如可以实现长按和短按的功能不同)。在普通鼠标模式下,希望实现上下键的短按,模拟鼠标滚轮滚动一下的功能,上下键长按,模拟鼠标滚轮连续滚动的功能,但是在滚轮连续滚动之前不希望滚一下。很容易出现的问题是,判断是否长按的时候,一开始是短按,那时根本看不出来是短按还是长按,所以在刚按下那一刻判断是有问题的,因此功能的实现需要等待按键抬起再做判断,本论文特地设置了按键抬起标志位,使长按、短按标志位直接就可以表示按键的状态,并将标志位自动清零,防止一些没有用到的标志位,在接下来的程序中造成麻烦。当上下键按下,按键短按标志位置位,则认为为短按,实现滚轮滚一下的功能。当上下键按下,长按标志位置位实现滚轮快速连续滚的功能。

  本论文采用的3D鼠标共有四个键,分别是功能切换键MODE_KEY,确定键,上下键。功能切换键MODE_KEY可以切换激光笔模式和画笔模式以及鼠标模式。

  如图5-5所示,当激光笔模式时,确定键按下,显示激光点,激光点的轨迹可以随手运动,松开时,隐藏激光点。当画笔模式时,画笔一直跟随着手运动,不会隐藏,当确定键按下,开始书写,松开时结束书写,双击可以清除当页笔迹。另外当长按的时候,进入直线模式,更容易画出直线,可以防止手抖动画不了直线。当普通鼠标模式,也可以随意晃动,ok键为普通鼠标左键,这样可以用鼠标去实现音频播放,声音调节,3D模型旋转等等功能。

  上下键是普通鼠标的向上向下键,可以实现翻页和连续翻页的功能。

  随着时代的发展,激光翻页笔必将成为历史,我相信3D无线鼠标类型的无线演示器会掀起改变的新潮。

  本论文的特点是针对3D无线鼠标的实现,提出了专用于手持设备的姿态解算方案,以及人性化功能实现的一系列方案。本文主要做了一下几个方面的工作。

  1、 前期大量调研工作,确定系统方案

  2、 采集传感器数据,构思采集数据的提高效率和实时性的软件框架,将采集出的数据转化并用MATLAB分析,最后是如何实现最大限度的实现低功耗。

  3、 实现无线传输,比较无线传输协议,分析选用芯片的原因,详细了解芯片的工作模式及使用方法,提升数据传输的稳定性,最后是低功耗的实现。

  4、 USB接口的实现。详细了解USB的原理以及配置的资料,实现自定义USB接口的功能,并能够实现模拟按键的功能。

  5、 研究及优化轨迹算法。在充分了解姿态解算的实现原理的基础上,对常用的四旋翼的姿态解算算法进行分析和比较,结合手持设备的特点,简化并优化姿态算法。

  6、 人性化功能的实现。首先优化按键的消抖,同时不影响鼠标拖拽的功能;其次优化按键状态的判断函数,使它能够更容易的实现更多功能。

  存在的问题与改进方向

  1、 姿态算法依旧有很大的改进空间,加速度数据的利用不够,只能充当一个校准的功能,需要仔细研究运动学方程以及状态方程,相信可以更好的利用加速度数据。本论文实现的是角速度控制鼠标运动速度,更希望能够通过优化姿态算法,拟合出实际轨迹曲线,因此优化姿态算法的道路任重道远,需要静下心研究的内容很多。

  2、 人性化功能不够,缺少好功能的创意,比较有创意的功能就是用作激光笔了,只在按下的情况下激光点可以亮,而这些创意的来源都是来源于用户,因此需要去更多的了解演示器的用户,从使用者的角度去开发新功能。

  3、 上位机软件并没有去开发,通过上位机更改按键功能的目标并没有实现,接下来的方向也需要多了解上位机的编写。同时开发C#上位机或者制作PPT插件,也可以实现目前PPT不能实现的功能。

  4、 有个想法是将演讲的PPT放在3D无线鼠标中,省的演讲者每次都得再随身携带一个U盘。也就是需要接受端同时作为一个U盘,需要对USB配置加以修改。甚至可以加入麦克风,作为一个话筒,将常用的功能的集合在一起。

  5、 适配更多的版本,目前的无线鼠标PPT演讲模式只适用于office2013以上,不支持老版本的office,WPS,以及Mac系统,需要适配,可以通过上位机进行实时的修改,或者选用每个版本通用的功能,但是这样功能上会大打折扣。更加优先的选择是上位机进行自动的适配

毕业论文:http://www.3lunwen.com/jy/tyjy/5308.html

上一篇:2GHz无线信号的DPSK信号调制与发射机设计

下一篇:没有了

     移动版:3D无线鼠标的优化算法科学研究

本文标签:
最新论文