Day4 unitree_G1人形机器人“身外化身”基础学习
·
动捕服不是直接和 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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)