1.设计思路

通信方面没有太多要说的,是做了一个UDP的服务器用来接收设备的广播数据,然后将固定格式的数据进行解析,得到各个肢体的三轴值数据。
人物模型采用的是通过Vroid生成的模型,骨骼使用mixamo进行绑定,并在Unity中做人形骨骼绑定。得益于我设备是每个关节(肢体)可以分别获取Roll、Pitch和Yaw角,因此我可以直接进行正向动力学,即将获取到的肢体的角度偏转值直接赋值给上位机中的人体模型。因此,控制人物模型的核心代码其实很短:

1
2
3
4
5
// 将三轴值转化为Quaternion
armRotation = UnityEngine.Quaternion.Euler(roll, yaw, -pitch);

//将旋转值应用在模型骨骼上
body.rotation = armRotation;

2.模型初始状态问题

与直观的欧拉角不同,即使传入的初始状态都是(0,0,0),在头部应用的时候还没有问题,但是应用在模型手臂会导致手臂初始状态朝上而不是T-Pose,因此需要给手臂加一个初始状态矫正的Offset:

1
2
3
4
5
6
7
// 将三轴值转化为Quaternion
armRotation = UnityEngine.Quaternion.Euler(roll, yaw, -pitch);
//初始状态矫正
armRotationOffset = UnityEngine.Quaternion.Euler(XRotationOffset, YRotationOffset, ZRotationOffset);

//将旋转值应用在模型骨骼上
body.rotation = armRotation * armRotationOffset;

引入矫正前

引入矫正后

3.最终效果

最终效果可以点击链接查看视频–> https://github.com/isNineSun/Human-Pose-Estimation---Motion-Capture-Device/assets/42261713/1a74626f-e1af-4e56-bceb-0fe2316b3c24

4.最后

还真是迟来的Part2了,生活中有不少的事情这个就一直搁置下来了,最后实现的效果也并不能说尽善尽美了,还有很多遗憾和不足,希望能在之后的项目中注意并避免,能够弥补这次的些许遗憾。
项目软硬件皆以开源,Part1文章中有所有的开源链接–>惯性人体姿态解算——动捕设备的实现 Part1,本上位机实现也在GitHub上开源了–>Motion-Capture-Host-Software