MocapApi Calc类型数据详解
- 北京诺亦腾科技有限公司
- 版本:v1.2
- 撰写人:刘午达
- 修改人:王莎
- 修改时间:2021年9月24日
文档概述
- MocapApi中的Calc数据主要包含六种数据,本文档详细介绍了这些数据的定义,格式,以及坐标系信息。
Calc数据项概述
Calc数据项包括分为4段,段之间用-连接。
第一段为身体部分名称,如Hips,SpineBottom ,…,LeftHandPinkyTip等59种,详情请见后文“第一段(身体部分)说明”。
第二段为特征信息,包括传感器Sensor、关节Joint、骨骼Bone共3种。
第三段为物理量信息,包括姿态四元数Quat、角速度Gyro、加速度Acce、速度Velo、位置Posi共5种。另包括丢包标记Lost。
第四段为具体分量数值,包括x,y,z分量,其中四元数多一个w分量。
在Calc数据中,由上文中的第二段和第三段一共组合成了6种不同的数据进行输出,包括
- 传感器姿态四元数Sensor-Quat
- 传感器角速度Sensor-Gyro
- 传感器加速度Sensor-Acce
- 关节速度Joint-Velo
- 关节位置Joint-Posi
- 骨骼姿态四元数Bone-Quat。
第一段(身体部分)说明
- 在MocapApi输出的数据中,将人体分为59个部分,其中以臀部节点为根节点,后续每个节点都与一个父节点相连,具体顺序如下表所示
- Calc数据中的Joint-Velo与Joint-Posi数据会用到此连接关系。每个节点Joint的定义均为此节点与其父节点的连接处。比如“右前臂”的父节点为“右大臂”,其连接处为右臂肘关节,所以“右前臂”的Position和Velocity均指的是右臂肘关节的Postion和Velocity
部分名称 | 标识 | 序号 | 父节点 |
---|---|---|---|
臀部 | Hips | 0 | 根节点 |
右大腿 | RightUpLeg | 1 | 0 |
右小腿 | RightLeg | 2 | 1 |
右脚 | RightFoot | 3 | 2 |
左大腿 | LeftUpLeg | 4 | 0 |
左小腿 | LeftLeg | 5 | 4 |
左脚 | LeftFoot | 6 | 5 |
脊柱下部分 | Spine | 7 | 0 |
脊柱中部分 | Spine1 | 8 | 7 |
脊柱上部分 | Spine2 | 9 | 8 |
颈部下部分 | Neck | 10 | 9 |
颈部上部分 | Neck1 | 11 | 10 |
头部 | Head | 12 | 11 |
右肩 | RightShoulder | 13 | 8 |
右大臂 | RightArm | 14 | 13 |
右前臂 | RightForeArm | 15 | 14 |
右手 | RightHand | 16 | 15 |
右拇指指根 | RightHandThumb1 | 17 | 16 |
右拇指指中 | RightHandThumb2 | 18 | 17 |
右拇指指尖 | RightHandThumb3 | 19 | 18 |
右食指掌骨 | RightInHandIndex | 20 | 16 |
右食指指根 | RightHandIndex1 | 21 | 20 |
右食指指中 | RightHandIndex2 | 22 | 21 |
右食指指尖 | RightHandIndex3 | 23 | 22 |
右中指掌骨 | RightInHandMiddle | 24 | 16 |
右中指指根 | RightHandMiddle1 | 25 | 24 |
右中指指中 | RightHandMiddle2 | 26 | 25 |
右中指指尖 | RightHandMiddle3 | 27 | 26 |
右无名指掌骨 | RightInHandRing | 28 | 16 |
右无名指指根 | RightHandRing1 | 29 | 28 |
右无名指指中 | RightHandRing2 | 30 | 29 |
右无名指指尖 | RightHandRing3 | 31 | 30 |
右小指掌骨 | RightInHandPinky | 32 | 16 |
右小指指根 | RightHandPinky1 | 33 | 32 |
右小指指中 | RightHandPinky2 | 34 | 33 |
右小指指尖 | RightHandPinky3 | 35 | 34 |
左肩 | LeftShoulder | 36 | 8 |
左大臂 | LeftArm | 37 | 36 |
左前臂 | LeftForeArm | 38 | 37 |
左手 | LeftHand | 39 | 38 |
左拇指指根 | LeftHandThumb1 | 40 | 39 |
左拇指指中 | LeftHandThumb2 | 41 | 40 |
左拇指指尖 | LeftHandThumb3 | 42 | 41 |
左食指掌骨 | LeftInHandIndex | 43 | 39 |
左食指指根 | LeftHandIndex1 | 44 | 43 |
左食指指中 | LeftHandIndex2 | 45 | 44 |
左食指指尖 | LeftHandIndex3 | 46 | 45 |
左中指掌骨 | LeftInHandMiddle | 47 | 39 |
左中指指根 | LeftHandMiddle1 | 48 | 47 |
左中指指中 | LeftHandMiddle2 | 49 | 48 |
左中指指尖 | LeftHandMiddle3 | 50 | 49 |
左无名指掌骨 | LeftInHandRing | 51 | 39 |
左无名指指根 | LeftHandRing1 | 52 | 51 |
左无名指指中 | LeftHandRing2 | 53 | 52 |
左无名指指尖 | LeftHandRing3 | 54 | 53 |
左小指掌骨 | LeftInHandPinky | 55 | 39 |
左小指指根 | LeftHandPinky1 | 56 | 55 |
左小指指中 | LeftHandPinky2 | 57 | 56 |
左小指指尖 | LeftHandPinky3 | 58 | 57 |
第二段(特征信息)说明
传感器Sensor:在惯性动作捕捉中,有些身体部分上并没有绑定相应传感器,这些身体部分的“传感器数据”是由身体骨骼数据反算得出。现阶段MocapApi仅支持Perception Neuron Studio 传感器。
关节Joint:已在上一节“第一段(身体部分)说明”中解释
骨骼Bone:即代表该身体部分
坐标系与坐标原点说明
- 在说明第三段(物理量)与第四段(分量数据)之前,需要介绍具体的坐标系与坐标原点
- Calculation Data 文件中所有数据都是其在全局系下的数据,不是与父节点的相对系数据
全局坐标系
MocapApi输出的Calc文件中所有物理量均以北天东坐标系为全局坐标系
传感器本体坐标系
Perception Neuron Studio 传感器,其传感器经过下位机AHRS计算后,上位机收到的输出数据的本体坐标系如下图所示
人体本体坐标系
人体节点坐标系的定义遵从BVH格式的定义,每个节点输出数据坐标系为TPose情况下的左上前坐标系,如下图所示
位置零点
Calc输出数据包含节点的Postion数据(Joint-Posi),其零点定义为Axis Studio软件中的红线与蓝线在地面上的交点,它也是Avatar坐完人体姿态校准后Hips节点所在位置在地面上的投影。如下图所示:
旋转零点:
- Calc输出数据包含身体每根骨骼的旋转数据(Bone-Quat),其零点定义为人体在TPose情况下面朝正东方的时候各节点的角度(即T-Pose下人体的左上前方向与全局系北天东坐标系重合)
- T-Pose的具体定义请参考Perception Neuron Studio 骨骼的BVH格式头文件描述
第三段(物理量)与第四段(分量数据)说明
- 四元数Quat:用标准四元数格式表述传感器和骨骼的旋转量。两者旋转是一致的,但由于坐标系不同,故有两种数据输出。
- 角速度Gyro:单位为弧度制,即rad/s
- 加速度Acce:国际标准单位m/s²
- 速度Velo:国际标准单位m/s
- 位置Posi:国际标准单位m
Calc数据具体示例说明
数据项名称(表头)一般分为4段,段之间用-连接,上文已解释。
帧序号,从0开始记号。
丢包标记Lost,取值1代表丢包,数据值通过算法得到。取值0代表正常,数据值为传感器测量值。
示例如下表。
数据项表头说明 | 说明 |
---|---|
Frame-No | 帧号 |
Hips-Sensor-Lost | Hips部分传感器丢包标记 |
Hips-Sensor-Quat-x | Hips部分传感器姿态四元数x分量 |
Hips-Sensor-Quat-y | Hips部分传感器姿态四元数y分量 |
Hips-Sensor-Quat-z | Hips部分传感器姿态四元数z分量 |
Hips-Sensor-Quat-w | Hips部分传感器姿态四元数w分量 |
Hips-Sensor-Gyro-x | Hips部分传感器角速度x分量 |
Hips-Sensor-Gyro-y | Hips部分传感器角速度y分量 |
Hips-Sensor-Gyro-z | Hips部分传感器角速度z分量 |
Hips-Sensor-Acce-x | Hips部分传感器加速度x分量 |
Hips-Sensor-Acce-y | Hips部分传感器加速度y分量 |
Hips-Sensor-Acce-z | Hips部分传感器加速度z分量 |
Hips-Joint-Velo-x | Hips部分与父节点的关节速度x分量 |
Hips-Joint-Velo-y | Hips部分与父节点的关节速度y分量 |
Hips-Joint-Velo-z | Hips部分与父节点的关节速度z分量 |
Hips-Joint-Posi-x | Hips部分与父节点的关节位置x分量 |
Hips-Joint-Posi-y | Hips部分与父节点的关节位置y分量 |
Hips-Joint-Posi-z | Hips部分与父节点的关节位置z分量 |
Hips-Bone-Quat-x | Hips部分骨骼姿态四元数x分量 |
Hips-Bone-Quat-y | Hips部分骨骼姿态四元数y分量 |
Hips-Bone-Quat-z | Hips部分骨骼姿态四元数z分量 |
Hips-Bone-Quat-w | Hips部分骨骼姿态四元数w分量 |
SpineBottom -Sensor-Lost | SpineBottom部分传感器丢包标记 |
SpineBottom -Sensor-Quat-x | SpineBottom部分传感器姿态四元数x分量 |
SpineBottom -Sensor-Quat-y | SpineBottom部分传感器姿态四元数y分量 |
SpineBottom -Sensor-Quat-z | SpineBottom部分传感器姿态四元数z分量 |
SpineBottom -Sensor-Quat-w | SpineBottom部分传感器姿态四元数w分量 |
…… | …… |
…… | …… |
LeftHandPinky1-Bone-Quat-x | LeftHandPinky1部分骨骼姿态四元数x分量 |
LeftHandPinky1-Bone-Quat-y | LeftHandPinky1部分骨骼姿态四元数y分量 |
LeftHandPinky1-Bone-Quat-z | LeftHandPinky1部分骨骼姿态四元数z分量 |
LeftHandPinky1-Bone-Quat-w | LeftHandPinky1部分骨骼姿态四元数w分量 |
输出文件格式
文件扩展名为csv,数据项主要通过逗号分隔。
文件的第1行为帧的总数。
文件的第2行为数据项表头说明。使用上表的表头说明。表头顺序为:第1列为Frame-No,然后先按59个身体部分的序号顺序输出,每个身体部分有21个数据,按照上面的表头说明顺序输出。所以数据总列数为:每个身体部分有21个量[(Lost标记)X1+(Sensor Quaternion)X4+(Sensor Gyro)X3+(Sensor Acce)X3+(Joint Velocity)X3+(Joint Position)X3+(Bone Quaternion)X4],共59个身体部分,另外包括帧号,所以每1行一共59*21+1=1240项数据,即数据为1240列。
文件从第3行开始为数据部分,每1帧的数据为1行。数据间用逗号分隔,共1240列。
示例如下。名叫"Data"的数据文件,总帧数为998帧。
data.csv
998
Frame-No,Hips-Sensor-Lost,Hips-Sensor-Quat-x,Hips-Sensor-Quat-y, …, LeftHandPinky3-Bone-Quat-w
0, 0, 0.0, 0.0, 0.0, 1.0, -0.0036, -0.4065, 0.6567, -0.0036, -0.4065, 0.6567, … , 0.0,0.0,0.0,1.0
1, 0, 0.0, 0.0, 0.0, 1.0, -0.0038, -0.4069, 0.6567, -0.0033, -0.4087, 0.6560, … , 0.0,0.0,0.0,1.0
2, 1, 0.0, 0.0, 0.0, 1.0, -0.0138, -0.4169, 0.6267, -0.0133, -0.4387, 0.6561, … , 0.0,0.0,0.0,1.0
…………
……..
997, 0, 0.0, 0.0, 0.0, 1.0, -0.0036, -0.4065, 0.6567, -0.0036, -0.4065, 0.6567, … , 0.0,0.0,0.0,1.0