isaacsim 中打开GPU物理模拟,仿真时,viewpoint似乎不渲染,停在最初位置,这是为什么?

请使用下面的模版提问(创建话题后勾选相应的选项):
硬件环境
Workstation

软件版本
Isaac Sim 4.5

系统环境
Ubuntu 20.04

问题描述
isaacsim 中打开GPU物理模拟,仿真时,viewpoint似乎不渲染,停在最初位置,这是为什么?

参考代码如下
from isaacsim import SimulationApp

LAUNCHER_CONFIG = {
“headless”: True, # 显示 GUI (设置为 True 可在服务器上运行)
“active_gpu”: 0, # 应用程序/渲染使用 GPU 0
“physics_gpu”: 0, # [关键] 物理仿真使用 GPU 0 (cuda:0)
“multi_gpu”: True, # 启用多 GPU 支持
“width”: 1280,
“height”: 720,
“renderer”: “RaytracedLighting”,
“vsync”: True, # 启用垂直同步
}

启动 Isaac Sim 应用程序

print(“Starting SimulationApp…”)
simulation_app = SimulationApp(LAUNCHER_CONFIG)

simulation_app = SimulationApp({“headless”: False})

import omni.physics.tensors as tensors
from isaacsim.core.api import SimulationContext
from isaacsim.core.simulation_manager import SimulationManager
from omni.isaac.core.physics_context import PhysicsContext
from omni.isaac.core import World
from isaacsim.core.prims import Articulation
from isaacsim.core.utils.stage import add_reference_to_stage, get_stage_units
from isaacsim.core.cloner import GridCloner, Cloner
import isaacsim.core.utils.stage as stage_utils

from pxr import UsdPhysics
from pxr import Sdf, Usd, PhysxSchema

import sys

import carb
import numpy as np

from isaacsim.core.api.robots import Robot

from isaacsim.core.utils.types import ArticulationAction
from isaacsim.storage.native import get_assets_root_path

from pxr import UsdGeom
from pxr import UsdLux, UsdGeom, Gf, Sdf

from isaacsim.core.api.materials import PhysicsMaterial

from omni.isaac.core.prims import RigidPrim

from isaacsim.core.prims import RigidPrim
from isaacsim.core.prims import GeometryPrim
from isaacsim.core.prims import SdfShapePrim

import torch

import omni.kit.app
import carb
import time

sim_manager = SimulationManager()

sim_manager.enable_fabric(True)

def main():
my_world = World(backend = ‘torch’,
device = ‘cuda’,
physics_dt = 0.01,
rendering_dt =0.01,
stage_units_in_meters = 1.0)
my_world.scene.add_default_ground_plane()

dome = UsdLux.DomeLight.Define(my_world.stage, "/World/Ambient")
dome.CreateIntensityAttr(2000)

sim_context = SimulationContext().instance()

#
USD_PATH = "XXX"
ENV_ZERO_PATH = "/World/envs/env_0"
NUM_ENVS = 2


add_reference_to_stage(USD_PATH, prim_path=f"{ENV_ZERO_PATH}/XXXX")
UsdGeom.Xform.Define(stage_utils.get_current_stage(), ENV_ZERO_PATH)

cloner = GridCloner(spacing=5, num_per_row=10)
base_env_pos = np.array([0, 0, 1.0])
positions = np.tile(base_env_pos, (NUM_ENVS, 1))

cloner.clone(
source_prim_path=ENV_ZERO_PATH,
prim_paths=cloner.generate_paths("/World/envs/env", NUM_ENVS),
copy_from_source=True,
enable_env_ids=True,
position_offsets=positions
)

# reset
my_world.reset()


physics_sim_view = my_world.physics_sim_view
articulation_view = physics_sim_view.create_articulation_view("/World/envs/env*/XXXXX/base_link")
my_world.play()

while simulation_app.is_running():
    simulation_app.update()

    

simulation_app.close()
print("Simulation App closed.")

if name == ‘main’:
main()

Hi joop2131,

几个建议可以试下
1)headless这个设置launcher里是true,但后面的app里又是false,要一致
2)一般gpu是否打开不会影响viewport,但可以试下multi-gpu为false看下
3)render一般都需要world.step(render=True), 你的代码里没有看到,参考标准代码再试试,Proximity Sensor — Isaac Sim Documentation

from isaacsim import SimulationApp
simulation_app = SimulationApp({“headless”: False})
from isaacsim.core.api import SimulationContext

import argparse
import sys

import carb
import numpy as np
from isaacsim.core.api import World
from isaacsim.core.api.robots import Robot
from isaacsim.core.utils.stage import add_reference_to_stage, get_stage_units
from isaacsim.core.utils.types import ArticulationAction
from isaacsim.storage.native import get_assets_root_path
from isaacsim.core.prims import Articulation
from pxr import UsdGeom
from pxr import UsdLux, UsdGeom, Gf, Sdf
from pxr import UsdPhysics
from isaacsim.core.api.materials import PhysicsMaterial

from omni.isaac.core.prims import RigidPrim

from isaacsim.core.prims import RigidPrim
from isaacsim.core.prims import GeometryPrim
from isaacsim.core.prims import SdfShapePrim
from pxr import Sdf, Usd, PhysxSchema

from isaacsim.core.simulation_manager import SimulationManager
from omni.isaac.core.physics_context import PhysicsContext
import isaacsim.core.utils.stage as stage_utils
from isaacsim.core.api.scenes import Scene

def main():

my_world = World(backend = 'torch',
             device = 'cuda:0',
             physics_dt = 0.01,
             rendering_dt =0.01,
             stage_units_in_meters = 1.0,
             set_defaults = True)
                    

my_world.scene.add_default_ground_plane()

asset_path = "/XXX.usd"
add_reference_to_stage(usd_path=asset_path, prim_path="/World/XXX")


my_world.reset() #

my_world.reset()

print(my_world.get_physics_dt())


all_steps = 100000
for i in range(all_steps):
          my_world.step(render=True)

print('_')
simulation_app.close()

if name==‘main’:
main()
问题似乎没有得到解决。一个重要发现是,所附的代码中,当我将my_world的参数设置为 my_world = World(backend = ‘torch’,
device = ‘cpu’,
physics_dt = 0.01,
rendering_dt =0.01,
stage_units_in_meters = 1.0,
set_defaults = True) 即,将device 调整为 cpu时,viewport就可以同步渲染仿真中的机器人运动,但是只要我设置device 调整为 cuda:0时,viewport就不能同步渲染我的机器人运动,viewport界面一直停在刚开始的初始位置?我的显卡型号时 RTX 3060,这会有影响吗?您能帮我分析一下问题可能在哪里吗?感谢

hi joop2131,

把simulation_app.update(),换为my_world.step(render=True), simulation_app.update() 只负责更新 UI/事件和做一次渲染,不会推进物理仿真步长