I can’t add a visualization marker for the command of this custom robot manager-based RL environment. I set debug_viz=True
and also added this line of code
goal_pose_visualizer_cfg = VisualizationMarkersCfg(
prim_path="{ENV_REGEX_NS}/Marker",
markers={
'goal': sim_utils.UsdFileCfg(
usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/UIElements/frame_prim.usd",
scale=(1.0, 1.0, 1.0),
)
}
)
This is my entire code.
import argparse
from omni.isaac.lab.app import AppLauncher
parser = argparse.ArgumentParser(description="Manager-based base environment tutorial.")
parser.add_argument('--num_envs', type=int, default=2, help='Number of environments.')
AppLauncher.add_app_launcher_args(parser)
args_cli = parser.parse_args()
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app
import math
import torch
import os
import omni.isaac.lab.sim as sim_utils
import omni.isaac.lab.envs.mdp as mdp
from omni.isaac.lab.envs import ManagerBasedEnv, ManagerBasedEnvCfg
from omni.isaac.lab.managers import EventTermCfg as EventTerm
from omni.isaac.lab.managers import ObservationGroupCfg as ObsGroup
from omni.isaac.lab.managers import ObservationTermCfg as ObsTerm
from omni.isaac.lab.managers import TerminationTermCfg as DoneTerm
from omni.isaac.lab.managers import RewardTermCfg as RewTerm
from omni.isaac.lab.managers import CommandTerm
from omni.isaac.lab.managers import SceneEntityCfg
from omni.isaac.lab.actuators import ImplicitActuatorCfg
from omni.isaac.lab.assets import ArticulationCfg, AssetBaseCfg, RigidObjectCfg
from omni.isaac.lab.markers import VisualizationMarkersCfg
from omni.isaac.lab.scene import InteractiveSceneCfg
import omni.isaac.lab_tasks.manager_based.manipulation.reach.mdp as mdp
from omni.isaac.lab.utils.noise import AdditiveUniformNoiseCfg as Unoise
from omni.isaac.lab.utils.assets import ISAAC_NUCLEUS_DIR
from omni.isaac.lab.utils import configclass
ARCTOS_CFG = ArticulationCfg(
spawn=sim_utils.UsdFileCfg(
usd_path=os.path.join(os.getcwd(), 'scripts', 'arctos.usd'),
activate_contact_sensors=False,
rigid_props=sim_utils.RigidBodyPropertiesCfg(
disable_gravity=False,
max_depenetration_velocity=5.0,
),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=True,
solver_position_iteration_count=8,
solver_velocity_iteration_count=2,
),
visual_material= sim_utils.PreviewSurfaceCfg(diffuse_color=(0.75, 0.75, 0.75))
),
init_state=ArticulationCfg.InitialStateCfg(
joint_pos={
'arctos_x': 0.0,
'arctos_y': 0.0,
'arctos_z': 0.0,
'arctos_a': 0.0,
'arctos_b': 0.0,
'arctos_c': 0.0,
'slide_left': 0.0,
'slide_right': 0.0,
},
joint_vel={
'.*': 0.0,
},
),
actuators={
"arm": ImplicitActuatorCfg(
joint_names_expr=["arctos_.*"],
velocity_limit=0.6,
effort_limit={
"arctos_.*": 80.0,
},
stiffness={
"arctos_.*": 40.0,
},
damping={
"arctos_.*": 1.0,
},
),
"gripper": ImplicitActuatorCfg(
joint_names_expr=['slide_.*'],
velocity_limit=1.0,
effort_limit={
"slide_.*": 80.0,
},
stiffness={
"slide_.*": 1.5,
},
damping={
"slide_.*": 0.1,
},
),
},
soft_joint_pos_limit_factor=1.05
)
@configclass
class ArctosReachSceneCfg(InteractiveSceneCfg):
ground = AssetBaseCfg(prim_path='/World/defaultGroundPlane', spawn=sim_utils.GroundPlaneCfg())
light = AssetBaseCfg(prim_path='/World/light', spawn=sim_utils.DistantLightCfg(intensity=3000.0, color=(0.75, 0.75, 0.75)))
table = RigidObjectCfg(
prim_path="{ENV_REGEX_NS}/Table",
spawn=sim_utils.CuboidCfg(
size=(0.8, 0.8, 0.8),
rigid_props=sim_utils.RigidBodyPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(mass=1000.0),
collision_props=sim_utils.CollisionPropertiesCfg(),
visual_material=sim_utils.PreviewSurfaceCfg(metallic=0.2, diffuse_color=(0.05, 0.05, 0.05)),
),
)
robot = ARCTOS_CFG.replace(prim_path="{ENV_REGEX_NS}/Arctos")
robot.init_state.pos = (-0.3, 0.0, 0.81)
@configclass
class CommandsCfg:
"""Command terms for the MDP."""
ee_pose = mdp.UniformPoseCommandCfg(
asset_name="robot",
body_name='slide_left',
resampling_time_range=(4.0, 4.0),
debug_vis=True,
ranges=mdp.UniformPoseCommandCfg.Ranges(
pos_x=(0.35, 0.65),
pos_y=(-0.2, 0.2),
pos_z=(0.15, 0.5),
roll=(0.0, 0.0),
pitch=(0.0, 0.0), # depends on end-effector axis
yaw=(-3.14, 3.14),
),
goal_pose_visualizer_cfg = VisualizationMarkersCfg(
prim_path="{ENV_REGEX_NS}/Marker",
markers={
'goal': sim_utils.UsdFileCfg(
usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/UIElements/frame_prim.usd",
scale=(1.0, 1.0, 1.0),
)
}
)
)
@configclass
class ActionsCfg:
joint_positions = mdp.RelativeJointPositionActionCfg(asset_name='robot', joint_names=['.*'], scale=1.0)
@configclass
class ObservationsCfg:
@configclass
class PolicyCfg(ObsGroup):
joint_pos_rel = ObsTerm(func=mdp.joint_pos_rel, noise=Unoise(n_min=-0.01, n_max=0.01))
joint_vel_rel = ObsTerm(func=mdp.joint_vel_rel, noise=Unoise(n_min=-0.01, n_max=0.01))
def __post_init__(self) -> None:
self.enable_corruption = False
self.concatenate_terms = True
policy: PolicyCfg = PolicyCfg()
@configclass
class EventCfg:
reset_joint_positions = EventTerm(func=mdp.reset_joints_by_offset,
mode='reset',
params={
'asset_cfg': SceneEntityCfg('robot', joint_names=['.*']),
'position_range': (-0.125 * math.pi, 0.125 * math.pi),
"velocity_range": (-0.01 * math.pi, 0.01 * math.pi),
},
)
@configclass
class RewardsCfg:
"""Reward terms for the MDP."""
# task terms
end_effector_position_tracking = RewTerm(
func=mdp.position_command_error,
weight=-0.2,
params={"asset_cfg": SceneEntityCfg("robot", body_names=['slide_left']), "command_name": "ee_pose"},
)
end_effector_position_tracking_fine_grained = RewTerm(
func=mdp.position_command_error_tanh,
weight=0.1,
params={"asset_cfg": SceneEntityCfg("robot", body_names=['slide_left']), "std": 0.1, "command_name": "ee_pose"},
)
end_effector_orientation_tracking = RewTerm(
func=mdp.orientation_command_error,
weight=-0.1,
params={"asset_cfg": SceneEntityCfg("robot", body_names=['slide_left']), "command_name": "ee_pose"},
)
# action penalty
action_rate = RewTerm(func=mdp.action_rate_l2, weight=-0.0001)
joint_vel = RewTerm(
func=mdp.joint_vel_l2,
weight=-0.0001,
params={"asset_cfg": SceneEntityCfg("robot")},
)
@configclass
class TerminationsCfg:
"""Termination terms for the MDP."""
time_out = DoneTerm(func=mdp.time_out, time_out=True)
@configclass
class ArctosReachEnvCfg(ManagerBasedEnvCfg):
scene = ArctosReachSceneCfg(num_envs=args_cli.num_envs, env_spacing=2.5)
commands = CommandsCfg()
observations = ObservationsCfg()
actions = ActionsCfg()
events = EventCfg()
rewards = RewardsCfg()
terminations = TerminationsCfg()
def __post_init__(self):
# viewer settings
self.viewer.eye = [4.5, 0.0, 6.0]
self.viewer.lookat = [0.0, 0.0, 2.0]
# step settings
self.decimation = 4
# simulation settings
self.sim.dt = 0.005
self.sim.render_interval = self.decimation
def main():
env_cfg = ArctosReachEnvCfg()
env = ManagerBasedEnv(env_cfg)
count = 0
while simulation_app.is_running():
with torch.inference_mode():
if count % 300 == 0:
count = 0
env.reset()
print("[INFO]: Resetting the environment...")
joint_efforts = torch.randn_like(env.action_manager.action)
obs, _ = env.step(joint_efforts)
print("[Env 0]: Joint Position: ", obs["policy"][0])
count += 1
env.close()
if __name__ == '__main__':
main()
simulation_app.close()