第七讲、在Isaaclab中使用交互式场景
0 前言
官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/02_scene/create_scene.html
Isaacsim+Isaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm=1001.2014.3001.5502
到目前为止,在本教程中,我们手动将不同的资产(地平面、光源、刚体、关节等)添加到仿真模拟中,并创建对象实例来与它们交互。但,随着场景复杂度的增加,手动执行这些任务变得繁琐。在本教程中,我们将介绍一个scene.InteractiveScene
类,它提供了一个便捷的接口,用于在模拟中生成prim并进行管理。
从更高层次上讲,交互式场景是对象实体的集合。每个实体可以是非交互式的prim(例如地平面、光源)、交互式的prim(例如关节、刚体)或传感器(例如摄像头、激光雷达)。scene.InteractiveScene
类提供了一个便捷的接口,用于生成这些实体并在仿真模拟中进行管理。
教程对应的脚本为create_scene.py
在scripts/tutorials/02_scene
目录下。
运行该程序:
- 进入安装 isaac lab 时创建的conda虚拟环境
- 在该环境下进入 isaac sim文件夹中运行
source setup_conda_env.sh
- 终端中输入
python scripts/tutorials/02_scene/create_scene.py --num_envs 32
运行你的代码。
注:这个关于推车杆的案例,在之前有讲过,可以两个结合起来来看,传送门放在下方
第五讲、Isaaclab中与关节交互
1 场景配置
场景由一系列实体组成,每个实体都有各自的配置。这些配置在继承自 的配置类中指定scene.InteractiveSceneCfg
。然后将配置类传递给scene.InteractiveScene
构造函数以创建场景。
对于 cartpole
示例,我们指定与上一教程相同的配置,但现在在CartpoleSceneCfg
配置类中列出它们,而不是手动生成它们。
@configclass # 装饰器,标识这是一个配置类(通常用于自动化配置解析/序列化)
class CartpoleSceneCfg(InteractiveSceneCfg): # 继承自交互式场景配置基类"""Configuration for a cart-pole scene."""# === 地面配置 ===ground = AssetBaseCfg(prim_path="/World/defaultGroundPlane", spawn=sim_utils.GroundPlaneCfg())# === 灯光配置 ===dome_light = AssetBaseCfg(prim_path="/World/Light", spawn=sim_utils.DomeLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75)))# === 机器人关节配置 ===cartpole: ArticulationCfg = CARTPOLE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
配置类中的变量名(如 ground, dome_light, cartpole)会被用作键(keys),通过 scene[“key_name”] 直接访问场景中的对应实体。
-
实体配置
- 非交互式实体(Non-interactive Prims)
- 类型:地面(ground)、光源(dome_light)等静态或被动实体。
- 配置类:AssetBaseCfg
- 特点:不参与物理模拟的交互(如碰撞、动力学计算),仅作为场景中的静态存在(如背景、照明)。
ground = AssetBaseCfg(prim_path="/World/defaultGroundPlane", ...)
- 交互式实体(Interactive Prims)
- 类型:机器人(cartpole)、传感器等需要动态交互的实体。
- 配置类:ArticulationCfg(对关节机器人)、RigidObjectCfg(对刚体对象)
- 特点:参与物理模拟(如运动学、碰撞检测),需要动态控制(如机器人关节驱动)。
cartpole: ArticulationCfg = CARTPOLE_CFG.replace(...)
- 非交互式实体(Non-interactive Prims)
-
Prim路径
- 绝对路径
- 用途:全局唯一的实体(如地面、光源)。
- 特点:所有环境共享同一个实体,路径固定,不可复制。
- 实例:
prim_path="/World/defaultGroundPlane" # 地面路径 prim_path="/World/Light" # 光源路径
- 相对路径(含环境命名空间变量)
- 用途:需要为每个环境单独克隆的实体(如多个机器人的独立实例)。
- 变量替换:
{ENV_REGEX_NS}
会在运行时被替换为/World/envs/env_0
,/World/envs/env_1
等,每个环境(env_0, env_1, …)中会生成独立的机器人实例。 - 实例:
prim_path="{ENV_REGEX_NS}/Robot" # 动态路径
- 场景克隆:在并行训练或批量仿真时,每个环境拥有独立的实体副本,互不影响。
- 绝对路径
2 场景实例
与之前调用design_scene
函数创建场景不同,现在我们创建scene.InteractiveScene
类的实例,并将配置对象传递给其构造函数。
在创建配置实例时,CartpoleSceneCfg
类允许使用num_envs
参数指定要创建的环境副本数量。
# num_envs ➜ 并行运行的独立环境数量(强化学习中常见于批量训练)env_spacing ➜环境实例之间的物理距离(单位:米,防止渲染重叠)# args_cli.num_envs ➜ 从命令行参数获取环境数量scene_cfg = CartpoleSceneCfg(num_envs=args_cli.num_envs, env_spacing=2.0)# 使用配置对象实例化交互式场景scene = InteractiveScene(scene_cfg)
3 访问场景元素
在前面已经提及,配置类中的变量名(如 ground, dome_light, cartpole)会被用作键(keys),通过 scene[“key_name”] 直接访问场景中的对应实体。
robot = scene["cartpole"]
4 进行模拟循环
该脚本的其余部分看起来与第五讲交互的脚本类似assets.Articulation
,但在调用的方法上有一些细微的差别:
assets.Articulation.reset()
⟶scene.InteractiveScene.reset()
assets.Articulation.write_data_to_sim()
⟶scene.InteractiveScene.write_data_to_sim()
assets.Articulation.update()
⟶scene.InteractiveScene.update()
注:这部分可以对应scripts/tutorials/01_assets/run_articulation.py
和scripts/tutorials/02_scene/create_scene.py
的具体内容来看,要注意的是上面给出的差别是类的,在代码中可能已经实例化了,比如第一个区别展现在代码里实际上是robot.reset()
和scene.reset()