act仿真,任务层 整体分层任务与环境层sim_env.py关节空间控制、ee_sim_env.py末端位姿控制、scripted_policy.py脚本策略、assetsMuJoCo XML 场景。数据层record_sim_episodes.py 采集并保存hdf5utils.py 负责 Dataset/DataLoader 与归一化统计visualize_episodes.py 可视化数据集。训练/评估层imitate_episodes.py 是主入口训练 --eval 评估 生成 rollout 视频policy.py 是策略适配器ACTPolicy / CNNMLPPolicy。模型层detr 是 ACT 的网络实现backbone、transformer、VAE/decoder 等main.py 负责构建模型和优化器。配置层constants.py 定义任务配置数据目录、episode 长度、相机名和仿真常量。关键执行链路采集record_sim_episodes.py → data/episode_*.hdf5训练imitate_episodes.py → 读取 constants.py 中任务数据目录 → 训练并保存policy_best.ckpt评估可视化imitate_episodes.py --eval→ 加载policy_best.ckpt→ 输出 video*.mp4sim_env为仿真环境层def make_sim_env(task_name):用于生成关节空间的环境通过字符串导入xml文件把物理引擎和任务组合成 dm_control 标准环境。有插入和传递两个任务。class BimanualViperXEETask(base.Task):def before_step(self, action, physics):每步执行前把动作写入physics物理引擎def initialize_robots(self, physics):重置双臂到初始位姿def get_qpos(physics):读取位姿def get_qvel(physics):读取速度def get_env_state(physics):定义环境状态接口这里没有实现要求子类实现def get_observation(self, physics):获得观测形状为obs[qpos]: (14,)左臂6 左夹爪1 右臂6 右夹爪1obs[qvel]: (14,)结构同上速度obs[env_state]:TransferCubeEETask: (7,)一个物体 poseInsertionEETask: (14,)pegsocket 两个物体 poseobs[images][top]: (480, 640, 3) uint8obs[images][angle]: (480, 640, 3) uint8obs[images][vis]: (480, 640, 3) uint8obs[mocap_pose_left]: (7,)xyz quatobs[mocap_pose_right]: (7,)xyz quatobs[gripper_ctrl]: (4,)左右夹爪控制量 [L, -L, R, -R]class TransferCubeTask(BimanualViperXTask):为传递方块的子类def initialize_episode(self, physics):初始化所有关节位置和方块位置def get_env_state(physics):获得关节位置def get_reward(self, physics):根据接触情况返回当前 step 的奖励。遍历当前物理步的所有接触点取出该接触的两个几何体 id把几何体 id 转成可读名称。如果右夹爪接触方块奖励至少 1右夹爪接触且方块离开桌面被抬起奖励升到 2左夹爪接触方块表示开始交接奖励升到 3左夹爪接触且方块不在桌上认为交接成功奖励最高 4。class InsertionTask(BimanualViperXTask):插入的子类def get_reward(self, physics):如果左右夹爪都接触到了各自应该拿的物体左手 socket右手 peg奖励为1。表示“双手都接触目标”。如果双手都接触目标而且 peg 和 socket 都离开了桌子奖励升级为2。表示“双手都真正抓起了物体”。如果 peg 和 socket 已经碰到一起并且二者都不在桌上奖励为3。表示“插销和插孔已经对接上”。如果 peg 碰到了 pin奖励设为4。表示“插入成功”这是最高奖励。def get_action(master_bot_left, master_bot_right):动作变为14维动作向量、def test_sim_teleop():把真实臂的数据送入仿真ee_sim_env.py实现了末端位姿控制def make_ee_sim_env(task_name):左臂动作里有7维末端位姿3维位置 x, y, z4维四元数姿态 quat左夹爪再加1维开合量。一共16维度scripted_policy.py作用是手动写出专家策略完成方块传递任务整体结构BasePolicy脚本策略基类负责轨迹插值和按时间输出动作。PickAndTransferPolicy传方块任务的手工策略。InsertionPolicy插销插孔任务的手工策略。test_policy测试这些脚本策略能不能在仿真里跑通。class BasePolicy:父类def interpolate(curr_waypoint, next_waypoint, t):定义线性插值def __call__(self, ts):把类实例变成可调用对象在每一步时调用取出waypoint进行插值得到当前时间步的轨迹。class PickAndTransferPolicy(BasePolicy):继承basepolicy实现def generate_trajectory(self, ts_first):先在第一次读取observation的机械臂位置和物块位置直接定义交接点通过打点控制机械臂def test_policy(task_name):变运行边显示摄像头数据观察是否正确运行