IsaacLab学习记录(四)
强化学习三要素:奖励、观测、动作
模块 | 强化学习中的作用 |
---|---|
观测 | • 构建状态空间 st,驱动策略决策 • 提供环境交互的实时反馈(如脚部触地力) • 噪声注入( Unoise )提升策略鲁棒性 |
动作 | • 将策略输出 at∈[−1,1] 映射到物理可行空间 • 通过 scale 平衡探索效率与稳定性• offset 利用先验知识(初始姿态)加速收敛 |
奖励 | • 定义优化目标 rt,引导策略学习方向 • 负奖励( weight=-0.1 )抑制不良行为(脚滑)• 奖励函数即课程设计(Curriculum) |
三者的闭环关系 | • 观测输入策略网络生成动作 • 动作改变环境状态并触发奖励计算 • 奖励通过梯度更新优化策略 |
四、奖励
- 如定义一个名为
feet_slide
的奖励项,用于惩罚脚部滑动。 - 在奖励函数中,通过接触传感器检测脚部是否接触地面,并计算接触时脚部的水平速度(x和y方向),将接触时的速度范数求和作为惩罚项(乘以一个负权重)。
- 在
RobotRewards
中引入了这个奖励项,并设置权重为-0.1,同时指定了传感器和实体的配置(指定了具体的身体名称)。
1、奖励定义义:/source/isaaclab_tasks/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/mdp/rewards.py
def feet_slide(env, sensor_cfg: SceneEntityCfg, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor: # Penalize feet sliding contact_sensor: ContactSensor = env.scene.sensors[sensor_cfg.name]
contacts = contact_sensor.data.net_forces_w_history[:, :, sensor_cfg.body_ids, :].norm(dim=-1).max(dim=1)[0] > 1.0 asset = env.scene[asset_cfg.name] body_vel = asset.data.body_lin_vel_w[:, asset_cfg.body_ids, :2] reward = torch.sum(body_vel.norm(dim=-1) * contacts, dim=1) return reward
2、奖励引入:your_env_cfg:RobotRewards(RewardsCfg)
feet_slide = RewTerm( func=mdp.feet_slide, weight=-0.1, params={ "sensor_cfg": SceneEntityCfg("contact_forces", body_names="Link_ankle_.roll"), "asset_cfg": SceneEntityCfg("robot", body_names="Link_ankle*_*.*_roll"), }, )
3、奖励配置:your_env_cfg:RobotRoughEnvCfg(LocomotionVelocityRoughEnvCfg):
环境场景设置(Scene)、域随机化配置(Domain Randomization Events)、奖励函数权重调整(Rewards)、指令采样范围(Commands)、终止条件设置(Terminations)、事件配置 (EventCfg),具体查看LocomotionVelocityRoughEnvCfg
五、观测
- 在观测配置类
PolicyCfg
中添加了多个观测项,如基础线速度、基础角速度、投影的重力、速度指令、关节位置、关节速度、上一个动作、高度扫描和接触力。 - 每个观测项都指定了处理函数(如
mdp.base_lin_vel
)和噪声配置(如均匀噪声)。 - 其中,
contact_force
观测项使用了接触力传感器,指定了身体名称为匹配“FOOT”的模式。
1、观测添加:/source/isaaclab_tasks/isaaclab_tasks/manager_based/locomotion/velocity/velocity_env_cfg.py中的
ObservationsCfg类下的PolicyCfg
@configclass class PolicyCfg(ObsGroup): ... base_lin_vel = ObsTerm(func=mdp.base_lin_vel, noise=Unoise(n_min=-0.1, n_max=0.1)) base_ang_vel = ObsTerm(func=mdp.base_ang_vel, noise=Unoise(n_min=-0.2, n_max=0.2)) projected_gravity = ObsTerm(func=mdp.projected_gravity, noise=Unoise(n_min=-0.05, n_max=0.05)) velocity_commands = ObsTerm(func=mdp.generated_commands, params={"command_name": "base_velocity"}) joint_pos = ObsTerm(func=mdp.joint_pos_rel, noise=Unoise(n_min=-0.01, n_max=0.01)) joint_vel = ObsTerm(func=mdp.joint_vel_rel, noise=Unoise(n_min=-1.5, n_max=1.5)) actions = ObsTerm(func=mdp.last_action) height_scan = ObsTerm(func=mdp.height_scan, ...) contact_force = ObsTerm( func=mdp.contact_forces, params={"sensor_cfg": SceneEntityCfg("contact_forces", body_names=".*FOOT")}, noise=Unoise(n_min=-5.0, n_max=5.0) )
2、具体数据处理函数:mdp.py中的 base_lin_vel, joint_pos_rel 等
六、动作
- 配置了动作规范,使用关节位置控制(
JointPositionActionCfg
)。 - 指定了资产名称为“robot”,关节名称为正则表达式“.*”(匹配所有关节),缩放比例为0.5,并使用默认的初始位置偏移。
velocity_env_cfg.py中的ActionsCfg类
@configclass class ActionsCfg: """Action specifications for the MDP.""" joint_pos = mdp.JointPositionActionCfg( asset_name="robot", joint_names=[".*"], # 匹配所有关节 scale=0.5, # 动作缩放 use_default_offset=True # 使用初始位置偏移 )
policy 输出 -> [a1, a2, ..., an] → 映射成 joint position commands → 缩放后用于控制机器人动作
步骤 | 技术实现 | 强化学习作用 |
---|---|---|
Policy 输出 | 神经网络原始输出 ai∈[−1,1] | 智能体的决策能力体现 |
关节命令映射 | 目标位置 = 初始位置 + ai× scale | 归一化动作空间,提升训练稳定性 |
物理控制 | 发送位置命令至关节电机 | 环境交互的执行层,生成后续状态/奖励 |