STM32
直播中

张秀兰

7年用户 1267经验值
私信 关注
[问答]

如何实现基于MEMS加速度传感器的手势识别系统的设计?

如何实现基于MEMS加速度传感器的手势识别系统的设计?

回帖(1)

张荣

2021-12-20 14:03:12
手势识别在现在社会越来越广泛用的,下面这篇文章是之前搞的一个项目,是基于三轴加速度传感器做的。个人感觉在机器视觉火热的今天,利用传感器的手势识别好像没有那么吸引人了。
  要:随着移动智能电子设备的发展,基于MEMS 加速度传感器的手势识别成为一个研究热点。本文提出一种基于ARM处理器、ADXL345加速度传感器、NRF24L01、LABVIEW的手势识别系统,该系统利用位于手指的5个加速度传感器,分别采集单个轴上的加速度信息,采集后的加速度信息进行滤波,然后通过与各自设置的阈值进行比较将标志位flag赋值,通过无线将flag发给接受机。接收机分析判断5个发射机的flag值,通过串口将最终判断值FLAG发给LABVIEW上位机,与LABVIEW中图片模板进行匹配,实现手势的识别。除此之外,利用Python编程,实现了人机的交互,通过手势控制电脑上网页的打开,图片的显示等。
关键词:加速度传感器;手势识别;LABVIEW;NRF24L01
0引言
近年来,随着智能电子设备的发展,人机交互越来越引起人们的重视,人们已经不满足于键盘、鼠标、触摸屏等的交互,手势识别因其自然直观、简单方便、不受操作空间的限制,已经成为了当前人机交互研究的热点。手势识别在手语、医疗康复、虚拟现实、智能遥控等应用中具有重要的意义。
目前手势识别有两种实现方式,一种是基于视觉的识别技术,该技术投入费用大、计算量大、受环境和光线的限制。另一种是基于加速度传感器的识别技术,加速度传感器价格低廉,体积小,不受环境和光线的限制,因此基于加速度传感器的手势识别应用范围更为广。本文基于MEMS加速度传感器,提出了一种简单有效的识别算法,该算法基于加速度传感器的加速度阈值实现的。通过将采集的加速度数据与选取的阈值进行比较来识别定义的15种手势。
1系统总体设计
系统主要采用stm32微控制器、三轴加速度传感器adxl345、TFTLCD液晶模块以及无线模块nrf24l01。该系统一共有5个发射机和一个接受机。系统采用5个加速度传感器,5个加速度传感器通过护指套固定在五根手指上,每个加速度传感器通过IIC总线与一个stm32系统板相连,stm32微控制器采集加速度传感器的数据,对数据进行处理,将处理后的数据与选取的阈值进行比较,然后将标志位flag赋值,最后通过nrf24l01将标志位发送给接收机,接受机通过nrf24l01接受5个flag值,接收机一方面在液晶屏上显示5个接受的flag值,一方面根据手势规则库分析5个flag值,然后将定义的FLAG赋值,通过RS232串口发送给PC。PC端设计的LABVIEW用户界面不停的接受下位机发来的数据,并且对下位机发送来的数据进行处理,与其储存的图片模板进行匹配,实现手势识别。除此之外,基于Python语言实现了通过手势控制PC端网页的打开,图片的打开,QQ的登录等等,实现了人机交互。其中系统的总体框架如图1所示。
和其他系统相比,本系统具有以下优点: 相比于传统的单个加速度传感器,采用5个加速度传感器采集5个手指的加速度信息,可以获取每个手指的动作,更好的获取使用者的动作信息。采用2.4G无线实时传输加速度数据,用户将不被束缚在电脑前,可以在有效范围内进行手势动作,使该系统更加灵活方便。本系统的移植性强,可以在另一只手上进行复制,这样系统就变成通过两只手进行手势识别,识别手势的的种类将大大增加,提高人机的交互性。系统采用的ADXL345加速度传感器内部自带AD转换,直接输出数字量,省去了AD转换。系统通过LABVIEW上位机进行手势识别验证,使该手势识别系统更加直观。





2硬件设计
2.1 加速度传感器模块
获得使用者的加速度数据是该系统进行手势识别的前提和基础。本系统选用了美国ADI公司生产的三轴加速度传感器ADXL345。它采用MEMS技术,支持标准的IIC或SPI数字接口,自带32级FIFO存储,并且内部有多种运动状态检测和灵活的中断方式等特性。该加速度传感器分辨率高,量程可变,灵敏度高,功耗低,尺寸小。加速度传感器采集手势动作时的加速度然后送给微控制器,微控制器对数据进行处理,加速度传感器是信号产生模块。本系统中ADXL345加速度传感器通过IIC的方式与STM32微控制器进行通信。其连接方式如图3所示。






2.2 STM32模块
本系统采用stm32系列的处理器,它以stm32rct6芯片为核心。它是32位的单片机,具有丰富的增强IO、端口和强大的外设资源。它体积小、质量轻、低功耗和可靠性高,所以性价比很高。本系统采用它来进行数据采集,处理,传输等。
2.3 NRF24L01模块
NRF24L01无线模块,采用的芯片是NRF24L01,它的特点有:2.4G全球开放的ISM频段,免许可证使用。最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。125个可选的频道,满足多点通信和调频通信的需要。内置CRC检错和点对多点的通信地址控制。低工作电压(1.9~3.6V)。可设置自动应答,确保数据可靠传输。该芯片通过SPI与STM32通信,最大的SPI速度可以达到10Mhz。本系统共使用6个NRF24L01,5个作为发送端,1个作为接收端,采用5发1收的模式。其连接方式如图4所示。





3手势识别处理过程
3.1 手势定义
手势的定义应该满足简单,易记的原则。本文定义15种手势,分为A组和B组,A组包括拇指弯曲、食指弯曲、中指弯曲、无名指弯曲、小拇指弯曲共5种手势,B组包括手势”0”、手势”1”、手势”2”、手势”3”、手势”4”、手势”5”、手势”6”、手势”7”、手势”8”、手势”9” 共10种手势。其中拇指弯曲和手势4一样。定义的手势如下图所示。





3.2 数据采集与预处理
5个加速度传感器使用护指套固定于手指上,加速度传感器的X轴与手指在一条直线上。如图6所示。然后拇指和食指分别进行弯曲、伸直,采集每个传感器三个轴上加速度数据的变化值,将采集的拇指加速度数据和食指加速度数据通过串口发给PC,保存于TXT文档中,然后用MATLAB 对数据进行作图分析。通过图7可以发现拇指弯曲过程中,Z轴数据变化幅度大,因此拇指上的加速度数据以Z轴作为参考轴,同理食指弯曲过程中,X轴数据变化幅度大,食指上的加速度数据以X轴作为参考轴,由于中指、无名指、小拇指与食指空间位置的相似性也以X轴为参考轴。MEMS加速度传感器一方面由于自身制造工艺、材料等原因,它采集的加速度传感器将会存在误差;另一方面由于使用者手臂抖动和外界环境因素,采集的加速度数据也将会产生误差和噪声。加速度数据的误差会对本系统手势识别过程产生影响,因此有必要对采集的加速度数据进行滤波处理,以获得更加平滑稳定的加速度数据。本文采用滑动窗口滤波来去除误差和噪声





其中,















为采集的原始加速度数据,a为滤波后的加速度,本文取k = 5 ,即滑动窗口滤波器的点数设为11手势“食指弯曲”的加速度预处理前后效果如图 所示。然后将滑动均值滤波的算法移植到STM32微控制器中。































3.3 阈值的选取及手势识别算法
         阈值的选取是本系统中有效进行手势识别的关键,本文提出了两种阈值选取:人工选取和自动选取。其中人工选取是首先手掌与水平面呈垂直状态,拇指、食指、中指、无名指、小拇指分别进行往复伸直、弯曲,STM32微控制器采集加速度传感器数据,然后通过串口发送给PC,PC接受数据保存在TXT文档中。MATLAB对采集的数据进行滑动窗口滤波后,利用MATLAB中函数选取该组数据中最大与最小值,本文以食指和中指加速度数据为例作图显示如图所示,则





其中thread为人工选取的阈值,















为平滑滤波后一组数据中加速度最小值,















为平滑滤波后一组数据中加速度最大值。











本设计采用的算法是基于单轴加速度阈值的算法,这种算法简单有效的进行了手势识别。a[n] > thread
则该手指处于伸直状态,令微控制器中变量flag=1;
a[n] < thread
则该手指处于弯曲状态,令微控制器中变量flag=0;
但是对于手势”0”和手势“9”,由于在每根手指只有一个阈值的情况下,5个flag都会置为0,系统此时将无法区分这两个手势,鉴于这两个手势的特点,本文对食指进行两个阈值thread1和thread2的选取,其中










如图所示





a[n]< thread2
则食指处于弯曲状态2,令微控制器中变量flag=2;
thread2< a[n]
则食指处于弯曲状态1,令微控制器中变量flag=0;
否则
则食指处于伸直状态,令微控制中变量flag=1;
因此本系统中,食指有两个阈值,其他四根手指分别有一个阈值。
手势识别算法的示意如图所示。









针对不同的用户,每个人手指弯曲程度都存在差异性,若不同人使用本系统都需要进行人工选取阈值后才能工作的话,那将会导致系统移植性差,并且很麻烦,影响用户的体验。
基于人工选取阈值提出了一种自主选取阈值的方法进行手势识别。自主选取阈值是在微控制器中进行,因此将不需要在MATLAB中分析。微控制器上电后,用户进行重复几次手指弯曲伸直的动作,这里称为训练手指,在微控制器中定义一个数组,大小为150,训练手指过程中,采集的加速度数据经过滑动窗口滤波后存于这个数组中,然后对数组中150个数据进行排序,这里采用冒泡的排序算法,找出加速度最大值与最小值,接下来的步骤与人工选取阈值相同。下文手势识别系统的使用和实验都采用自主选取阈值的方法。
3.4 手势规则库的设计
     5个微控制器将采集处理后的加速度数据与自主选取的阈值进行比较后,将各自的变量的flag赋值,其中拇指为flag1,食指为flag2,中指为flag3,无名指为flag4,小拇指为flag5,然后5个flag值通过NRF24L01发给接收机,接受机接收到5个值后,需要对5个值分析后将其变量FLAG赋值,因此需要一个手势规则库。如下表
表1 手势规则库


手势
“5”
拇指弯曲
食指弯曲
中指弯曲
无名指弯曲
小拇指弯曲
手势
“0”
手势
“1”
手势
“2"
手势
“3”
手势
“6”
手势
“7”
手势
“8”
手势
“9”
flag1
1
0
1
1
1
1
0
0
0
0
1
1
1
0
flag2
1
1
!=1
1
1
1
2
1
1
1
2
0
1
0
flag3
1
1
1
0
1
1
0
0
1
1
0
0
0
0
flag4
1
1
1
1
0
1
0
0
0
1
0
0
0
0
flag5
1
1
1
1
1
0
0
0
0
0
1
0
0
0
FLAG
10
11
12
13
14
15
16
17
18
19
20
21
22
23
根据规则库,接收机中的FLAG被赋予相应的值,然后通过RS232串口将FLAG数据发给PC。
4 LABVIEW上位机的设计
LABVIEW上位机通过RS232串口接受下位机发过来的FLAG值,接受的FLAG与LABVIEW中的图片模板进行匹配,实现手势识别。具体过程如下:
a.通过“VISA 串口配置”对串口进行初始化设置:利用Visa Configure Serial Port.vi节点设定串口的端口号(COM4)、波特率(9600)、停止位(默认)、校验位(默认)、数据位(默认)。
b.通过“VISA 读取”对下位机发送过来的 FLAG 进行接收。
c.使用 while 循环结构实现对下位机发送的数据连续不停的读取。
d.通过“VISA 关闭”关闭串口停止读操作。
上位机LABVIEW运行主界面如图所示





使用LABVIEW上位机对定义的所有手势进行手势识别的效果图,如图所示。





本手势识别系统可以用在对机械手的控制,实现机械手的抓取。也可以作为遥控器实现对家用电器的控制。本文利用Python编程,实现了人机的交互,通过手势控制电脑上网页的打开,图片的显示,qq的登录等。Python根据接受到的FLAG值,作出相应的任务。利用A组手势进行控制:

If
Then
拇指弯曲
打开凤凰网
食指弯曲
打开USTC邮件系统
中指弯曲
打开淘宝
无名指弯曲
打开电脑上的一张图片
小拇指弯曲
登录QQ
7 结论
本文提出了一种基于加速度阈值进行手势识别的方法,实验结果表明该方法简单有效,识别率较高。除此之外,提出一种自主选取阈值的方法,使本手势识别系统更加灵活。而且采用无线的方式,让使用者不局限于电脑前。但是该系统不能在手臂处于任何姿态下进行手势识别,因此将引入陀螺仪作为下一步研究的工作,使该系统不受姿态的限制。同时将该系统复制到另一个手上,增加系统识别手势的种类。
举报

更多回帖

×
20
完善资料,
赚取积分