Regarding the issue of vehicle wheels and rotary joints in Isaac Lab

Hello everyone, I have created a manager-based task in Isaac Lab, where a Forklift robot is supposed to navigate to a target location. In the Actioncfg I set up, there are two rear wheel joints of the forklift and the rotation joint of the rear wheel. The problem now is that during training, the rear wheels spin very fast, but the movement of the forklift is very slow. What could be the reason? Here is the code.
If you could help, I would be extremely grateful!

FORKLIFT_CFG = ArticulationCfg(
prim_path=“{ENV_REGEX_NS}/Robot”,
spawn=sim_utils.UsdFileCfg(
usd_path=f"/home/pc5/Downloads/4.5/Isaac/Robots/Forklift/forklift_c.usd",
rigid_props=sim_utils.RigidBodyPropertiesCfg(
rigid_body_enabled=True,
max_linear_velocity=1000.0,
max_angular_velocity=1000.0,
max_depenetration_velocity=100.0,
enable_gyroscopic_forces=True,
),
# physics_material=sim_utils.RigidBodyMaterialCfg(),
# visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.5, 0.0, 0.0)),
# collision_props=sim_utils.CollisionPropertiesCfg(),
mass_props=sim_utils.MassPropertiesCfg(density=10000.0),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=False,
solver_position_iteration_count=4,
solver_velocity_iteration_count=0,
sleep_threshold=0.005,
stabilization_threshold=0.001,
),
activate_contact_sensors=True,
),
init_state=ArticulationCfg.InitialStateCfg(
pos=(-3.0, 0.0, 0.03),
joint_pos={
“left_front_wheel_joint”: 0.0,
“right_front_wheel_joint”: 0.0,
“left_rotator_joint”: 0.0,
“right_rotator_joint”: 0.0,
# “lift_joint”: 0.1,
“left_back_wheel_joint”: 0.0,
“right_back_wheel_joint”: 0.0,
}
),
actuators={
“left_front_wheel_joint”: ImplicitActuatorCfg(
joint_names_expr=[“left_front_wheel_joint”],
velocity_limit=10.0,
effort_limit=100.0,
stiffness=0.0,
damping=100.0,
),
“right_front_wheel_joint”: ImplicitActuatorCfg(
joint_names_expr=[“right_front_wheel_joint”],
velocity_limit=10.0,
effort_limit=100.0,
stiffness=0.0,
damping=100.0,
),

    "left_rotator_joint": ImplicitActuatorCfg(
        joint_names_expr=["left_rotator_joint"],
        velocity_limit=5.0,
        effort_limit=200.0,
        stiffness=4000.0,
        damping=400.0,
    ),
    "right_rotator_joint": ImplicitActuatorCfg(
        joint_names_expr=["right_rotator_joint"],
        velocity_limit=5.0,
        effort_limit=200.0,
        stiffness=4000.0,
        damping=400.0,
    ),

    "left_back_wheel_joint": ImplicitActuatorCfg(
        joint_names_expr=["left_back_wheel_joint"],
        velocity_limit=10.0,
        effort_limit=100.0,
        stiffness=0.0,
        damping=100.0,
    ),
    "right_back_wheel_joint": ImplicitActuatorCfg(
        joint_names_expr=["right_back_wheel_joint"],
        velocity_limit=10.0,
        effort_limit=100.0,
        stiffness=0.0,
        damping=100.0,
    ),
    # "lift_joint": ImplicitActuatorCfg(
    #     joint_names_expr=["lift_joint"],
    #     velocity_limit=50.0,
    #     effort_limit=200.0,
    #     stiffness=100.0,
    #     damping=1.0,
    # ),
},

)

import isaaclab.sim as sim_utils
from isaaclab.assets import AssetBaseCfg, Articulation, ArticulationCfg
from isaaclab.envs import ManagerBasedRLEnvCfg
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 as RewTerm
from isaaclab.managers import SceneEntityCfg
from isaaclab.managers import TerminationTermCfg as DoneTerm
from isaaclab.scene import InteractiveSceneCfg
from isaaclab.terrains import TerrainImporterCfg
from isaaclab.sensors import ContactSensorCfg
from isaaclab.utils import configclass
import random

import isaaclab_tasks.manager_based.classic.humanoid.mdp as mdp

import isaaclab_tasks.manager_based.classic.forklift.mdp as mdp
from isaaclab.assets import RigidObjectCfg
import math

Pre-defined configs

from isaaclab_assets.robots.forklift_d import FORKLIFT_CFG # isort: skip
from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR

@configclass
class MySceneCfg(InteractiveSceneCfg):
“”“Configuration for the terrain scene with an ant robot.”“”

# terrain
terrain = TerrainImporterCfg(
    prim_path="/World/ground",
    terrain_type="plane",
    collision_group=-1,
    physics_material=sim_utils.RigidBodyMaterialCfg(
        friction_combine_mode="average",
        restitution_combine_mode="average",
        static_friction=0.5,
        dynamic_friction=0.5,
        restitution=0.0,
    ),
    debug_vis=False,
)

# warehouse
warehouse = AssetBaseCfg(
    prim_path="{ENV_REGEX_NS}/Warehouse", 
    spawn=sim_utils.UsdFileCfg(
        usd_path=f"{ISAAC_NUCLEUS_DIR}/Environments/Simple_Warehouse/warehouse_multiple_shelves.usd", 
    ), 
    init_state=AssetBaseCfg.InitialStateCfg(
        pos=(0,0,0),
    )
)


# robot
robot = FORKLIFT_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot", 
    init_state=ArticulationCfg.InitialStateCfg(
    pos=(0, -9.5, 0),
    rot=(0.70711,0,0,0.70711),
    # joint_pos={
    #     "left_front_wheel_joint": 0.0,
    #     "right_front_wheel_joint": 0.0,
    #     "left_rotator_joint": 0.0,
    #     "right_rotator_joint": 0.0,
    #     "lift_joint": 0.1,
    #     "left_back_wheel_joint": 0.0,
    #     "right_back_wheel_joint": 0.0,
    # }
),)


contact_forces = ContactSensorCfg(
    prim_path="{ENV_REGEX_NS}/Robot/.*", update_period=0.0, history_length=6, debug_vis=True
)

# lights
light = AssetBaseCfg(prim_path="/World/light",spawn=sim_utils.DistantLightCfg(color=(0.75, 0.75, 0.75), intensity=5000.0),)

aim: RigidObjectCfg = RigidObjectCfg(
    prim_path="{ENV_REGEX_NS}/cube",
    spawn=sim_utils.CuboidCfg(
        size=(1, 1, 1),
        rigid_props=sim_utils.RigidBodyPropertiesCfg(
            max_depenetration_velocity=1.0, 
            kinematic_enabled=True,  # 设置该物体是否为运动学物体(这里是False,意味着该物体会受到物理引擎影响)
            disable_gravity=True,  # 不禁用重力
            sleep_threshold=0.005,  # 物体处于静止时的阈值
            stabilization_threshold=0.0025,  # 稳定性阈值
        ),
        physics_material=sim_utils.RigidBodyMaterialCfg(),
        visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 0.5, 0.0)),
        collision_props=sim_utils.CollisionPropertiesCfg(),  # 碰撞属性配置(这里为空,表示使用默认配置)
        # mass_props=sim_utils.MassPropertiesCfg(density=500.0),  # 质量属性,物体的密度为500 kg/m³
    ),
    init_state=RigidObjectCfg.InitialStateCfg(pos=(0,14,5)),  # (0,15,0)  (0,0,10)
)

MDP settings

@configclass
class ActionsCfg:
“”“Action specifications for the MDP.”“”

left_back_wheel_joint = mdp.JointEffortActionCfg(asset_name="robot", joint_names=["left_back_wheel_joint"], scale=1000)
right_back_wheel_joint = mdp.JointEffortActionCfg(asset_name="robot", joint_names=["right_back_wheel_joint"], scale=1000)

left_rotator_joint = mdp.JointEffortActionCfg(asset_name="robot", joint_names=["left_rotator_joint"], scale=10)
right_rotator_joint = mdp.JointEffortActionCfg(asset_name="robot", joint_names=["right_rotator_joint"], scale=10)

@configclass
class ObservationsCfg:
“”“Observation specifications for the MDP.”“”

@configclass
class PolicyCfg(ObsGroup):
    """Observations for the policy."""
    base_up_proj = ObsTerm(func=mdp.base_up_proj)  
    # base_height = ObsTerm(func=mdp.base_pos_z)
    base_lin_vel = ObsTerm(func=mdp.base_lin_vel)    
    base_ang_vel = ObsTerm(func=mdp.base_ang_vel)    
    joint_pos_rel = ObsTerm(func=mdp.joint_pos_rel)
    joint_vel_rel = ObsTerm(func=mdp.joint_vel_rel)
    distance_to_target = ObsTerm(func=mdp.distance_to_target_buffer, params={})
    base_heading_proj = ObsTerm(func=mdp.base_heading_proj,params={})
    vector_to_target = ObsTerm(func=mdp.vector_to_target)

    actions = ObsTerm(func=mdp.last_action)

    def __post_init__(self):
        self.enable_corruption = False
        self.concatenate_terms = True

# observation groups
policy: PolicyCfg = PolicyCfg()

@configclass
class EventCfg:
“”“Configuration for events.”“”

reset_base = EventTerm(
    func=mdp.reset_root_state_uniform,
    mode="reset",
    params={
        "pose_range": {
            "x": (-5, 6), 
            # "y": (-0.5, 0.5), "yaw": (-3.14, 3.14)
            },
        "velocity_range": {
            # "x": (-0.0, 0.0),
            # "y": (-0.0, 0.0),
            # "z": (-0.0, 0.0),
            # "roll": (-0.0, 0.0),
            # "pitch": (-0.0, 0.0),
            # "yaw": (-0.0, 0.0),
        },
    },
)

reset_joints = EventTerm(
    func=mdp.reset_joints_by_scale,
    mode="reset",
    params={
        "asset_cfg": SceneEntityCfg("robot", joint_names=[".*"]),
        "position_range": (0, 0),
        "velocity_range": (0, 0),
    },
)

reset_aim = EventTerm( 
    func=mdp.reset_root_state_uniform,
    mode="reset",
    params={
        "asset_cfg": SceneEntityCfg("aim"),
        "pose_range": {
            "x":(-2,5),
            # "y":(10,12)
            },
        "velocity_range": {},
    },
)

@configclass
class RewardsCfg:
“”“Reward terms for the MDP.”“”
success_reward = RewTerm(
func = mdp.is_terminated_term,
weight = 1000.0,
params = {
“term_keys” : [“reach_goal”],
}
)
fall_penalty = RewTerm(
func = mdp.is_terminated_term,
weight = -1000.0,
params = {
“term_keys” : [“body_contact”,“fork_contact”],
}
)

progress = RewTerm(
    func = mdp.progress_reward, 
    weight = 1, 
    )

action_reward = RewTerm(
    func = mdp.action_reward, 
    weight = 0.5, 
    )

@configclass
class TerminationsCfg:
“”“Termination terms for the MDP.”“”
# (1) Terminate if the episode length is exceeded
time_out = DoneTerm(func=mdp.time_out, time_out=True)
# (2) Terminate if the robot falls
body_contact = DoneTerm(
func = mdp.illegal_contact,
params = {
“sensor_cfg” : SceneEntityCfg(“contact_forces”, body_names=“body”),
“threshold”: 10.0
},
)
fork_contact = DoneTerm(
func = mdp.illegal_contact,
params = {
“sensor_cfg” : SceneEntityCfg(“contact_forces”, body_names=“lift”),
“threshold”: 10.0
},
)
reach_goal = DoneTerm(
func = mdp.reach_goal,
)

@configclass
class AntEnvCfg(ManagerBasedRLEnvCfg):
“”“Configuration for the MuJoCo-style Ant walking environment.”“”

# Scene settings
scene: MySceneCfg = MySceneCfg(num_envs=4096, env_spacing=100.0)
# Basic settings
observations: ObservationsCfg = ObservationsCfg()
actions: ActionsCfg = ActionsCfg()
# MDP settings
rewards: RewardsCfg = RewardsCfg()
terminations: TerminationsCfg = TerminationsCfg()
events: EventCfg = EventCfg()

def __post_init__(self):
    """Post initialization."""
    # general settings
    self.decimation = 2
    self.episode_length_s = 16
    # simulation settings
    self.sim.dt = 1 / 120.0
    self.sim.render_interval = self.decimation
    self.sim.physx.bounce_threshold_velocity = 0.2
    # default friction material
    self.sim.physics_material.static_friction = 1.0
    self.sim.physics_material.dynamic_friction = 1.0
    self.sim.physics_material.restitution = 0.0
    if self.scene.contact_forces is not None:
        self.scene.contact_forces.update_period = self.sim.dt

This is a great post. I can only encourage you to resubmit this in our GitHub repository Discussions. Thank you for your interest in Isaac Lab. To ensure efficient support and collaboration, please submit your topic to its GitHub repo following the instructions provided on Isaac Lab’s Contributing Guidelines regarding discussions, submitting issues, feature requests, and contributing to the project.

We appreciate your understanding and look forward to assisting you.