IsaacLab最新2025教程(3)-搭建训练场景

前言

本文将详细介绍如何使用Isaac Lab进行场景搭建与物理仿真,为后续的训练打下基础。文章以IsaacLab官方tutorial为基础,从环境搭建开始,逐步实现一个包含多种物体的仿真场景,并分享开发过程中的经验。官方连接:Tutorials — Isaac Lab Documentation

开发环境

IsaacLab/IsaacSim 4.5.0(Ubuntu 22.04)

代码解析

这篇文章包含了前三个tutorials:Create empty scene, spawn prims, deep-dive into AppLauncher.

代码如下:

# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause

import argparse

from isaaclab.app import AppLauncher

# 使用parser在运行脚本时候可以直接传入超参数
parser = argparse.ArgumentParser(description="Tutorial on running IsaacSim via the AppLauncher.")
parser.add_argument("--size", type=float, default=1.0, help="Side-length of cuboid")
# SimulationApp 超参数列表https://docs.omniverse.nvidia.com/py/isaacsim/source/isaacsim.simulation_app/docs/index.html?highlight=simulationapp#isaacsim.simulation_app.SimulationApp
parser.add_argument(
    "--width", type=int, default=1280, help="Width of the viewport and generated images. Defaults to 1280"
)
parser.add_argument(
    "--height", type=int, default=720, help="Height of the viewport and generated images. Defaults to 720"
)

# 添加parser到launcher里面
AppLauncher.add_app_launcher_args(parser)
args_cli = parser.parse_args()
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app

###################################
#截止到这里是如何通过IsaacLab加载IsaacSim simulator并设置特定超参数的常规流程。
#因为Sim是仿真#器,Lab只是训练框架,所以加载Sim是必不可少的。
#大家可以熟记整个流程,有助于后续的开发,特别是headless模式,设置保存的ideo的时候。
###################################


###################################
#下面的代码是设计环境的流程,非常建议大家反复观看理解,对后续看代码非常有帮助。
#如之前所说,机器人+learning综合了仿真和训练两个流程,再加上代码追求解耦模块化,
#在看大项目时候很容易淹没在各种各样的脚本文件抓不到主干思路。
#虽然后续的代码会将design_scene模块化,但是整体思路是相似的。
###################################

import isaacsim.core.utils.prims as prim_utils

import isaaclab.sim as sim_utils
from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR


def design_scene():
    """Designs the scene by spawning ground plane, light, objects and meshes from usd files."""
    # Ground-plane
    cfg_ground = sim_utils.GroundPlaneCfg()
    cfg_ground.func("/World/defaultGroundPlane", cfg_ground)

    # spawn distant light
    cfg_light_distant = sim_utils.DistantLightCfg(
        intensity=3000.0,
        color=(0.75, 0.75, 0.75),
    )
    cfg_light_distant.func("/World/lightDistant", cfg_light_distant, translation=(1, 0, 10))
    

    ###################################    
    #到这里上面都是加载地面,灯光啊之类的东西,不是特别重要,复制粘贴就行了
    #要注意IsaacLab思路很OOP,把各个object比如地面,灯光,刚体,变形体等封装成类
    #设置超参数,调用,然后用.func加载,一般是这个思路。
    ###################################

    # create a new xform prim for all objects to be spawned under
    # prim是IsaacSim的特色,类似于一个筐,筐里面可以装rigidbody,articulation各种类
    # 需要的时候就直接拎筐,打开筐,从筐里取出自己需要的,所以创建prim基本上是必备的。
    # 而且看代码也可以发现这个是直接从isaacsim调用的,不是从isaaclab包
    prim_utils.create_prim("/World/Objects", "Xform")

    # 先生成物体的设置,再用.func()加载。基本的形状都有封装,建议大家多F12看看源代码
    cfg_cone = sim_utils.ConeCfg(
        radius=0.15,
        height=0.5,
        visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(1.0, 0.0, 0.0)),
    )
    cfg_cone.func("/World/Objects/Cone1", cfg_cone, translation=(-1.0, 1.0, 1.0))
    cfg_cone.func("/World/Objects/Cone2", cfg_cone, translation=(-1.0, -1.0, 1.0))

    # spawn a green cone with colliders and rigid body
    # 这里是加载刚体的属性,如果没有这些属性的话默认是None,不具备属性,无碰撞也不受重力影响,
    # 建议大家运行一下对比效果,更加直观
    cfg_cone_rigid = sim_utils.ConeCfg(
        radius=0.15,
        height=0.5,
        rigid_props=sim_utils.RigidBodyPropertiesCfg(),
        mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
        collision_props=sim_utils.CollisionPropertiesCfg(),
        visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)),
    )
    cfg_cone_rigid.func(
        "/World/Objects/ConeRigid", 
        cfg_cone_rigid, 
        translation=(-0.2, 0.0, 2.0), 
        orientation=(0.5, 0.0, 0.5, 0.0)
    )

    # spawn a blue cuboid with deformable body
    cfg_cuboid_deformable = sim_utils.MeshCuboidCfg(
        size=(0.2, 0.5, 0.2),
        deformable_props=sim_utils.DeformableBodyPropertiesCfg(),
        visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 0.0, 1.0)),
        physics_material=sim_utils.DeformableBodyMaterialCfg(),
    )
    cfg_cuboid_deformable.func(
        "/World/Objects/CuboidDeformable", 
        cfg_cuboid_deformable, 
        translation=(0.15, 0.0, 2.0)
    )

    # spawn a usd file of a table into the scene
    # 这个UsdFileCfg很重要,建议大家反复看源代码,熟练掌握,因为自定义环境都需要用自己的模型
    # 很少用自带的cone,cube等简单形状,这些单纯就是入门用的。
    # 熟悉掌握这个类对物理仿真很有帮助,可以避免很多莫名其妙的报错。
    cfg = sim_utils.UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd")
    
cfg.func(
        "/World/Objects/Table", 
        cfg, 
        translation=(0.0, 0.0, 1.05)
    )



###################################    
#到这里基本上就算设计环境的流程了,大家掌握思路,后续看一些lab_task会轻松很多
#下面的就是如何打开仿真器,加载设计的环境了。
###################################


def main():
    """Main function."""

    # Initialize the simulation context
    # 这个sim_cfg也很重要,重力,物理推理时间间隔,渲染时间等等,对训练都有影响,建议多看源码
    sim_cfg = sim_utils.SimulationCfg(dt=0.01, device=args_cli.device)
    sim = sim_utils.SimulationContext(sim_cfg)
    # Set main camera
    sim.set_camera_view([2.0, 0.0, 2.5], [-0.5, 0.0, 0.5])

    # Design scene by adding assets to it
    design_scene()

    # Play the simulator
    sim.reset()
    print("[INFO]: Setup complete...")

    # Simulate physics
    while simulation_app.is_running():
        # perform step
        sim.step()


if __name__ == "__main__":
    # run the main function
    main()
    # close sim app
    simulation_app.close()

Tips

以上代码综合了三个tutorial的内容,主要关于如何设计,加载自定义训练环境,这个代码主要是用来入门,基本上不会用在后续开发,重点是理解IsaacLab/IsaacSim的仿真思路,未来debug的时候非常有用。一方面可以快速确定bug是训练代码的问题还是仿真的问题,另外一方面任务特定仿真需求可以有清晰的解决思路。建议大家试着搭建一下自己实验平台的仿真,后续会加上控制方面的内容。