本项目获2020年深圳大学电子设计大赛一等奖
题目:简易动作捕捉手套设计(单片机嵌入式控制)
- 设计制作一个简易的动作捕捉手套,实现对人手指关节的动作捕捉。
一、基本部分:
- 设计制作一个动作捕捉手套(左右手均可),手套上硬件装置能固定在手套本体上,重量轻便且能长时间工作。
- 动作捕捉手套须具有校准功能,即在佩戴前静置桌面,修正传感器的误差。动作捕捉手套至少能实时检测每根手指的两个关节弯曲度,并能通过无线模块将数据传输至电脑。
- 设计一个电脑端的人手三维动作显示上位机程序,能与动作捕捉手套进行无线通信,将手套发送的数据在程序中转换为同步的人手运动状态。
二、发挥部分:
- 动作捕捉手套除了能检测手指关节的弯曲外,还能检测到人手、前臂在空间中的移动状态,并在上位机程序中显示出来。
三、特别说明
- 手套上的传感器可使用微惯性测量单元、弯曲传感器等来检测关节的。
2020年深圳大学电子设计大赛作品决赛报告
1.需求分析
- 题目要求制作一个简易动作捕捉手套,要求每个手指至少实现两个关节的识别,并且能通过上位机显示对应3d模型。
- 人手指的结构相对比较复杂,由多个关节组成,因此需要在手上的关键位置布置若多个传感器,采集每个手指和关节的运动信息。
- 我们可以把手看做是一个多个向量首尾相连的模型。拿一根手指为例则如下图所示。
- 向量A和向量B是定长的两个向量,相互首尾相连代表两个手指节,其中AB相连之处为手指关节。
- 而如果需要得知两个向量在空间中的状态有两种思路:
- 从以上两种思路中的一种出发就能通过算法确定两个向量在空间的位置。用同样的方式构造出一个手的模型,需要做的就是增加向量以及连接关系,并且推广到三维上。
2.方案选择与论证
方案一:基于stm32为主控,采用多个弯曲传感器。
- 采用多个弯曲传感器,采集手指节之间的弯曲程度,换算成指节间的相对角度(即上图的β角)。
- 优点:程序与电路设计方便。
- 缺点:弯曲传感器昂贵,做成一个手套价格太高。一个弯曲传感器只能识别一个旋转轴的旋转,手的部分关节可以有两个方向的转动,这部分的转动需要增加弯曲传感器来识别。
方案二:基于stm32为主控,采用多个MPU6050传感器。
- 采用多个MPU6050,采集每个手指节与世界坐标下的夹角,通过换算和数据处理还原出手的运动模型。
- 优点:每个MPU6050可以识别三个旋转轴上的角度变化,因此能够更准确的反应手的运动,成本相对采用弯曲传感器低。
- 缺点:电路板数量多,布线存在一些困难,程序设计相对其他两个方案稍复杂。
方案三:基于stm32为主控,采用多个电位器识别手指角度:
- 多个电位器与手指关节联动,通过ADC获取分压数值再换算成角度还原手的运动模型。
- 优点:价格低廉,电路简单,程序设计简单
- 缺点:手套设计结构复杂,容易损坏。
通过综合考虑,采用方案二作为传感器方案。其他功能实现方案如下:
1、无线通信:采用蓝牙串口模块实现单片机与PC的通信,方便快捷。
2、PC端使用unity3d开发一个上位机,PC端调用串口的API获取单片机数据,然后在反应到模型上。
3.系统架构及功能描述
项目系统架构如上图所示,单片机通过采集MPU6050得到各个手指的欧拉角,根据一定协议通过蓝牙串口发送给PC端,PC端通过解析数据包获取每个手指的欧拉角,进行换算并体现在3D模型上。
基于Unity3D的上位机如上图,可以对手套当前运动进行实时显示。
4.理论分析与计算
每个根手指布置两个MPU6050,手掌布置一个,前臂布置一个,一共使用十二个MPU6050。
从这个些传感器中可以获取12组世界坐标下的欧拉角,在上位机设计的程序中,末端指节会根据跟随上一指节进行整体旋转,自身再与上一指节做相对旋转,因此在传输到上位机之前需要将世界坐标下的欧拉角换算成指节间的相对旋转角度。
MPU6050得到的角度是γ和α要想获得β的大小,根据几何关系,只需要将他们相减,即:
最终数值中的符号代表旋转方向,因此将此例推广到三维坐标下,可以得到公式,每一指节的相对上一指节的角度为:
其中,△代表与上一个指节的相对旋转角度,测代表当前指节测得的欧拉角,上测代表上一指节测得的欧拉角。
5.电路图和PCB
本作品采用两种供电方式,一为数据线通电,一为电池通电。下图为用TC4056的充电电路。利用数据线可以给电池充电。而且还有充电指示灯和已充满电的指示灯。电池采用3.7V锂电池。
用USB_micro接口作为充电和通电接口,下图为用ME6219C33的5V降3.3V的降压电路
由于设计主要为电池供电,而由于电池的4.2V(或者更低)的电压可能导致ME6219C33可能无法正常工作,输出3.3V电压,因此需要先把电池的电压升为5V,使降压电路稳定工作,保证电路正常工作。下图为BL8531的开关电源升压电路。
主控芯片采用STM32F103C8T6,以下三图为芯片的最小系统电路。(包括时钟电路,BOOT电路,滤波电路,复位电路,烧录电路,主芯片电路)
由于板子比较小,需要的电量测量精确度不需要很高,只需要知道电池是否需要充电,因此选择了简单的电阻分压电路,利用芯片的ADC功能来测量电池电压,以便知晓何时电池应该充电。
- LED电路:本作品具有通电指示灯,电量指示灯(电池需要充电时亮),以及两个备用的指示灯
- 蓝牙电路:手套需要与电脑进行数据交换,本作品选择蓝牙模块HC08来传输数据。以下为蓝牙部分电路。
利用主控板上(位于手背)的六轴和手指,手腕上的六轴来计算得出手的姿态。
每只手指上均有两个小小的六轴模块,可以检测计算手指上下两个个关节的姿态以及运动情况。两个模块的IIC接口是共用的,然后连到主控板上的六轴接口。主控利用不同的地址来判断是哪一个模块,以明确是哪一个模块的数据。上关节(以及手腕)的地址为1101001,下关节的地址为1101000.
6.调试与测试结果
方案设计完善后进行实际制作。
- 第一步:先焊接单片机主控板并对其硬件电路进行测试,测试各个模块电压是否正常,升降压芯片,电源管理芯片等是否正常工作。测试结果正常。
- 第二步:对单片机烧写简单例程,测试单片机能否正常工作,测试结果正常。
- 第三步:使用单片机读取主控板上的MPU6050测试其是否正常工作,测试结果正常。
- 第四步:焊接各个手指上的MPU6050小模块,硬件测试有无短路断路,测试能否使用单片机正常与其通信,所有MPU6050全部测试正常。
- 第五步:测试与配置蓝牙通讯芯片,测试正常。
至此,所有硬件测试完成,进入软件调试环节。
- 第一步:读取所有MPU6050模块的数据,打包通过蓝牙发送到PC上位机。
- 第二步:PC上位机使用Unity3D编写程序,调用.NET框架提供的串口API读取数据并解析,将数据映射到3D模型上。
- 第三步:优化程序。
最后将电路板装配到手套上,完成设计。
最后测试结果为:上位机能识别手套五个手指上两个关节的运动,以及前臂与手掌在空间的运动,带有静止校准功能。手套通过无线传输数据,带有电源管理能进行充放电。
以下为电路与实物图片:
7.演示视频