/Human-Pose-Estimation---Motion-Capture-Device

Inertial Human Motion Capture Device - Submodule with GY-87 for Pose Data Acquisition, ESP32 for Pose Estimation, and UDP Connection to PC for Pose Reconstruction

Primary LanguageC#GNU General Public License v3.0GPL-3.0

Human Pose Estimation - Motion Capture Device

摘要

最近比较沉迷虚拟主播,用来打发时间还是挺有意思的,一些3D势虚拟主播不可避免的就是会使用到动作捕捉设备,产生了一些兴趣,想简单实现一下。现在市面上大多数的动补方案是光学动补、惯性动补和混合动补三种方式,光学动补精度高,但是成本也高,而且捕捉质量与摄像头帧率和数量直接相关,惯性动补成本相对比较低,但是会不可避免的有各种漂移问题,成品商业方案大多是最后一种,是光学和惯性结合起来去做拟合,从而达成比较好的稳定性和精度。光学动补现在已经有很多商业公司开放付费使用的服务了,比如小K动补之类的,所以本文就 不介绍光捕,而实现一个惯性动补

1.设计思路&硬件选择

我希望动捕设备最好能无线连接PC,所以esp32就成了首选,不用再多加一个透传模块,而且价格也便宜,另外就是IMU的选型,这个的选择项就非常多了,一些精度高的IMU价格非常夸张,所以这里就使用最常见的六轴IMU MPU6050,物美价廉,漂移和噪声问题确定很大,但是可以放在软件算法里去尽量做优化,不过调过姿态控制的都知道,六轴传感器的偏航角几乎是不可用的,这是六轴传感器工作机制导致的,只能用角速度去积分获取偏航角,然后一定程度上通过横滚角和俯仰角去矫正,理想的状态下,静态响应还是凑合的,但是动态响应几乎就是灾难,在动捕这个领域,这显然是不合适的,因此为了获得更为准确的yaw角度,我选择添加一个磁力计,HMC5883L,虽然磁力计也同样会有被环境干扰问题,比如周围的磁场,但是它的yaw角很大程度上至少是可信的,环境干扰也可以放在软件算法里面去尽量矫正。 所以最后确定的下位机方案就是使用esp32+mpu6050+HMC5883L,成本大概30块钱左右,然后关于上位机的选择,因为这次涉及到3D模型,当然是请出老朋友unity,下位机采集解算出来的欧拉角直接通过wifi与PC走UDP(延时小)通信传输数据,然后再在PC端根据欧拉角还原人体姿态,大致思路就是这个样子。

2.硬件设计

硬件方面IMU直接用的是模块,因为裸片买不起(悲),然后尺寸尽可能小巧,没有画成两面板是因为就算把尺寸再画小一点,电池容量也可能不太够了,索性定在了45mm * 45mm的尺寸上了能一面画完,能放一个800mah的锂电池,项目工程都再立创开源了,以下是链接:
立创开源广场项目链接

PCB Layout

3.软件设计

3.1 设备软件

由于IMU和磁力计采集到的数据都是有很大噪声的,而且消费级的IMU的漂移问题很严重,所以他们的数据直接拿来其实是不能用的,上面那段代码其实是一个卡尔曼滤波的处理,也算是姿态解算中很经典的处理算法了,具体的原理就不在这里展开了,关于卡尔曼滤波的教程和讲解网上有太多太多,我就不在这里班门弄斧了,卡尔曼滤波主要针对IMU,可以得到一个可用的Roll角和Pitch角,而Yaw角则需要用磁力计来解决,磁力计在外部坏境相对稳定的情况下,指北的表现还是比较好的,所以只对其数据进行简单的均值滤波其实在平面上就已可用,其问题在于倾斜情况下需要对磁偏角进行倾斜校正,不然会得到一个完全错误的数值,原因跟磁力计的工作方式有关,在此不多赘述,感兴趣可以看这篇文章了解其原理基于加速度计与磁力计的姿态解算方法(加计补偿偏航)。最后将获得的Roll、Pitch、Yaw角传出,后面的工作就是组报文 + UDP通信了,将数据传给PC上位机后,再由PC去根据欧拉角还原物体姿态。

3.2 上位机软件

如上面所说,上位机我用的是Unity,这里其实没有太多可说的,上位机全部的工作就是建立一个UDP的服务器,接收来自设备的包含欧拉角信息的消息并对其进行解析,然后使用角度信息对场景物体进行对应旋转,真要说的话,本文只是Part1,所以只做了一个Cube去做测试,具体人体姿态的解算和还原会放在Part2中去详细说明。上位机的Unity工程我也放在了Github仓库中。

4.效果演示

这里放一张动图用来展示实际的效果:

5.上位机展示

上位机基于Unity制作,用的是传统的正向动力学,上位机的开源仓库请点击-->动作捕捉配套上位机,后续也有兴趣涉足一下IK,暂时学习用效果如下了。
https://github.com/isNineSun/Human-Pose-Estimation---Motion-Capture-Device/assets/42261713/1a74626f-e1af-4e56-bceb-0fe2316b3c24