ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IsaacLab 多资产生成实战:RigidObjectCollection 与 Multi-Asset Spawner 构建多样化仿真环境

IsaacLab 多资产生成实战:RigidObjectCollection 与 Multi-Asset Spawner 构建多样化仿真环境 IsaacLab 多资产生成实战RigidObjectCollection 与 Multi-Asset Spawner 构建多样化仿真环境【免费下载链接】IsaacLabUnified framework for robot learning built on NVIDIA Isaac Sim项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLab本篇指南基于 IsaacLab 官方 how-to 文档 multi_asset_spawning.rst讲解 IsaacLab 中两种“多资产生成multi-asset spawning”机制刚体对象集合Rigid Object Collections与同路径多资产/多 USD 生成MultiAssetSpawnerCfg/MultiUsdFileCfg。读完本篇后你将掌握如何在每个并行环境中生成多个刚体并用统一的(env_ids, obj_ids)索引 API 批量操作它们以及如何让不同环境在同一路径下随机生成不同的刚体或不同的四足机器人并理解底层replicate_physics克隆优化开关对异质场景的影响。1. 背景常规生成是“同一资产复制”多资产生成要解决什么在 spawn prims 教程介绍的典型配置中生成配置会将同一个资产或同一个 USD prim复制到表达式解析出的各个 prim 路径上。例如将资产生成在/World/Table_*/Object时实际会在/World/Table_0/Object、/World/Table_1/Object……等路径上创建完全相同的资产实例。但在以下两类场景中简单复制不够用每个环境需要多个不同刚体且希望用统一 API 访问/修改它们并提升性能 —— 对应机制一刚体对象集合Rigid Object Collections不同环境需要不同的资产例如随机选取不同机器人或不同碰撞体构建多样化/随机化的仿真场景 —— 对应机制二同一 prim 路径下生成不同资产Spawning different assets under the same prim path。官方参考脚本为 multi_asset.py该脚本创建多个环境每个环境中包含一个刚体对象集合含一个圆锥cone、一个立方体cube和一个球体sphere一个刚体对象随机是圆锥、立方体或球体之一一个关节体articulation随机是 ANYmal-C 或 ANYmal-D 机器人。2. 机制一RigidObjectCollection 刚体对象集合RigidObjectCollectionCfg允许在每个环境中生成多个刚体并通过统一的(env_ids, obj_ids)索引 API 访问与修改。虽然也可以分别 spawn 多个刚体但集合 API 更友好、更高效——底层用单一 physics view 统一处理集合内的全部对象而不是每个对象各建一个 view。配置类定义在 rigid_object_collection_cfg.py核心属性是rigid_objects一个以字符串键为唯一标识的dict[str, RigidObjectCfg]键名如object_A在后续代码中作为该对象的唯一 ID 使用。在 multi_asset.py 中集合配置位于场景配置类的object_collection字段L139-L182包含三个成员对象每个成员都是标准的RigidObjectCfg可以独立指定prim_path、spawn资产与物理属性、init_state# object collection object_collection: RigidObjectCollectionCfg RigidObjectCollectionCfg( rigid_objects{ object_A: RigidObjectCfg( prim_path/World/envs/env_.*/Object_A, spawnsim_utils.SphereCfg( radius0.1, visual_materialsim_utils.PreviewSurfaceCfg(diffuse_color(1.0, 0.0, 0.0), metallic0.2), rigid_propssim_utils.RigidBodyPropertiesCfg( solver_position_iteration_count4, solver_velocity_iteration_count0 ), mass_propssim_utils.MassPropertiesCfg(mass1.0), collision_propssim_utils.CollisionPropertiesCfg(), ), init_stateRigidObjectCfg.InitialStateCfg(pos(0.0, -0.5, 2.0)), ), object_B: RigidObjectCfg( prim_path/World/envs/env_.*/Object_B, spawnsim_utils.CuboidCfg( size(0.1, 0.1, 0.1), visual_materialsim_utils.PreviewSurfaceCfg(diffuse_color(1.0, 0.0, 0.0), metallic0.2), rigid_propssim_utils.RigidBodyPropertiesCfg( solver_position_iteration_count4, solver_velocity_iteration_count0 ), mass_propssim_utils.MassPropertiesCfg(mass1.0), collision_propssim_utils.CollisionPropertiesCfg(), ), init_stateRigidObjectCfg.InitialStateCfg(pos(0.0, 0.5, 2.0)), ), object_C: RigidObjectCfg( prim_path/World/envs/env_.*/Object_C, spawnsim_utils.ConeCfg( radius0.1, height0.3, visual_materialsim_utils.PreviewSurfaceCfg(diffuse_color(1.0, 0.0, 0.0), metallic0.2), rigid_propssim_utils.RigidBodyPropertiesCfg( solver_position_iteration_count4, solver_velocity_iteration_count0 ), mass_propssim_utils.MassPropertiesCfg(mass1.0), collision_propssim_utils.CollisionPropertiesCfg(), ), init_stateRigidObjectCfg.InitialStateCfg(pos(0.5, 0.0, 2.0)), ), } )在 multi_asset.py 的模拟循环中集合对象通过scene[object_collection]取出L231重置时对整集合使用write_body_pose_to_sim_index/write_body_com_velocity_to_sim_index这类“批量索引”写入接口L250-L254一次调用即覆盖所有环境的多个物体这正是单一 physics view 带来效率收益的体现。RigidObjectCollection资产类实现位于 rigid_object_collection.py 及 base_rigid_object_collection.py。3. 机制二-AMultiAssetSpawnerCfg 在同一路径生成不同刚体把RigidObjectCfg的spawn配置设为MultiAssetSpawnerCfg即可声明一个“候选资产列表”在指定的 prim 路径上从中选取资产生成# rigid object object: RigidObjectCfg RigidObjectCfg( prim_path/World/envs/env_.*/Object, spawnsim_utils.MultiAssetSpawnerCfg( assets_cfg[ sim_utils.ConeCfg( radius0.3, height0.6, visual_materialsim_utils.PreviewSurfaceCfg(diffuse_color(0.0, 1.0, 0.0), metallic0.2), ), sim_utils.CuboidCfg( size(0.3, 0.3, 0.3), visual_materialsim_utils.PreviewSurfaceCfg(diffuse_color(1.0, 0.0, 0.0), metallic0.2), ), sim_utils.SphereCfg( radius0.3, visual_materialsim_utils.PreviewSurfaceCfg(diffuse_color(0.0, 0.0, 1.0), metallic0.2), ), ], random_choiceTrue, rigid_propssim_utils.RigidBodyPropertiesCfg( solver_position_iteration_count4, solver_velocity_iteration_count0 ), mass_propssim_utils.MassPropertiesCfg(mass1.0), collision_propssim_utils.CollisionPropertiesCfg(), ), init_stateRigidObjectCfg.InitialStateCfg(pos(0.0, 0.0, 2.0)), )对应 multi_asset.py L109-L136。结合 wrappers_cfg.py 的源码有几点关键行为值得注意属性覆盖规则MultiAssetSpawnerCfg继承自RigidObjectSpawnerCfg与DeformableObjectSpawnerCfg。在配置层即MultiAssetSpawnerCfg自身指定的属性会覆盖assets_cfg中各资产配置的对应属性——例如指定了mass_props各资产的默认质量都会被统一改写。这简化了对相似属性的全局配置源码注释中说明此设计就是为了 “simplify configuring similar properties globally”见 wrappers_cfg.py#L17-L21。两个例外visible属性被忽略以各资产自身配置为准semantic_tags若指定则会追加到每个资产的语义标签上。random_choice与异质克隆开关random_choiceTrue时每次生成从列表中随机选取一个资产。源码中该属性已标注 deprecated 警告提示改用场景级开关InteractiveSceneCfg.random_heterogeneous_cloning见 wrappers_cfg.py#L43-L51。也就是说从当前源码结构看“是否随机异构克隆”正逐步收敛到InteractiveSceneCfg层统一管理而示例脚本仍按旧用法传入random_choiceTrue。实际生成入口func字段指向{DIR}.wrappers:spawn_multi_asset即底层由spawn_multi_asset函数完成解析与生成spawn_paths可选属性允许为每个候选资产显式指定具体生成路径None条目被跳过。4. 机制二-BMultiUsdFileCfg 在同一路径生成不同 USD关节体对于关节体思路相同把ArticulationCfg的spawn设为MultiUsdFileCfg它继承自UsdFileCfgusd_path可以是一个路径或路径列表配置层指定的属性会被应用到所有导入的 USD 资产上。示例脚本用 ANYmal-C 与 ANYmal-D 两个 USD 做随机选择multi_asset.py L184-L218# articulation robot: ArticulationCfg ArticulationCfg( prim_path/World/envs/env_.*/Robot, spawnsim_utils.MultiUsdFileCfg( usd_path[ f{ISAACLAB_NUCLEUS_DIR}/Robots/ANYbotics/ANYmal-C/anymal_c.usd, f{ISAACLAB_NUCLEUS_DIR}/Robots/ANYbotics/ANYmal-D/anymal_d.usd, ], random_choiceTrue, rigid_propssim_utils.RigidBodyPropertiesCfg( disable_gravityFalse, retain_accelerationsFalse, linear_damping0.0, angular_damping0.0, max_linear_velocity1000.0, max_angular_velocity1000.0, max_depenetration_velocity1.0, ), articulation_propssim_utils.ArticulationRootPropertiesCfg( enabled_self_collisionsTrue, solver_position_iteration_count4, solver_velocity_iteration_count0 ), activate_contact_sensorsTrue, ), init_stateArticulationCfg.InitialStateCfg( pos(0.0, 0.0, 0.6), joint_pos{ .*HAA: 0.0, # all HAA .*F_HFE: 0.4, # both front HFE .*H_HFE: -0.4, # both hind HFE .*F_KFE: -0.8, # both front KFE .*H_KFE: 0.8, # both hind KFE }, ), actuators{legs: ANYDRIVE_3_LSTM_ACTUATOR_CFG}, )与MultiAssetSpawnerCfg类似MultiUsdFileCfg的random_choice在源码中同样带 deprecated 警告、建议迁移到InteractiveSceneCfg.random_heterogeneous_cloningwrappers_cfg.py#L79-L89其func指向spawn_multi_usd_file。由于 ANYmal-C 与 ANYmal-D 的连杆/关节拓扑一致才能共用同一套joint_pos正则匹配.*HAA等与执行器配置。脚本还展示了在场景创建后做属性级随机化的方式randomize_shape_color()L73-L89先通过sim_utils.find_matching_prim_paths解析正则路径再对每个环境的手动克隆 prim 用Sdf.ChangeBlock随机写入diffuseColor演示了“生成之后再做异构化”的扩展空间。5. 注意事项资产结构一致性与 physics replication 开关5.1 所有位置的资产必须保持相似结构使用同一物理接口RigidObject 或 Articulation 类统一处理多个资产时所有环境 prim 位置上的资产必须具有相似结构。对关节体而言意味着所有候选 USD 必须拥有相同数量的 links、joints 和 collision bodies且命名一致否则物理引擎解析 prims 时可能出错甚至失败。这一点也直接体现在上面示例的选型上ANYmal-C/D 拓扑一致、joint_pos用正则统一匹配。从设计目标看该功能的主要用途是生成同一资产的随机化变体——例如连杆长度不同的机器人、碰撞体形状不同的刚体——而非任意结构差异巨大的资产混搭。5.2 关闭 InteractiveScene 的 physics replicationInteractiveScene.replicate_physics默认为True。该标志告知物理引擎“各仿真环境互为副本”因此只需解析第一个环境即可理解整个仿真场景从而加速场景解析。源码定义见 interactive_scene_cfg.py#L87-L99False时允许每个环境持有不同的资产实例代价是场景设置与解析速度下降。当不同环境生成不同资产时“环境互为副本”的假设不再成立按文档要求必须将该标志置为False# 构建场景时参考 multi_asset.py 的 main 函数写法 scene_cfg MultiObjectSceneCfg(num_envsargs_cli.num_envs, env_spacing2.0) scene_cfg.replicate_physics False scene InteractiveScene(scene_cfg)需要注意当前示例脚本 multi_asset.py 在main()中构建场景时仍写作replicate_physicsTrueL294在自己的项目中使用异质生成不同环境不同资产时请按文档说明显式关闭该标志。模板克隆系统的完整策略与碰撞过滤filter_collisions、scene.filter_collisions()请参阅 cloning 指南。6. 运行与验证参考脚本的运行命令来自原文档python scripts/demos/multi_asset.py --num_envs 2048脚本文件头的用法注释multi_asset.py L8-L12给出了等价写法在 IsaacLab 环境脚本就绪后./isaaclab.sh -p scripts/demos/multi_asset.py --num_envs 2048该命令以 2048 个环境运行仿真每个环境的刚体与机器人都从候选列表中随机选取--num_envs默认为 512argparse 定义L26demos 默认打开 Kit 可视化窗口L30。停止仿真关闭窗口或在终端按CtrlC。脚本每 250 步重置一次场景状态L239-L271可以持续观察随机资产的重初始化行为。7. 小结需求配置类位置spawn 字段底层生成函数每环境多个刚体、统一索引操作RigidObjectCollectionCfg场景实体字段rigid_objects字典单一 physics view 统一托管每环境随机不同刚体MultiAssetSpawnerCfgRigidObjectCfg.spawnspawn_multi_asset每环境随机不同 USD 关节体MultiUsdFileCfgArticulationCfg.spawnspawn_multi_usd_file实践建议优先用RigidObjectCollectionCfg聚合同环境内的多个刚体以获得更优性能与更简洁的(env_ids, obj_ids)API仅在确实需要“同路径异构资产”时才启用两个 Multi spawner并遵守“资产结构一致 关闭replicate_physics”两条约束才能保证物理解析稳定。【免费下载链接】IsaacLabUnified framework for robot learning built on NVIDIA Isaac Sim项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLab创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表