Tracking 部分整体框架
本文里的命令默认使用 PC 根目录环境。
本文总结当前 sim2real 仓库里 tracking 推理链路的代码组织方式。分析入口是:
uv run sim2real/rl_policy/tracking.py --policy-config checkpoints/lafan-aa/policy-ec592bb4_lafan_100style_student-5000.yaml
uv run sim2real/sim_env/base_sim.py
核心结论很简单:tracking policy 只关心低层状态、参考动作序列和 ONNX 推理;执行侧可以是 MuJoCo,也可以是真机。真机部署时通过 robot_io 选择 inline 或 ZMQ bridge,具体选择集中放在 Robot I/O。
1. 两个入口分别做什么
sim2real/rl_policy/tracking.py
- 读取
robot_config和policy_config。 - 根据
policy_config推导 ONNX 模型路径。 - 创建
Tracking对象并调用run()。 Tracking本身很薄,只是在BasePolicy上额外加了一个paused开关,支持空格键或手柄B键暂停/继续参考动作播放。tracking.py还支持--onnx_provider cpu|gpu,用于切换 ONNX Runtime 执行后端;要真正跑到 GPU,环境里必须有CUDAExecutionProvider。
也就是说,tracking 的 主要逻辑并不在 tracking.py,而在 sim2real/rl_policy/base_policy.py、sim2real/rl_policy/utils/state_processor.py 和 sim2real/sim2real/rl_policy/observations/*。
sim2real/sim_env/base_sim.py
- 读取
robot_config和scene_config。 - 加载 MuJoCo 场景,创建 mjviser server。
- 创建
SimulationBridge,把 MuJoCo 状态发布成统一的low_state,并从统一的low_cmd里取关节目标。 - 以固定仿真步长循环:
- 发布低层状态
- 计算 PD + 前馈力矩
- 写入
mj_data.ctrl - 执行
mujoco.mj_step
因此,base_sim.py 并不知道 tracking 是什么任务,它只实现统一的机器人底层接口。
2. 总体数据流
tracking 主链路可以概括成下面这条:
MuJoCo / Real Robot
-> low_state (ZMQ)
-> StateProcessor
-> Observation update / compute
-> obs_dict
-> ONNX policy
-> action
-> q_target
-> low_cmd (ZMQ)
-> SimulationBridge / RealBridge
-> PD torque
-> MuJoCo / Real Robot
其中有两条并行输入:
-
机器人当前状态
- 来自
low_state - 包含 base quaternion、base gyro、joint pos、joint vel、joint torque
- 来自
-
参考 tracking 轨迹
- 来自 any4hdmi dataset 中的 qpos
.npz,或 live ZMQ motion stream - 在推理侧由
MotionDataset读入并缓存 - 由
track.py中的观测类切成未来多帧参考量
- 来自 any4hdmi dataset 中的 qpos