isaacLab 机器人学习记录 二

isaacLab 训练机器人 一-CSDN博客

以倒立摆为例. 

目录:source/extensions/omni.isaac.lab_tasks/manager_based/classic/cartpole

1 rsl_rl_ppo_cfg:这里是基于rsl_rl库的PPO 算法的训练时的超参数配置,、

  简单说一下PPO,基于Actor_Critic架构(涉及到关键词:优势函数、时序差分方法、梯度更新)(基本结合了值迭代、策略迭代、sarsa、Q_learning等基础,是更为完善和结合基础RL算法的版本),结合了策略梯度算法与TRPO的优点,主要特点是策略迭代时,对新旧策略差异进行评价,限制策略的更新幅度。网络(价值网络和策略网络,原理是利用值函数近似的思想从table到函数,然后可以使用神经网络进行拟合,并进行梯度计算)

# Copyright (c) 2022-2024, The Isaac Lab Project Developers.
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause

from omni.isaac.lab.utils import configclass

from omni.isaac.lab_tasks.utils.wrappers.rsl_rl import (
    RslRlOnPolicyRunnerCfg,
    RslRlPpoActorCriticCfg,
    RslRlPpoAlgorithmCfg,
)


@configclass
class CartpolePPORunnerCfg(RslRlOnPolicyRunnerCfg):
    num_steps_per_env = 16 #每次采样16个时间步
    max_iterations = 150 #最大迭代次数
    save_interval = 50 #50步保存一次
    experiment_name = "cartpole"#模型保存的名称倒立摆
    empirical_normalization = False#对输入数据或奖励归一化处理。
    policy = RslRlPpoActorCriticCfg(
        init_noise_std=1.0,#表示初始化时添加噪声的标准差。
        #这个值通常用于初始化网络权重时控制噪声的大小,可能对训练的稳定性和收敛速度有影响
        actor_hidden_dims=[32, 32],#定义了 Actor 网络 的隐藏层维度。这里的网络有两个隐藏层,每个隐藏层包含 32 个神经元
        critic_hidden_dims=[32, 32],
        activation="elu",#激活函数
    )
    algorithm = RslRlPpoAlgorithmCfg(
        value_loss_coef=1.0,#价值损失对总损失的影响权重,1.0 表示策略损失和价值损失在更新时有相等的权重
        use_clipped_value_loss=True,#PPO剪裁
        clip_param=0.2,#新旧策略的差异 剪裁
        entropy_coef=0.005,#通过最大熵来鼓励探索,(加到奖励函数中)(该策略下其余动作的概率占比)
        num_learning_epochs=5,#迷你批次数据来更新,每个批次的学习数据为5次
        num_mini_batches=4,#每个数据集被划分为4个小批次
        learning_rate=1.0e-3,#学习率,梯度
        schedule="adaptive",#学习率自动调整,初期学习率大,后期学习率小
        gamma=0.99,#奖励折扣 
        lam=0.95,#广义优势函数的折扣  = r+lam*Vt -Vt
        desired_kl=0.01,#PPO中KL散度的目标值,新旧差异
        max_grad_norm=1.0,#梯度剪裁的最大值
    )

2 倒立摆环境配置

涉及到强化学习环境、奖励、 MDP(动作、状态、终止、课程、指令)

# Copyright (c) 2022-2024, The Isaac Lab Project Developers.
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause

import math

import omni.isaac.lab.sim as sim_utils
from omni.isaac.lab.assets import ArticulationCfg, AssetBaseCfg
from omni.isaac.lab.envs import ManagerBasedRLEnvCfg
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 RewardTermCfg as RewTerm
from omni.isaac.lab.managers import SceneEntityCfg
from omni.isaac.lab.managers import TerminationTermCfg as DoneTerm
from omni.isaac.lab.scene import InteractiveSceneCfg
from omni.isaac.lab.utils import configclass

import omni.isaac.lab_tasks.manager_based.classic.cartpole.mdp as mdp

##
# Pre-defined configs
##
from omni.isaac.lab_assets.cartpole import CARTPOLE_CFG  # isort:skip


##
# Scene definition
##

#环境
@configclass
class CartpoleSceneCfg(InteractiveSceneCfg):
    """Configuration for a cart-pole scene."""

    # ground plane
    ground = AssetBaseCfg(
        prim_path="/World/ground",
        spawn=sim_utils.GroundPlaneCfg(size=(100.0, 100.0)),
    )

    # cartpole
    robot: ArticulationCfg = CARTPOLE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")

    # lights
    dome_light = AssetBaseCfg(
        prim_path="/World/DomeLight",
        spawn=sim_utils.DomeLightCfg(color=(0.9, 0.9, 0.9), intensity=500.0),
    )
    distant_light = AssetBaseCfg(
        prim_path="/World/DistantLight",
        spawn=sim_utils.DistantLightCfg(color=(0.9, 0.9, 0.9), intensity=2500.0),
        init_state=AssetBaseCfg.InitialStateCfg(rot=(0.738, 0.477, 0.477, 0.0)),
    )


##
# MDP settings
##

#自定义
@configclass
class CommandsCfg:
    """Command terms for the MDP."""

    # no commands for this MDP
    null = mdp.NullCommandCfg()


@configclass
class ActionsCfg:
    """Action specifications for the MDP."""
    #机器人 ,关节名称 , 缩放因子
    joint_effort = mdp.JointEffortActionCfg(asset_name="robot", joint_names=["slider_to_cart"], scale=100.0)


@configclass
class ObservationsCfg:
    """Observation specifications for the MDP."""
    #一个观测组
    @configclass
    class PolicyCfg(ObsGroup):
        """Observations for policy group."""

        # observation terms (order preserved)
        #关节位置、速度     #获取对应内容的函数
        joint_pos_rel = ObsTerm(func=mdp.joint_pos_rel)
        joint_vel_rel = ObsTerm(func=mdp.joint_vel_rel)
        
        #类初始化后自动调用
        def __post_init__(self) -> None:
            #观察腐化,引入噪声
            self.enable_corruption = False
            #将多个状态合并为一个长向量
            self.concatenate_terms = True

    # observation groups
    policy: PolicyCfg = PolicyCfg()


@configclass
class EventCfg:
    """Configuration for events."""
     

    # funC 执行的函数
    # mode 事件的模式
    # 参数
    # reset
    #车
    reset_cart_position = EventTerm(
        func=mdp.reset_joints_by_offset,
        mode="reset",
        params={
            "asset_cfg": SceneEntityCfg("robot", joint_names=["slider_to_cart"]),
            "position_range": (-1.0, 1.0),#位置范围
            "velocity_range": (-0.5, 0.5),#速度范围
        },
    )
    #杆
    reset_pole_position = EventTerm(
        func=mdp.reset_joints_by_offset,
        mode="reset",
        params={
            "asset_cfg": SceneEntityCfg("robot", joint_names=["cart_to_pole"]),
            "position_range": (-0.25 * math.pi, 0.25 * math.pi),#0.25弧度范围
            "velocity_range": (-0.25 * math.pi, 0.25 * math.pi),
        },
    )


@configclass
class RewardsCfg:
    """Reward terms for the MDP."""

    # (1) Constant running reward
    #活着就奖励权重
    alive = RewTerm(func=mdp.is_alive, weight=1.0)
    # (2) Failure penalty
    #失败惩罚,达到失败条件
    terminating = RewTerm(func=mdp.is_terminated, weight=-2.0)
    # (3) Primary task: keep pole upright
    # 保持杆竖直 
    # 关节二范数,权重-1.0 ,目标 0.0 
    #这里通过RewTerm的参数将 所需的joint_pos_target_l2参数传入
    #pole_pos 是一个 RewTerm 对象,包含了奖励函数 mdp.joint_pos_target_l2 和它需要的参数(asset_cfg 和 target)。
    pole_pos = RewTerm(
        func=mdp.joint_pos_target_l2,
        weight=-1.0,
        params={"asset_cfg": SceneEntityCfg("robot", joint_names=["cart_to_pole"]), "target": 0.0},
    )
    # (4) Shaping tasks: lower cart velocity
    # 小车的速度
    cart_vel = RewTerm(
        func=mdp.joint_vel_l1,
        weight=-0.01,
        params={"asset_cfg": SceneEntityCfg("robot", joint_names=["slider_to_cart"])},
    )
    # (5) Shaping tasks: lower pole angular velocity、
    #角速度 惩罚
    pole_vel = RewTerm(
        func=mdp.joint_vel_l1,
        weight=-0.005,
        params={"asset_cfg": SceneEntityCfg("robot", joint_names=["cart_to_pole"])},
    )


@configclass
class TerminationsCfg:
    """Termination terms for the MDP."""

    # (1) Time out
    # 时间终止
    time_out = DoneTerm(func=mdp.time_out, time_out=True)
    # (2) Cart out of bounds
    # 边界终止
    cart_out_of_bounds = DoneTerm(
        func=mdp.joint_pos_out_of_manual_limit,
        params={"asset_cfg": SceneEntityCfg("robot", joint_names=["slider_to_cart"]), "bounds": (-3.0, 3.0)},
    )


@configclass
class CurriculumCfg:
    """Configuration for the curriculum."""

    pass


##
# Environment configuration
##

#环境配置
@configclass
class CartpoleEnvCfg(ManagerBasedRLEnvCfg):
    """Configuration for the locomotion velocity-tracking environment."""

    # Scene settings
    scene: CartpoleSceneCfg = CartpoleSceneCfg(num_envs=4096, env_spacing=4.0)
    # Basic settings
    observations: ObservationsCfg = ObservationsCfg()
    actions: ActionsCfg = ActionsCfg()
    events: EventCfg = EventCfg()
    # MDP settings
    curriculum: CurriculumCfg = CurriculumCfg()
    rewards: RewardsCfg = RewardsCfg()
    terminations: TerminationsCfg = TerminationsCfg()
    # No command generator
    commands: CommandsCfg = CommandsCfg()

    # Post initialization
    # 位置初始化
    def __post_init__(self) -> None:
        """Post initialization."""
        # general settings
        self.decimation = 2#两个时间步进行一次采样
        self.episode_length_s = 5#每个回合的持续时间
        # viewer settings
        #观察位置
        self.viewer.eye = (8.0, 0.0, 5.0)
        # simulation settings
        #仿真相关的参数,仿真的时间步长,   单位秒
        self.sim.dt = 1 / 120
        # 渲染器时间检测 
        self.sim.render_interval = self.decimation

3 如何使用

1 官网文档

概述 — Isaac Lab Documentation

可以看一下关于基于管理器训练,如何运行demo

2  这里已经设定了环境,关于强化学习MDP的基本要素,最后生成了倒立摆环境。

3这里demo并未详细说明isaac_lab 是如何将环境中的数据给到强化学习环境的步骤。

对于强化学习训练来讲:

(也就是rsl_rl/PPO ),它的作用是一个agent, 负责输出动作(利用策略网络的输出)到环境中去(也就是仿真环境接收的关节力矩、位置等)。

环境负责利用仿真的物理环境执行,执行后负责输出执行后的状态(观测),同时考虑终止、事件等条件。

同时,将参数化的状态(观测),奖励等给到(rsl_rl/ppo),也就是agent中。

然后循环。

4 对于个人 ,只需要配置环境和各参数,尤其是涉及MDP(奖励函数等)。当然,训练的超参数,网络层,批次等数据还是需要经验与参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值