Day8 unitree_G1人形机器人GMR—— MocapApi
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连接该端口并读取动作。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)