Skip to content

[Question] How to add USD with spatial tendons to ArticulationCfg #4589

@eweissm

Description

@eweissm

Question

Hello, how do I spawn an asset with spatial tendons with ArticulationCfg in a manager based workflow?

I have a USD of a robot with spatial tendons:

Image

I am trying use the manager based workflow to train a policy for the robot. When I run the scripts zero_agent.py the log warns:
"2026-02-10T21:06:23Z [17,565ms] [Warning] [omni.physxui.plugin] PhysX Spatial Tendon: Cannot add attachment /World/envs/env_0/Robot/base/A3 to simulation while simulation is running. It is displayed but does not affect the simulation."

It seems I need to spawn the asset before starting the simulation, but I am not sure how to do this with the manager based workflow.

Here is environment configuration:

import isaaclab.sim as sim_utils
from isaaclab.envs import ViewerCfg
from isaaclab.managers import EventTermCfg as EventTerm
from isaaclab.managers import ObservationGroupCfg as ObsGroup
from isaaclab.managers import ObservationTermCfg as ObsTerm
from isaaclab.managers import RewardTermCfg, SceneEntityCfg
from isaaclab.managers import TerminationTermCfg as DoneTerm
from isaaclab.utils import configclass
from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise
from isaaclab.actuators import DelayedPDActuatorCfg, IdealPDActuatorCfg
from isaaclab.assets.articulation import ArticulationCfg
from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR
import math
from isaaclab.envs import ManagerBasedRLEnvCfg
from . import mdp as Spine_mdp
import isaaclab.envs.mdp as mdp
from isaaclab.scene import InteractiveSceneCfg
from dataclasses import MISSING
from isaaclab.assets import AssetBaseCfg



##
# Pre-defined configs
##

Spine_v1_CFG= ArticulationCfg(
    spawn=sim_utils.UsdFileCfg(
        usd_path=f"C:/Users/eweissm1/projects/assets/Q1-RB/ExploratorySpine2.usd",
        activate_contact_sensors=True,
        rigid_props=sim_utils.RigidBodyPropertiesCfg(
            disable_gravity=False,
            retain_accelerations=False,
            linear_damping=0.0,
            angular_damping=0.0,
            max_linear_velocity=1000.0,
            max_angular_velocity=1000.0,
            max_depenetration_velocity=1.0,
        ),
        articulation_props=sim_utils.ArticulationRootPropertiesCfg(
            enabled_self_collisions=True,
            solver_position_iteration_count=4,
            solver_velocity_iteration_count=0,
            fix_root_link= True
        ),
    ),
    init_state=ArticulationCfg.InitialStateCfg(
        pos=(0.0, 0.0, 0.4),
        joint_pos={".*": 0.0},  # all joints
        joint_vel={".*": 0.0},
    ),
    actuators={
        "spine_v1__cable_joints": DelayedPDActuatorCfg(
            joint_names_expr=["m_.*"],
            effort_limit=100.0,
            stiffness=1000.0,
            damping=10,
            min_delay=0,  # physics time steps (min: 2.0*0=0.0ms)
            max_delay=20,  # physics time steps (max: 2.0*4=8.0ms) #changed from 4 to 40
            velocity_limit = 20,
            friction = 1.0,
        ),

        "spine_v1_passive_joints": IdealPDActuatorCfg(
            joint_names_expr=["p_.*"],
            effort_limit=100.0,
            stiffness=0.05,
            damping=.01,
            velocity_limit = 100,
            friction = .1,
        )
    }
)


@configclass
class MySceneCfg(InteractiveSceneCfg):
    """Configuration for the terrain scene with a legged robot.""" 
    # robots
    robot: ArticulationCfg = MISSING

    sky_light = AssetBaseCfg(
        prim_path="/World/skyLight",
        spawn=sim_utils.DomeLightCfg(
            intensity=750.0,
            texture_file=f"{ISAAC_NUCLEUS_DIR}/Materials/Textures/Skies/PolyHaven/kloofendal_43d_clear_puresky_4k.hdr",
        ),
    )


@configclass
class Spine_ActionsCfg:
    ...

@configclass
class Spine_CommandsCfg:
   ...

@configclass
class Spine_ObservationsCfg:
    ...

@configclass
class Spine_EventCfg:
    ...
      
@configclass
class Spine_RewardsCfg:
     ...

class Spine_CurriculumCfg:
    ...

@configclass
class Spine_TerminationsCfg:
    ...
    

@configclass
class Spine_EnvCfg(ManagerBasedRLEnvCfg):

    scene: MySceneCfg = MySceneCfg(num_envs=4096, env_spacing=2.5)

    # Basic settings
    observations: Spine_ObservationsCfg = Spine_ObservationsCfg()
    actions: Spine_ActionsCfg = Spine_ActionsCfg()
    commands: Spine_CommandsCfg = Spine_CommandsCfg()

    # MDP setting
    rewards: Spine_RewardsCfg = Spine_RewardsCfg()
    terminations: Spine_TerminationsCfg = Spine_TerminationsCfg()
    events: Spine_EventCfg = Spine_EventCfg()

    curriculum: Spine_CurriculumCfg = Spine_CurriculumCfg()


    # Viewer
    viewer = ViewerCfg(eye=(10.5, 10.5, 0.3), origin_type="world", env_index=0, asset_name="robot")

    def __post_init__(self):
   

        # general settings
        self.decimation = 10  # 50 Hz
        self.episode_length_s = 20.0
        # simulation settings
        self.sim.dt = 0.002  # 500 Hz        self.sim.render_interval = self.decimation
        self.sim.physics_material.static_friction = 1.0
        self.sim.physics_material.dynamic_friction = 1.0
        self.sim.physics_material.friction_combine_mode = "multiply"
        self.sim.physics_material.restitution_combine_mode = "multiply"
        # update sensor update periods
        # we tick all the sensors based on the smallest update period (physics update period)

        self.observations.policy.enable_corruption = True #added to add noise to policy

        # switch robot
        self.scene.robot = Spine_v1_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")
        

Build Info

Describe the versions that you are currently using:

  • Isaac Lab Version: 2.3.0
  • Isaac Sim Version: 5.1.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions