Isaac Lab Mimic 数据生成模块(isaaclab_mimic.datagen)深度解析:从源演示到可执行轨迹

发布时间:2026/9/16 18:40:40
Isaac Lab Mimic 数据生成模块(isaaclab_mimic.datagen)深度解析:从源演示到可执行轨迹 Isaac Lab Mimic 数据生成模块isaaclab_mimic.datagen深度解析从源演示到可执行轨迹【免费下载链接】IsaacLabUnified framework for robot learning built on NVIDIA Isaac Sim项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLabisaaclab_mimic.datagen是 Isaac Lab 中负责基于少量人工采集源演示生成新数据集的核心子包其实现受 MimicGen 启发将演示解析为以物体为参考系的子任务片段再根据新场景的物体位姿对片段进行位姿变换、拼接与插值最终形成机械臂可执行的航点轨迹。本文将以该子包的官方 API 文档骨架为主线结合仓库源码逐类剖析DataGenerator、DatagenInfo、DataGenInfoPool、三种SelectionStrategy以及航点类族的设计与调用关系并给出基于 generate_dataset.py 的实战使用方法帮助你完整掌握 Isaac Lab Mimic 数据生成的底层原理与二次开发入口。一、模块定位与文件构成datagen子包位于 source/isaaclab_mimic/isaaclab_mimic/datagen/包级入口init.py 一次性导出全部核心符号。从源码结构看该子包按职责分为六个文件文件核心类/函数职责data_generator.pyDataGenerator及 3 个位姿变换函数数据生成主流水线datagen_info.pyDatagenInfo单个时间步的环境信息载体datagen_info_pool.pyDataGenInfoPool多 episode 信息池与子任务边界解析selection_strategy.pySelectionStrategy及 3 个策略实现源演示子任务片段选择waypoint.pyWaypoint、WaypointSequence、WaypointTrajectory、MultiWaypoint航点/轨迹表示与执行generation.pyrun_data_generator、env_loop、setup_env_config、setup_async_generationasyncio 驱动的批量生成框架整体数据流为源 HDF5 数据集 →DataGenInfoPool解析为DatagenInfo并计算子任务边界→DataGenerator.generate()选源片段 → 随机化边界 → 位姿变换 → 构建航点轨迹→ 多环境并行执行并导出新演示。下面按数据流顺序逐层展开。二、DatagenInfo数据生成的统一信息载体DatagenInfo定义在 datagen_info.py它的作用是把数据生成过程中反复需要的环境信息集中到一处避免每次生成都反复查询环境。构造器签名如下DatagenInfo( eef_poseNone, # 机器人末端执行器位姿形状 [..., 4, 4] object_posesNone, # dict物体名 - 物体位姿 [..., 4, 4] subtask_start_signalsNone, # dict子任务名 - 0/1 起始信号skillgen 必需 subtask_term_signalsNone, # dict子任务名 - 0/1 完成信号 target_eef_poseNone, # 各时间步的目标末端位姿 [..., 4, 4] gripper_actionNone, # 夹爪动作 [..., D]D 为夹爪执行维度 )关键设计点非强制全量类文档明确指出 not all information must be present六个字段均可为None这为不同类型任务如无夹爪、无参考物体留出灵活性。子任务信号的数据类型宽容subtask_start_signals与subtask_term_signals的每个值既可以是 Python 的float/int也可以是形状[..., 1]的torch.Tensor构造器对两种情况分别处理。这些信号是 skillgen 识别演示中子任务精确起止的关键依据见datagen_info.py第 64-83 行。to_dict()将非None字段导出为字典其中object_poses、子任务信号使用deepcopy防止调用方误改内部状态方便与录制器/导出管线对接。三、DataGenInfoPool演示池与子任务边界解析DataGenInfoPool定义在 datagen_info_pool.py是一个存放DatagenInfo的容器支持通过asyncio.Lock实现边消费边添加的线程安全因而可以被多个 mimic 数据生成器共享。3.1 构造与配置提取构造器接收env、env_cfg、device和可选的asyncio_lock。初始化时从env_cfg.subtask_configs按末端执行器名组织的SubTaskConfig列表提取三类信息第 45-54 行subtask_term_signal_names[eef_name]每个子任务的终止信号名subtask_start_offset_ranges[eef_name]/subtask_term_offset_ranges[eef_name]子任务起止边界的随机偏移范围。3.2 添加 episode 与边界计算add_episode(episode)是异步方法有锁时加锁内部调用_add_episode。该方法的处理流程第 89-204 行从 episode 观测的obs[datagen_info]中提取eef_pose、object_pose、target_eef_pose、subtask_term_signals及可选的subtask_start_signals缺失时抛出ValueError通过env.actions_to_gripper_actions(ep_grp[actions])把原始动作转换成夹爪动作组装DatagenInfo并追加到self._datagen_infos为每个末端执行器逐个解析子任务边界(start_index, end_index)skillgen 模式子任务起点由演示数据中的subtask_start_signals显式给出通过计算信号序列相邻差分diffs indicators[1:] - indicators[:-1]找到第一个 0→1 跳变位置作为起点终点同样由subtask_term_signals的第一个 0→1 跳变决定最后一个子任务没有终止信号以动作序列长度作为终点非 skillgen 模式子任务按顺序衔接前一个子任务的终点即后一个子任务的起点若end_index start_index则抛出ValueError终止信号未递增。此外_add_episode还对偏移范围做了两层一致性断言最坏情况下子任务不为空skillgen以及最大偏移下子任务之间不重叠两种模式各有独立的断言分支。3.3 从数据集文件加载load_from_dataset_file(file_path, select_demo_keysNone)使用isaaclab.utils.datasets.HDF5DatasetFileHandler打开 HDF5 文件遍历全部 episode可选按select_demo_keys过滤逐个调用_add_episode完成装载。四、SelectionStrategy源子任务片段选择策略选择策略解决当前场景下该选哪条源演示的子任务片段的问题实现在 selection_strategy.py。4.1 注册机制模块维护全局字典REGISTERED_SELECTION_STRATEGIES采用元类SelectionStrategyMeta自动注册任何继承SelectionStrategy且定义了NAME属性的类定义时即被登记。make_selection_strategy(name)按名称查表实例化assert_selection_strategy_exists(name)用于校验。抽象基类SelectionStrategy定义了抽象方法def select_source_demo(self, eef_pose, object_pose, src_subtask_datagen_infos): # eef_pose: 当前 4x4 末端位姿 # object_pose: 当前子任务参考物体的 4x4 位姿 # src_subtask_datagen_infos: 各源演示该子任务片段的 DatagenInfo 列表 # 返回选中的源演示索引 source_demo_ind4.2 三种内置策略注册名类选择逻辑randomRandomStrategy均匀随机返回一个源演示索引nearest_neighbor_objectNearestNeighborObjectStrategy选择当前场景物体位姿与源演示片段起始物体位姿最近的源演示nearest_neighbor_robot_distanceNearestNeighborRobotDistanceStrategy选择变换后片段首点位姿距当前末端位姿最近的源演示两个最近邻策略共享参数pos_weight位置权重默认 1.0、rot_weight旋转权重默认 1.0、nn_k从最近的前 k 个候选中均匀随机选一默认 3并采用相同的距离度量实现位置距离取 L2 欧氏距离旋转距离通过旋转矩阵差的对角线计算轴角表示下的夹角arc_cos_in (diag(delta_R).sum(-1) - 1) / 2并 clamp 到[-1, 1]保证数值稳定加权距离pos_weight * pos_dists rot_weight * rot_dists排序后取前nn_k个再从中均匀随机抽取兼顾贴近最佳与多样性。NearestNeighborRobotDistanceStrategy的实现细节值得注意它先把源末端位姿变换到源物体坐标系再应用当前物体位姿得到若使用该源片段变换后子任务的起始末端位姿最后度量其与当前末端位姿的距离——这正是DataGenerator中位姿变换逻辑的镜像选择与变换严格自洽。这些策略的选择正确性由 test_selection_strategy.py 验证测试构造两组距离悬殊的位姿簇反复调用select_source_demo最多 1000 次并断言选中索引始终落在正确簇内覆盖了位置噪声扰动下的鲁棒性。五、Waypoint 类族轨迹的表示、拼接与执行Waypoint、WaypointSequence、WaypointTrajectory、MultiWaypoint四个类定义在 waypoint.py构成了轨迹的层次化数据结构。Waypoint单个 6-DoF 目标点含pose4x4 位姿、gripper_action夹爪动作与可选的noise该时间步的动作噪声幅值只作用于手臂动作。WaypointSequenceWaypoint的有序列表。from_poses(poses, gripper_actions, action_noise)类方法支持把形状(T, 4, 4)的位姿序列批量转为航点序列action_noise既可以是标量广播为常值也可以是逐时间步张量。支持__add__拼接、split(ind)切分、last_waypoint取尾。WaypointTrajectory由若干WaypointSequence组成的完整轨迹。merge()实现子任务间衔接按num_steps_interp线性插值基于isaaclab.utils.math.interpolate_poses、按num_steps_fixed重复目标位姿并把other的首元素弹出以与插值段衔接pop_first()用于丢弃为插值临时加入的起点add_waypoint_sequence_for_target_pose()支持向目标位姿插值或恒定保持两种模式。MultiWaypoint同一时间步多个末端执行器航点的集合execute()将{eef_name: waypoint}组装为target_eef_pose_dict与gripper_action_dict调用环境的target_eef_pose_to_action()优先传action_noise_dict旧签名走noise参数兼容路径然后env.step()执行并用success_term判定任务成功返回布尔结果。六、DataGenerator数据生成主流水线DataGenerator是 data_generator.py 的核心类也是官方 API 文档列出的头号类。其文档明确描述了设计意图受 MimicGen 启发用少量人工采集的源演示生成新数据集——把演示解析为以物体为参考系的子任务片段存入DataGenInfoPool再按新场景上下文变换各片段并拼接成连贯的末端执行器轨迹。6.1 构造与入口DataGenerator( env: ManagerBasedRLMimicEnv, src_demo_datagen_info_pool: DataGenInfoPool | None None, dataset_path: str | None None, demo_keys: list[str] | None None, )构造时校验env.cfg为MimicEnvCfg并对任务规范做健全性检查每个末端执行器的最后一个子任务的subtask_term_offset_range必须为 (0, 0)终段不允许边界随机化。源演示池与数据集路径二选一否则抛ValueError。6.2 子任务边界随机化randomize_subtask_boundaries()根据任务规范为每个源演示、每个子任务采样随机的起止偏移第一个子任务的起点偏移来自first_subtask_start_offset_rangeskillgen 模式下每个子任务的起点可独立随机subtask_start_offset_range非 skillgen 模式则起点固定为前一子任务终点每个子任务的终点偏移采样自subtask_term_offset_range随后做三重断言子任务非空、起止索引严格递增、展平后索引不降序。6.3 源片段选择与位姿变换select_source_demo()把当前末端位姿、物体位姿与各源演示子任务片段信息交给所选策略。其约束是若子任务没有object_ref参考物体为 None只支持random策略。generate_eef_subtask_trajectory()是单子任务轨迹生成的核心关键步骤查询当前场景物体位姿env.get_object_poses判断是否需要重新选源默认仅首个子任务选源generation_select_src_per_subtaskTrue时每个子任务独立选源generation_select_src_per_armFalse时同一源演示在各臂间复用处理协调约束若当前子任务与并发任务有协调约束且并发任务已选定源演示则复用其源索引与 delta 变换按随机化边界切片源演示的末端位姿、目标位姿、夹爪动作若为首个子任务或generation_transform_first_robot_poseTrue在目标位姿序列前拼接源片段的首个末端位姿保证从真实机器人位姿开始插值而非直接跳到第一个目标点并同步补齐一条夹爪动作位姿变换分三种情形使用并发任务的delta 变换transform_source_data_segment_using_delta_object_pose按协调方案计算 deltaget_delta_pose_with_scheme支持SubTaskConstraintCoordinationScheme的TRANSFORM完整位姿差、TRANSLATE仅平移差、REPLAY恒等并可叠加coordination_scheme_pos_noise_scale/coordination_scheme_rot_noise_scale噪声常规情形使用物体坐标系变换transform_source_data_segment_using_object_pose先把源末端位姿变换到源物体坐标系再应用到当前物体坐标系从而保持目标末端位姿与物体位姿之间的相对关系不变无参考物体时原样保留。用WaypointSequence.from_poses构造航点序列并封装为WaypointTrajectory。6.4 子任务轨迹合并merge_eef_subtask_trajectory()负责把上一步生成的子任务轨迹并入整体可执行轨迹若generation_interpolate_from_last_target_poseTrue且非首个子任务则从上一段轨迹最后一个航点开始插值该航点未必已到达否则从当前机器人末端位姿开始。随后调用WaypointTrajectory.merge()执行num_interpolation_steps步插值与num_fixed_steps步保持噪声为apply_noise_during_interpolation * action_noise最后pop_first()丢弃为插值临时加入的起点。6.5 generate()整段演示的异步主循环generate()第 628 行起标注noqa: C901是数据生成的最外层入口返回字典含initial_state、states、observations、datagen_infos、actions、success、src_demo_inds等字段。其主流程skillgen 前置校验use_skillgenTrue时motion_planner必须提供否则抛ValueError重置环境通过recorder_manager.reset()与env_reset_queue异步配合记录新初始状态展开task_constraint_configs为运行时约束字典进入逐时间步 while 循环在asyncio.Lock保护下检查源演示池是否有新增有则重新随机化边界为处于子任务起点的末端执行器生成/合并轨迹skillgen 路径调用motion_planner.update_world_and_plan_motion()规划子任务间的无碰撞过渡轨迹目标为下一子任务首航点位姿与夹爪动作规划成功则先执行规划轨迹、暂存原子任务轨迹失败则返回{success: False}中止本次尝试规划轨迹通过_convert_planned_trajectory_to_waypoints()转成Waypoint列表噪声取自motion_planner.config.motion_noise_scale非 skillgen 路径直接用插值合并过渡按约束处理每臂每步的航点_SEQUENTIAL_LATTER约束在满足min_time_diff前停在原地等待前置子任务完成COORDINATION约束计算synchronous_steps两条并发子任务长度的最小值并支持coordination_synchronize_start同步启动保证并发任务同时结束组装MultiWaypoint并execute()用success_term判定成功支持use_navigation_controller的移动操作模式要求存在名为body的末端执行器配置导航未达目标时重复最后一步动作提前到达则跳过剩余导航轨迹全部末端执行器完成所有子任务后通过recorder_manager.set_success_to_episodes()写成功标志并按export_demo导出。七、配置体系DataGenConfig、SubTaskConfig 与约束配置类集中在 mimic_env_cfg.pyMimicEnvCfg通过datagen_config、subtask_configs、task_constraint_configs、mimic_recorder_config四个字段把生成逻辑接入任务环境。DataGenConfig关键字段默认值以仓库源码为准字段默认值说明namedemo生成过程名称generation_guaranteeTrue是否重试直到产出generation_num_trials条成功演示generation_keep_failedFalse是否保留失败试次调试低成功率时有用max_num_failures50停止生成前允许的最大失败次数seed1随机种子保证可复现source_dataset_path/generation_pathNone源数据集路径与生成结果保存路径generation_num_trials10生成试次数量generation_select_src_per_subtaskFalse是否每个子任务独立选源要求子任务间有合理时间约束generation_select_src_per_armFalse是否每只机械臂独立选源generation_transform_first_robot_poseFalse是否变换首段机器人位姿generation_interpolate_from_last_target_poseTrue是否从上个目标位姿开始插值use_skillgenFalse是否使用 skillgen运动规划器生成过渡轨迹use_navigation_controllerFalse是否使用导航控制器生成移动操作轨迹SubTaskConfig关键字段object_ref参考物体可 None、subtask_term_signal终止信号名、selection_strategyrandom/nearest_neighbor_object/nearest_neighbor_robot_distance后两者要求object_ref非 None通常成功率更高、selection_strategy_kwargs、first_subtask_start_offset_range、subtask_start_offset_range仅 skillgen 使用且会覆盖前者的语义、subtask_term_offset_range、action_noise默认 0.03、num_interpolation_steps默认 5、num_fixed_steps默认 0、apply_noise_during_interpolation默认 False。SubTaskConstraintConfig支持两种约束SEQUENTIAL顺序约束把约束展开为_SEQUENTIAL_FORMER/_SEQUENTIAL_LATTER一对运行时条目通过fulfilled标志让后者等待前者完成sequential_min_time_diff-1表示后者等前者完全结束才启动与COORDINATION并发协调通过共享selected_src_demo_ind与transform保证两条并发子任务使用同一源片段与同一变换synchronous_steps取两段长度最小值实现同时收尾。协调方案枚举SubTaskConstraintCoordinationScheme含REPLAY/TRANSFORM/TRANSLATE与 6.3 节的变换逻辑一一对应。实战配置示例可参考 franka_stack_ik_rel_mimic_env_cfg.pyFrankaCubeStackIKRelMimicEnvCfg继承任务环境与MimicEnvCfg在__post_init__中覆盖datagen_config如generation_num_trials10、generation_select_src_per_subtaskTrue、max_num_failures25并为抓取红方块、堆叠、抓取绿方块、堆叠四个子任务各配置一个SubTaskConfig——每个子任务给出object_refcube_1/2/3、subtask_term_signalgrasp_1/stack_1/grasp_2、subtask_term_offset_range(10, 20)、selection_strategynearest_neighbor_object、selection_strategy_kwargs{nn_k: 3}等参数最后一个子任务subtask_term_signalNone、偏移 (0,0)与DataGenerator构造器的健全性检查要求一致。八、实战运行generate_dataset.py 与异步生成框架命令行入口 generate_dataset.py 定义了完整参数集python scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \ --task TaskName \ --num_envs 4 \ --input_file /path/to/source_dataset.hdf5 \ --output_file ./datasets/output_dataset.hdf5 \ --generation_num_trials 10 \ [--use_skillgen] [--pause_subtask] [--disable_dataset_compression] [--external_callback path.to.fn]参数说明--task指定任务名缺省时从输入数据集元数据自动读取环境名见get_env_name_from_dataset()--input_file为源数据集路径必需--output_file默认./datasets/output_dataset.hdf5--use_skillgen启用 CuRobo 运动规划器每个环境一个CuroboPlanner仅第一个环境开启可视化以控制开销--external_callback可注入自定义环境注册回调。脚本在启动时依据datagen_config.seed统一设置random/np.random/torch三套随机种子。生成过程复用 generation.py 的异步框架setup_env_config()解析任务配置、提取terminations.success作为success_term缺失则抛NotImplementedError配置录制器输出路径/文件名/压缩并按generation_keep_failed决定导出模式EXPORT_SUCCEEDED_FAILED_IN_SEPARATE_FILES或EXPORT_SUCCEEDED_ONLYsetup_async_generation()创建共享DataGenInfoPool并载入源数据集为每个环境创建独立的run_data_generator异步任务env_loop()主环境步进循环在torch.inference_mode()下消费动作队列、处理重置队列并实时打印生成统计num_success/num_attempts与成功率百分比按generation_guarantee决定以成功数或尝试数作为终止条件同时监听数据生成任务是否异常退出data_gen_tasks.done()时重抛异常。九、测试与验证该模块的测试集中在 source/isaaclab_mimic/test/test_selection_strategy.py如第四节所述验证两种最近邻策略在两组位姿簇下的选择正确性与随机性test_generate_dataset_franka_state.py、test_generate_dataset_franka_visuomotor.py、test_generate_dataset_gr1t2_nutpour.py、test_generate_dataset_gr1t2_pickplace.py端到端验证generate_dataset.py在不同任务上的数据集生成流程test_generate_dataset_skillgen.py与test_curobo_planner_*.py验证 skillgen 路径下运动规划器与数据生成器的集成。这些测试表明datagen模块与ManagerBasedRLMimicEnv、录制器、CuRobo 规划器之间存在完整的可运行闭环可作为二次开发与回归验证的参考入口。十、总结isaaclab_mimic.datagen以物体坐标系下的子任务片段复用为设计主线把数据生成拆解为信息采集DatagenInfo/DataGenInfoPool、源片段选择SelectionStrategy、位姿变换与轨迹装配DataGeneratorWaypoint类族、异步批量执行generation.py四个层次并通过DataGenConfig/SubTaskConfig/SubTaskConstraintConfig实现任务的参数化配置。无论你是想基于现有任务直接运行generate_dataset.py扩充数据集还是希望自定义选择策略、加入新任务约束或接入运动规划器上述源码路径与配置入口都能作为可靠的开发起点。【免费下载链接】IsaacLabUnified framework for robot learning built on NVIDIA Isaac Sim项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLab创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考