AttributeError: 'NoneType' object has no attribute '_physx_interface

I’m still working with my linear motor plane.

Now I can apply a force on it, but I can get its postition callback.Below is my code now:

import omni.usd
import omni.physx.scripts.physicsUtils as physicsUtils
from pxr import Usd, UsdPhysics, Gf, UsdGeom
from isaacsim.core.api import SimulationContext
import carb


stage = omni.usd.get_context().get_stage()


cad_prim_path = "/World/Move/Stage/Mesh_016"


simulation_context = SimulationContext()


cad_prim = stage.GetPrimAtPath(cad_prim_path)
if not cad_prim.IsValid():
    carb.log_error(f"Prim at path {cad_prim_path} is not valid. Please ensure the USD stage is loaded correctly.")
    exit()

xform_api = UsdGeom.Xformable(cad_prim) 



def get_prim_position_callback(step_size):

    world_transform = xform_api.GetLocalTransformation()
    position = world_transform.ExtractTranslation()

    carb.log_info(f"Prim '{cad_prim_path}' current position: {position}")


rigid_body_api = UsdPhysics.RigidBodyAPI.Get(stage, cad_prim_path)

force_to_apply = Gf.Vec3f(0.0, 20.0, 0.0) 
torque_to_apply = Gf.Vec3f(0.0, 0.0, 0.0) 

physicsUtils.add_force_torque(
        stage=stage,
        path=cad_prim_path,
        force=force_to_apply,
        torque=torque_to_apply,
        mode="force",         
        isWorldSpace=True     
    )

carb.log_info(f"Force applied to {cad_prim_path}. Start simulation by pressing 'Play' in the GUI to see position             updates.")


simulation_context.play()


simulation_context.add_physics_callback("cad_prim_position_logger", get_prim_position_callback)

And I got this error:

Traceback (most recent call last) Traceback (most recent call last):
File “c:/isaacsim/exts/isaacsim.code_editor.vscode/isaacsim/code_editor/vscode/executor.py”, line 78, in execute
result = eval(code, self._globals, self._locals)
File “”, line 54, in
File “c:/isaacsim/exts/isaacsim.core.api/isaacsim/core/api/simulation_context/simulation_context.py”, line 967, in add_physics_callback
] = self._physics_context._physx_interface.subscribe_physics_step_events(callback_fn)
AttributeError: ‘NoneType’ object has no attribute '_physx_interface

@chesterhsu0923 not sure if this thread is relevant?

Thanks for reply!But it still can’t work.
It looks like it still not subscribed to my PhysicScene

import omni.usd
import omni.physx.scripts.physicsUtils as physicsUtils
from pxr import Usd, UsdPhysics, Gf, UsdGeom
from isaacsim.core.api import SimulationContext
import carb


stage = omni.usd.get_context().get_stage()


cad_prim_path = "/World/Move/Stage/Mesh_016"

physics_scene_prim_path = "/World/PhysicsScene"


simulation_context = SimulationContext(physics_prim_path=physics_scene_prim_path)
simulation_context.initialize_physics()

print(simulation_context)

cad_prim = stage.GetPrimAtPath(cad_prim_path)
if not cad_prim.IsValid():
    carb.log_error(f"Prim at path {cad_prim_path} is not valid. Please ensure the USD stage is loaded correctly.")
   exit()

xform_api = UsdGeom.Xformable(cad_prim) 





def get_prim_position_callback(step_size):

   world_transform = xform_api.GetLocalTransformation()
   position = world_transform.ExtractTranslation()

   carb.log_info(f"Prim '{cad_prim_path}' current position: {position}")


rigid_body_api = UsdPhysics.RigidBodyAPI.Get(stage, cad_prim_path)

force_to_apply = Gf.Vec3f(0.0, 15.0, 0.0) 
torque_to_apply = Gf.Vec3f(0.0, 0.0, 0.0) 

physicsUtils.add_force_torque(
        stage=stage,
        path=cad_prim_path,
        force=force_to_apply,
        torque=torque_to_apply,
        mode="force",         
        isWorldSpace=True     
    )

carb.log_info(f"Force applied to {cad_prim_path}. Start simulation by pressing 'Play' in the GUI to see position updates.")


simulation_context.play()




simulation_context.add_physics_callback("cad_prim_position_logger", get_prim_position_callback)

It still the same error AttributeError: ‘NoneType’ object has no attribute '_physx_interface
but when I print(simulation_context), it gets
<isaacsim.core.api.simulation_context.simulation_context.SimulationContext object at 0x000001EAF7BB7A00>
I don’t understand where is my falut

Hi @chesterhsu0923, thanks for reaching out. Could you please share the usd file shown in the image?

I am unable to reproduce the error you shared, this is my script (I’ve replaced the Mesh with a TestCube for now)


from isaacsim import SimulationApp

simulation_app = SimulationApp({"headless": False})

import omni.usd
import omni.physx.scripts.physicsUtils as physicsUtils
from pxr import Usd, UsdPhysics, Gf, UsdGeom
from isaacsim.core.api import SimulationContext
import carb


stage = omni.usd.get_context().get_stage()

cad_prim_path = "/World/Move/Stage/Mesh_016"

physics_scene_prim_path = "/World/PhysicsScene"

# Ensure physics scene exists
if not stage.GetPrimAtPath(physics_scene_prim_path).IsValid():
    UsdPhysics.Scene.Define(stage, physics_scene_prim_path)

simulation_context = SimulationContext(physics_prim_path=physics_scene_prim_path)
simulation_context.initialize_physics()

cad_prim = stage.GetPrimAtPath(cad_prim_path)
if not cad_prim.IsValid():
    print(f"Original prim not found. Creating test cube...")
    
    # Create a simple test cube
    cad_prim_path = "/World/TestCube"
    cube_geom = UsdGeom.Cube.Define(stage, cad_prim_path)
    cube_geom.CreateSizeAttr(1.0)
    cube_geom.AddTranslateOp().Set(Gf.Vec3f(0.0, 0.0, 2.0))
    
    # Add physics
    UsdPhysics.RigidBodyAPI.Apply(cube_geom.GetPrim())
    UsdPhysics.CollisionAPI.Apply(cube_geom.GetPrim())
    UsdPhysics.MeshCollisionAPI.Apply(cube_geom.GetPrim())
    
    cad_prim = stage.GetPrimAtPath(cad_prim_path)
    print(f"Created test cube at {cad_prim_path}")

xform_api = UsdGeom.Xformable(cad_prim) 

def get_prim_position_callback(step_size):

   world_transform = xform_api.GetLocalTransformation()
   position = world_transform.ExtractTranslation()

   # Use print instead of carb.log_info to see output in console
   print(f"Prim '{cad_prim_path}' current position: {position}")


rigid_body_api = UsdPhysics.RigidBodyAPI.Get(stage, cad_prim_path)

force_to_apply = Gf.Vec3f(0.0, 15.0, 0.0) 
torque_to_apply = Gf.Vec3f(0.0, 0.0, 0.0) 

physicsUtils.add_force_torque(
        stage=stage,
        path=cad_prim_path,
        force=force_to_apply,
        torque=torque_to_apply,
        mode="force",         
        isWorldSpace=True     
    )

simulation_context.play()

simulation_context.add_physics_callback("cube_position_logger", get_prim_position_callback)

print("Simulation running... Close the window to exit.")
while simulation_app.is_running():
    simulation_context.step(render=True)

Try this:

from isaacsim.core.api import SimulationContext
from isaacsim.core.api.physics_context import PhysicsContext
# set your own prim_path path here:
PhysicsContext_instance = PhysicsContext(prim_path="/World/PhysicsScene")
simulation_context = SimulationContext()
simulation_context._physics_context = PhysicsContext_instance # weird insertion to assure _physics_context, I think it is a bug.
1 Like