创建一个空场景#

本教程介绍如何通过独立 Python 脚本启动和控制 Isaac Sim 仿真器。我们将在 Isaac Lab 中搭建空场景,并介绍框架的两个主要入口: app.launch_simulation() 上下文管理器和 sim.SimulationContext 类。

请在开始本教程之前查看 Isaac Sim 工作流 ,以获得对与仿真器一起工作的初步了解。

代码#

本教程对应于 scripts/tutorials/00_sim 目录中的 create_empty.py 脚本。

create_empty.py 的代码
 1# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
 2# All rights reserved.
 3#
 4# SPDX-License-Identifier: BSD-3-Clause
 5
 6"""This script demonstrates how to create a simple stage in Isaac Sim.
 7
 8.. code-block:: bash
 9
10    # Usage
11    uv run python scripts/tutorials/00_sim/create_empty.py
12
13"""
14
15"""Parse the command-line arguments first."""
16
17
18import argparse
19
20from isaaclab.app import add_launcher_args, launch_simulation
21
22# create argparser
23parser = argparse.ArgumentParser(description="Tutorial on creating an empty stage.")
24# append simulation launcher cli args
25add_launcher_args(parser)
26# parse the arguments
27args_cli = parser.parse_args()
28
29"""Rest everything follows."""
30
31from isaaclab.sim import SimulationCfg, SimulationContext
32
33
34def main():
35    """Main function."""
36
37    # Configure the simulation
38    sim_cfg = SimulationCfg(dt=0.01, device=args_cli.device)
39    # Launch the simulator runtime that the configuration needs
40    with launch_simulation(sim_cfg, args_cli):
41        # Initialize the simulation context
42        sim = SimulationContext(sim_cfg)
43        # Set main camera
44        sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0])
45
46        # Play the simulator
47        sim.reset()
48        # Now we are ready!
49        print("[INFO]: Setup complete...")
50
51        # Simulate physics
52        while sim.is_running():
53            # perform step
54            sim.step()
55
56
57if __name__ == "__main__":
58    # run the main function
59    main()

代码解释#

解析命令行参数#

独立脚本首先解析命令行参数。此时尚未启动仿真器;确定仿真配置需要哪种运行时后,再启动它。

将用户定义的 argparse.ArgumentParser 实例传给 app.add_launcher_args() ,即可添加启动相关的命令行选项,包括选择仿真设备的 --device 、打开可视化窗口的 --visualizer (或 --viz ),以及启用仿真器串流的 --livestream 。这些选项随后传给 app.launch_simulation() 。

import argparse

from isaaclab.app import add_launcher_args, launch_simulation

# create argparser
parser = argparse.ArgumentParser(description="Tutorial on creating an empty stage.")
# append simulation launcher cli args
add_launcher_args(parser)
# parse the arguments
args_cli = parser.parse_args()

导入 python 模块#

Isaac Lab 配置类和工具可在仿真器启动前导入。需要仿真器运行的模块,例如 Isaac Sim 的 omni.* 、 isaacsim.* 模块,以及操作 USD 舞台的 Isaac Lab 类,则要在启动后导入,后续教程会展示这种用法。这里导入以下模块:

  • isaaclab.sim:Isaac Lab 中用于所有核心仿真器相关操作的子包。

from isaaclab.sim import SimulationCfg, SimulationContext

配置仿真上下文#

当从独立脚本启动仿真器时,用户可以完全控制仿真器的播放、暂停和步进。所有这些操作都通过 仿真上下文 处理。它负责各种时间轴事件,并为仿真配置物理场景。

Isaac Lab 的 sim.SimulationContext 封装了 Isaac Sim 的仿真栈,可以通过 Python dataclass 对象配置仿真,并处理仿真步进中的一些细节。

对于本教程,我们将将物理和渲染时间步长设置为 0.01 秒。通过将这些数量传递给 sim.SimulationCfg ,然后用它创建仿真上下文的实例。

创建仿真上下文前,必须先启动仿真器运行时。 app.launch_simulation() 上下文管理器会结合给定配置和已解析的命令行参数,只启动实际需要的运行时。默认 PhysX 物理后端运行在 Isaac Sim(Kit)内,因此这里会启动 Isaac Sim;Newton 等不依赖 Kit 的后端则完全不需要 Isaac Sim。除非请求可视化器,例如指定 --viz kit ,否则仿真以无界面模式运行。所有使用仿真器的代码均放在 with 块内,离开该代码块时会自动关闭运行时。

    # Configure the simulation
    sim_cfg = SimulationCfg(dt=0.01, device=args_cli.device)
    # Launch the simulator runtime that the configuration needs
    with launch_simulation(sim_cfg, args_cli):
        # Initialize the simulation context
        sim = SimulationContext(sim_cfg)
        # Set main camera
        sim.set_camera_view([2.5, 2.5, 2.5], [0.0, 0.0, 0.0])

创建仿真上下文后,我们只配置了作用于仿真场景的物理。这包括用于仿真的设备、重力矢量和其他高级求解器参数。现在还有两个主要步骤剩下来运行仿真:

  1. 设计仿真场景: 添加传感器、机器人和其他仿真对象

  2. 运行仿真循环: 使仿真器进行步进,并从仿真器中设置和获取数据

在本教程中,我们首先看 Step 2 的空场景,以便首先关注仿真控制。在以下教程中,我们将深入研究 Step 1 和使用仿真处理程序与仿真器进行交互。

运行仿真#

在设置仿真场景之后,第一件事是调用 sim.SimulationContext.reset() 方法。此方法播放时间轴并初始化仿真器中的物理处理。在第一次步进仿真器之前必须始终调用此方法,否则仿真处理不会正确初始化。

备注

sim.SimulationContext.reset() 与 sim.SimulationContext.play() 不同:后者仅播放时间线,不会初始化物理句柄。

启动仿真时间轴后,我们建立一个简单的仿真循环,反复推进仿真器。没有打开可视化器时,循环条件 sim.SimulationContext.is_running() 会让循环持续运行;否则循环在最后一个可视化窗口关闭时结束。 sim.SimulationContext.step() 接受 render 参数,决定这一步是否包含渲染相关事件的更新。默认值为 True。

        # Play the simulator
        sim.reset()
        # Now we are ready!
        print("[INFO]: Setup complete...")

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

退出仿真#

无需显式调用关闭函数。仿真循环结束、离开 with launch_simulation(...) 块时,仿真器运行时会停止,窗口也会关闭。

代码执行#

现在我们已经浏览了代码,让我们运行脚本并查看结果:

python scripts/tutorials/00_sim/create_empty.py --viz kit

仿真应该正在进行,并且场景应该正在渲染。要停止仿真,可以关闭窗口或在终端中按下 Ctrl+C 。

create_empty.py 的结果

向上述脚本传入 --help ,可查看之前由 app.add_launcher_args() 添加的各种命令行参数。以无界面模式运行时,省略可视化器选项:

python scripts/tutorials/00_sim/create_empty.py

如果配置或命令已选择可视化器,可用 --visualizer none 或 --viz none 强制禁用所有可视化器。

现在我们对如何运行仿真有了基本的了解,让我们转到下一个教程,在那里我们将学习如何将资产添加到场景。