当前位置: 首页 > backend >正文

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归一化动作空间,提升训练稳定性
物理控制发送位置命令至关节电机环境交互的执行层,生成后续状态/奖励
http://www.xdnf.cn/news/15892.html

相关文章:

  • Milvus Dify 学习笔记
  • 题单【循环结构】
  • 基于单片机出租车计价器设计
  • 30天打牢数模基础-决策树讲解
  • 【C语言】字符串与字符函数详解(上)
  • C++ 并发 future, promise和async
  • 数位 dp
  • 「Java案例」利用方法打印乘法表
  • WPF学习笔记(28)Interaction.Triggers的意义与使用方式
  • dify创建OCR工作流
  • NX584NX559美光固态闪存NX561NW993
  • AI(学习笔记第六课) 使用langchain进行AI开发 load documents(csv和文件夹)
  • 开源社区贡献指南:如何通过Three.js插件开发提升企业技术影响力?
  • Windows批量修改文件属性方法
  • swift-关联性/范型
  • 每日算法刷题Day50:7.20:leetcode 栈8道题,用时2h30min
  • 深度学习方法生成抓取位姿与6D姿态估计的完整实现
  • Python应用进阶DAY10--模块化编程概念(模块、包、导入)及常见系统模块总结和第三方模块管理
  • 设计模式笔记(1)简单工厂模式
  • 【图论】图的定义与一些常用术语
  • thinkphp8\guzzlehttp上传文件应用示例
  • Linux基础命令详解:从入门到精通
  • prometheus 黑盒监控和docker检测
  • git操作
  • Node.js:常用工具、GET/POST请求的写法、工具模块
  • ByteBuf 体系的设计与实现
  • `tidyverse` 长表、宽表的处理
  • 【HarmonyOS】ArkUI - 自定义组件和结构重用
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • Spring AI 聊天记忆