动捕服不是直接和 MuJoCo 通信。

中间一定要经过 Noitom(诺亦腾)SDK,把动捕数据解析出来,再转换成机器人控制需要的数据,最后送入 MuJoCo。

你的物理链路应该是:

动捕服传感器
  ↓ 无线
Noitom Hub / 接收器
  ↓ USB 或局域网
Axis Studio / PNLink
  ↓ UDP发送到电脑端口8000
xsens_core.exe
  ↓ 解析23个人体节点
GMR IK
  ↓ 得到G1根姿态和29关节
protobuf MocapFrame
  ↓ ZMQ PUSH,TCP 5555
xsens_zmq_mujoco_viewer.exe
  ↓ ZMQ PULL
MuJoCo G1模型

Noitom后台程序(Axis Neuron / WTL等)负责接收动捕服数据,SDK通过 DLL 接口访问已经解算好的人体骨骼数据。

1. SDK里面到底有什么?

① Avatar(人体模型)

这个最重要,对应:

IMCPAvatar

作用:获取人体骨骼,SDK里面已经有人体骨架结构。


② Joint(关节)

机器人控制最需要这个。接口:

IMCPJoint

机器人动作数据来源就是这里。


③ BodyPart

身体部件:

IMCPBodyPart

提供:

GetJointPosition()

GetBodyPartPosture()

④ SensorModule

如果你想读取IMU:

IMCPSensorModule

可以获取:

  • 姿态
  • 角速度
  • 加速度

Axis Studio 开放TCP/UDP数据输出
  ↓
你编写的程序加载 MocapApi.dll
  ↓
程序调用 SetSettingsTCP 或 SetSettingsUDP
  ↓
OpenApplication
  ↓
PollApplicationNextEvent
  ↓
获得Avatar和Joint数据

2. 一个完整调用流程

第一步:加载DLL

你的工程:

G1_Motion_Project

│
├── main.cpp
├── MocapApi.dll
├── MocapApi.lib
└── MocapApi.h

CMake:

target_link_libraries(
    G1Motion
    MocapApi.lib
)

运行目录放:

MocapApi.dll

3. 获取人体关节

假设获取Avatar:

MCPAvatarHandle_t avatar;

然后获取所有Joint:

MCPJointHandle_t joints[60];

uint32_t count=60;


avatar->GetAvatarJoints(
    joints,
    &count,
    avatarHandle
);

SDK已经定义了60个Joint标签,例如:

JointTag_Hips

JointTag_LeftLeg

JointTag_RightArm

JointTag_Head

这刚好对应人体。


4. 获取动作数据

循环:

for(int i=0;i<count;i++)
{


float x,y,z,w;


joint->GetJointGlobalRotation(
    &x,
    &y,
    &z,
    &w,
    joints[i]
);


}

得到四元数:

qx
qy
qz
qw

5. MuJoCo怎么接?

MuJoCo不直接连接Noitom。

mocap_receiver.cpp

输出例如:

{
"left_hip":0.25,
"left_knee":1.2,
"left_ankle":-0.3
}

然后:

MuJoCo:

data->qpos[i]=robot_joint;

mj_step(model,data);

一、Noitom SDK的角色是什么?

它不是控制机器人,只是:

把动捕硬件的数据转换成程序可以读取的骨骼数据。

例如,动捕服发送:

Sensor1
Sensor2
Sensor3
...

原始数据:

IMU角度
磁场
加速度

SDK负责:

传感器数据
        |
        |
人体解算
        |
        |
23个骨骼节点
        |
        |
API接口输出

最终你的程序拿到:

Joint[0]

name:
Pelvis


position:
x,y,z


rotation:
quaternion

二、你的PC端程序应该是什么结构?

mocap_receiver

        |
        |
    Noitom SDK

        |
        |
    获取人体姿态

        |
        |
    转换成你的MotionFrame

        |
        |
    GMR

        |
        |
    MuJoCo

三、SDK调用流程(典型)

一般流程:

1. 初始化SDK

MocapApi api;


api.Init();

2. 连接动捕服务器

例如:

api.Connect(
"192.168.1.xxx",
49068
);

3. 注册回调

SDK一般两种模式:


模式A:主动拉取

你的程序循环:

while(true)
{

api.GetFrame(frame);


}

类似:

你问SDK:

现在人体姿态是多少?

SDK返回

模式B:订阅回调

SDK主动推送:

例如:

api.SetCallback(
OnFrame
);

然后:

每收到一帧:

调用:

OnFrame()

四、你的程序应该分几个线程

Thread 1

Noitom接收线程

Noitom SDK

100Hz

↓

MocapFrame Buffer

Thread 2

GMR线程

读取人体姿态

↓

IK

↓

29 DOF

Thread 3

MuJoCo控制线程

读取机器人目标

↓

mj_step()
动捕服
 |
 |
PNLink
 |
 |
PC Ethernet
 |
 |
Noitom SDK
 |
 |
你的程序
 |
 |
MuJoCo
Noitom MocapApi SDK

        ↓

NoitomReceiver.cpp

        ↓

HumanMotionFrame

        ↓

GMR

        ↓

RobotMotionFrame

        ↓

ZMQ

        ↓

MuJoCo Controller

Logo

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

更多推荐