MocapApi可以理解为:

诺亦腾官方提供的一套C/C++软件接口,让我们自己的程序能够从Axis Studio中读取已经解算好的人体动作数据。

它不是动捕服,不是网络协议,也不是GMR。它位于:

Axis Studio
和
我们的C++程序
之间

一、先看它在系统中的位置

你当前正式链路是:

PN Link动捕服
    ↓
Axis Studio
    ↓
BVH二进制数据广播
TCP 127.0.0.1:7003
    ↓
MocapApi
    ↓
NoitomMocapApiSource
    ↓
NoitomFrame
    ↓
GMR
    ↓
ZMQ
    ↓
MuJoCo

其中:

  • Axis Studio负责连接动捕服并解算人体姿态。
  • MocapApi负责让我们的C++程序访问Axis输出的数据。
  • GMR负责把人体动作转换成G1动作。
  • ZMQ负责把G1动作发送出去。

二、API是什么意思

API是:

Application Programming Interface
应用程序编程接口

大白话就是:

一套已经规定好的函数,我们不用知道Axis内部怎么实现,只要调用这些函数,就能取得动作数据。

例如,MocapApi提供类似功能:

连接Axis
获取下一个事件
取得Avatar
取得人体姿态编号
取得骨骼关节
取得关节位置
取得关节旋转
关闭连接

我们的程序直接调用这些接口。

三、为什么不能直接读取动捕服

动捕服上的传感器最初产生的是:

  • 加速度;
  • 角速度;
  • 磁场数据;
  • 传感器状态;
  • 设备通信数据。

这些数据不是直接可用的人体骨骼。

Axis Studio还需要完成:

识别各个身体传感器
      ↓
传感器融合
      ↓
姿态计算
      ↓
人体骨骼约束
      ↓
人体Avatar解算
      ↓
生成髋、脊柱、头、手臂、腿等骨骼

我们的程序不重新实现这些复杂算法。

我们让Axis完成解算,再通过MocapApi读取结果。

因此我们拿到的不是原始IMU数据,而是类似:

Hips的位置、旋转
Spine的位置、旋转
Head的位置、旋转
LeftArm的位置、旋转
RightArm的位置、旋转
LeftLeg的位置、旋转
RightLeg的位置、旋转
……

四、MocapApi由什么组成

你当前工作区里有:

Noitom-MocapApi-r70(49068d72) (1)

它就是诺亦腾提供的SDK。

主要包含三部分。

1. 头文件

例如:

MocapApi.h
MocapCApi.h

头文件告诉C++编译器:

  • 有哪些接口;
  • 函数叫什么;
  • 参数是什么;
  • 返回值是什么;
  • 有哪些事件类型;
  • 有哪些关节类型。

例如当前使用了:

IMCPApplication
IMCPSettings
IMCPAvatar
IMCPJoint
IMCPRenderSettings

2. MocapApi.lib

这是Windows编译链接时使用的库文件。

它让编译器和链接器知道:

程序调用的MocapApi函数在哪里

没有它,项目可能编译但无法完成链接。

3. MocapApi.dll

这是程序运行时实际加载的动态库。

xsens_core.exe启动时,需要在附近找到:

MocapApi.dll

否则会报:

找不到MocapApi.dll

或者程序无法启动。

可以简单理解:

MocapApi.h   = 使用说明和函数声明
MocapApi.lib = 编译链接用
MocapApi.dll = 程序运行时真正调用

五、MocapApi怎样连接Axis

程序先创建设置:

CreateSettings(...)

然后设置连接方式。

你使用TCP,因此类似:

SetSettingsTCP(
    "127.0.0.1",
    7003,
    settings
);

这表示:

连接本机127.0.0.1的7003端口

Axis Studio在7003端口监听:

Axis Studio:TCP Server
MocapApi程序:TCP Client

连接关系是:

Axis Studio
监听 127.0.0.1:7003
        ↑
        │ TCP连接
        │
MocapApi

然后程序调用:

OpenApplication(...)

开始接收Axis广播。

六、MocapApi怎样告诉程序“有新动作”

MocapApi使用事件机制。

程序不断调用:

PollApplicationNextEvent(...)

可以理解成不断询问:

有没有新的事件?
有没有新的事件?
有没有新的事件?

当Axis产生新的人体动作时,会收到:

MCPEvent_AvatarUpdated

大白话就是:

Axis中的人体Avatar更新了一次,现在有一帧新动作可以读取。

程序收到这个事件后,会得到一个:

avatarHandle

可以把它理解成当前人体Avatar的编号或访问凭证。

七、拿到Avatar以后读取什么

程序通过 IMCPAvatar 获取:

GetAvatarPostureIndex(...)

得到姿态编号。

例如:

125854
125855
125856

然后获取这个Avatar的关节:

GetAvatarJoints(...)

每个关节都有一个 jointHandle

再通过 IMCPJoint 读取:

GetJointGlobalPosition(...)
GetJointGlobalRotation(...)

也就是:

该关节在世界坐标系中的位置
该关节在世界坐标系中的旋转

八、我们当前读取哪些人体部位

程序会读取类似这些身体节点:

Hips

Spine
Spine1
Spine2
Spine3

Neck
Head

RightShoulder
RightArm
RightForeArm
RightHand

LeftShoulder
LeftArm
LeftForeArm
LeftHand

RightUpLeg
RightLeg
RightFoot
RightToe

LeftUpLeg
LeftLeg
LeftFoot
LeftToe

最后将这些关节整理成:

NoitomFrame

九、MocapApi和NoitomMocapApiSource是什么关系

这两个名字很像,但不是同一个东西。

MocapApi

这是诺亦腾官方提供的SDK。

它提供底层函数:

连接Axis
轮询事件
读取Avatar
读取关节

NoitomMocapApiSource

这是我们项目自己写的输入模块。

它内部使用MocapApi。

关系是:

我们自己的NoitomMocapApiSource
            ↓ 调用
诺亦腾官方MocapApi
            ↓ 连接
Axis Studio

可以把它理解为:

MocapApi = 官方工具箱

NoitomMocapApiSource =
我们用这个工具箱做出来的输入模块

十、NoitomClient又是什么

为了不把大量MocapApi调用都放进输入接口,我们又封装了:

NoitomClient

所以实际代码关系是:

NoitomMocapApiSource
        ↓
NoitomClient
        ↓
MocapApi
        ↓
Axis Studio

各自职责:

NoitomMocapApiSource

负责适配统一的 MotionInput 接口:

open
pollFrame
close

NoitomClient

负责具体操作MocapApi:

创建设置
TCP连接
轮询事件
读取Avatar
读取关节
转换坐标
生成NoitomFrame

MocapApi

官方SDK,实际和Axis进行数据交互。

十一、它和protobuf、ZMQ有什么区别

名称 作用
Axis Studio 连接动捕服、解算人体动作
MocapApi 从Axis读取人体动作的官方接口
NoitomFrame 程序内部统一的人体骨骼帧
GMR 把人体骨骼转换成G1动作
MocapFrame protobuf 描述要发送的G1动作数据
ZMQ 把G1动作发送到MuJoCo或机器人

顺序是:

MocapApi取得人体动作
        ↓
NoitomFrame保存人体动作
        ↓
GMR变成G1动作
        ↓
protobuf组织G1动作
        ↓
ZMQ发送G1动作

十二、MocapApi是不是在监听7003端口

更准确的说法是:

Axis Studio监听7003端口
MocapApi连接7003端口

Axis是服务端:

TCP Server
127.0.0.1:7003

MocapApi是客户端:

TCP Client
连接127.0.0.1:7003

我们的程序调用MocapApi,从连接中取得动作事件。

因此不要说:

MocapApi在7003端口开服务器

应该说:

Axis Studio在7003端口广播人体动作,我们的程序通过MocapApi连接该端口并读取动作。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐