机器人强化学习入门笔记(二)

四足机器人强化学习项目 - 完整介绍文档

一、项目总览

1.1 项目简介

本项目(链接)是一个基于强化学习(Reinforcement Learning, RL)的四足机器人控制训练系统,主要用于训练四足机器狗(如GO2、ANYmal等)在复杂地形上行走、翻越障碍物等任务。项目采用NVIDIA Isaac Gym作为物理仿真环境,使用**PPO(Proximal Policy Optimization)**算法进行策略训练,实现了从仿真到实物的迁移学习(Sim-to-Real Transfer)。

1.2 项目目标

  • 主要任务:训练四足机器人在指定赛道上行走,使其能够翻越多种地形(包括梅花桩等复杂障碍)
  • 技术特点
    • GPU加速的并行仿真环境
    • 支持多种四足机器人模型(GO2、ANYmal、A1、Cassie等)
    • 完整的强化学习训练流程
    • 支持自定义奖励函数和观测空间
    • 支持地形随机化和域随机化(Domain Randomization)

1.3 项目架构

项目由三个核心模块组成:

  1. isaacgym - NVIDIA Isaac Gym物理仿真引擎
  2. legged_gym - 四足机器人环境定义和训练脚本
  3. rsl_rl - 强化学习算法实现(PPO)

二、isaacgym 文件夹详解

2.1 文件夹作用

isaacgym 是 NVIDIA 提供的 GPU 加速物理仿真引擎,为整个项目提供:

  • 物理仿真环境:基于 PhysX 的物理引擎,支持高精度刚体动力学仿真
  • 并行仿真能力:可在 GPU 上同时运行数千个仿真环境
  • Python API:提供 Python 接口,方便与 PyTorch 等深度学习框架集成
  • 渲染功能:支持实时可视化训练过程

2.2 主要文件结构

2.2.1 isaacgym/python/isaacgym/ - Python 包核心文件

__init__.py

  • 作用:包初始化文件,导入 gymapi 模块
  • 功能:使 isaacgym 可以作为 Python 包被导入

gymapi.py

  • 作用:Isaac Gym 的主要 API 接口封装
  • 功能:
    • 动态加载对应 Python 版本的 C++ 绑定库
    • 提供仿真环境创建、机器人加载、物理参数设置等核心 API
    • 管理仿真场景、Actor、传感器等对象

gymdeps.py

  • 作用:依赖管理模块
  • 功能:
    • 确保 PyTorch 在 isaacgym 模块之后导入(避免库冲突)
    • 预加载必要的系统库(如 PhysX、USD 等)
    • 处理平台相关的库路径问题

gymtorch.py

  • 作用:PyTorch 与 Isaac Gym 的互操作模块
  • 功能:
    • 提供 Tensor 包装器,实现 GPU 内存共享
    • 允许直接在 PyTorch 中访问仿真数据(位置、速度、力等)
    • 编译 C++ 扩展模块实现零拷贝数据传输

gymutil.py

  • 作用:工具函数集合
  • 功能:
    • 解析命令行参数(设备选择、渲染模式等)
    • 设备字符串解析(如 “cuda:0”)
    • 提供常用的辅助函数

rlgpu.py

  • 作用:RLGPU 模块加载器
  • 功能:
    • 动态加载对应 Python 版本的 RLGPU 库(rlgpu_36.so, rlgpu_37.so, rlgpu_38.so)
    • 提供强化学习相关的 GPU 加速功能

terrain_utils.py

  • 作用:地形生成工具
  • 功能:
    • 提供各种地形生成函数(平面、粗糙地形、台阶等)
    • 支持程序化地形生成
    • 地形高度图处理

torch_utils.py

  • 作用:PyTorch 工具函数
  • 功能:
    • 提供与 PyTorch 相关的辅助函数
    • Tensor 操作工具

_bindings/ 目录

  • 作用:包含编译好的 C++ 扩展库
  • 内容:
    • linux-x86_64/:Linux 平台的二进制库文件
      • gym_*.so:不同 Python 版本的 Gym API 绑定
      • rlgpu_*.so:不同 Python 版本的 RLGPU 库
      • 各种依赖库(PhysX、USD、Boost 等)
    • src/gymtorch/:gymtorch C++ 扩展源代码
2.2.2 isaacgym/python/examples/ - 示例程序

包含 27 个示例程序,展示 Isaac Gym 的各种功能:

  • 1080_balls_of_solitude.py:大规模并行仿真示例
  • terrain_creation.py:地形创建示例
  • dof_controls.py:关节控制示例
  • domain_randomization.py:域随机化示例
  • 等等…
2.2.3 isaacgym/assets/ - 资源文件

urdf/ - 机器人模型文件

  • 包含各种机器人的 URDF 描述文件
  • 如:anymal_b、franka、kuka_allegro 等

mjcf/ - MuJoCo 格式模型

  • 包含 MuJoCo XML 格式的机器人模型

textures/ - 纹理文件

  • 用于渲染的地面纹理图片
2.2.4 isaacgym/python/setup.py
  • 作用:Isaac Gym Python 包的安装脚本
  • 功能:配置包信息、依赖项、平台特定的二进制文件

三、legged_gym 文件夹详解

3.1 文件夹作用

legged_gym 是四足机器人强化学习环境的核心模块,提供:

  • 环境定义:各种四足机器人的仿真环境(GO2、ANYmal、A1、Cassie 等)
  • 奖励函数:预定义的奖励函数集合,支持自定义扩展
  • 观测空间:定义机器人的观测信息(关节角度、速度、地形高度等)
  • 训练脚本:训练和测试脚本
  • 工具函数:地形生成、任务注册、参数解析等

3.2 主要文件结构

3.2.1 legged_gym/legged_gym/ - 核心代码目录

__init__.py

  • 作用:包初始化文件
  • 功能:定义项目根目录路径和环境目录路径常量

envs/ - 环境定义目录

envs/__init__.py

  • 作用:环境注册文件
  • 功能:
    • 导入所有机器人环境类
    • 使用 task_registry 注册所有可用任务
    • 注册的任务包括:anymal_c_rough、anymal_c_flat、anymal_b、a1、cassie、go2

envs/base/ - 基础环境类

base/legged_robot.py

  • 作用:四足机器人的基础环境类
  • 功能:
    • 实现通用的四足机器人仿真环境
    • 定义基本的状态更新、奖励计算、观测生成流程
    • 提供可被继承的接口,供具体机器人环境使用

base/legged_robot_config.py

  • 作用:基础环境配置类
  • 功能:
    • 定义环境参数配置类 LeggedRobotCfg(机器人参数、地形参数、奖励函数权重等)
    • 定义训练参数配置类 LeggedRobotCfgPPO(学习率、网络结构、训练超参数等)
    • 提供配置的默认值

base/base_task.py

  • 作用:基础任务类(可能用于更通用的任务定义)

base/base_config.py

  • 作用:基础配置类(可能用于更通用的配置定义)

envs/go2/ - GO2 机器人环境

go2/go2_robot.py

  • 作用:GO2 机器人的具体环境实现
  • 功能:
    • 继承自基础环境类
    • 实现 GO2 特定的奖励函数(如 _reward_tracking_goal_vel_reward_reach_all_goal 等)
    • 定义 GO2 的观测空间
    • 处理 GO2 的初始化和重置逻辑

go2/go2_config.py

  • 作用:GO2 环境的配置类
  • 功能:
    • 定义 GO2 机器人的 URDF 路径
    • 设置关节名称、默认位置、PD 控制参数
    • 配置奖励函数权重
    • 配置观测空间维度
    • 定义训练超参数

envs/anymal_c/ - ANYmal-C 机器人环境

anymal_c/anymal.py

  • 作用:ANYmal-C 机器人的环境实现

anymal_c/flat/anymal_c_flat_config.py

  • 作用:ANYmal-C 在平地上的训练配置

anymal_c/mixed_terrains/anymal_c_rough_config.py

  • 作用:ANYmal-C 在粗糙地形上的训练配置

envs/anymal_b/ - ANYmal-B 机器人环境

anymal_b/anymal_b_config.py

  • 作用:ANYmal-B 机器人的配置

envs/a1/ - A1 机器人环境

a1/a1_config.py

  • 作用:A1 机器人的配置

envs/cassie/ - Cassie 机器人环境

cassie/cassie.py

  • 作用:Cassie 机器人的环境实现

cassie/cassie_config.py

  • 作用:Cassie 机器人的配置

scripts/ - 训练和测试脚本

scripts/train.py

  • 作用:训练脚本主入口
  • 功能:
    • 解析命令行参数
    • 创建环境和训练器
    • 启动强化学习训练循环
    • 保存训练好的模型

scripts/play.py

  • 作用:测试/演示脚本
  • 功能:
    • 加载训练好的模型
    • 在仿真环境中运行策略
    • 可视化机器人行为

utils/ - 工具函数目录

utils/task_registry.py

  • 作用:任务注册表
  • 功能:
    • 管理所有注册的环境类、配置类
    • 提供 make_env() 方法创建环境
    • 提供 make_alg_runner() 方法创建训练器
    • 支持从注册名称或配置文件创建对象

utils/helpers.py

  • 作用:辅助函数集合
  • 功能:
    • get_args():解析命令行参数
    • update_cfg_from_args():用命令行参数更新配置
    • class_to_dict():将配置类转换为字典
    • get_load_path():获取模型加载路径
    • set_seed():设置随机种子
    • parse_sim_params():解析仿真参数

utils/terrain.py

  • 作用:地形生成模块
  • 功能:
    • 生成各种类型的地形(平面、粗糙地形、台阶、斜坡等)
    • 支持程序化地形生成
    • 地形高度图处理
    • 支持地形随机化

utils/math.py

  • 作用:数学工具函数
  • 功能:提供常用的数学计算函数(如四元数转换、角度归一化等)

utils/logger.py

  • 作用:日志记录工具
  • 功能:提供训练过程的日志记录功能

tests/ - 测试文件

tests/test_env.py

  • 作用:环境测试脚本
  • 功能:测试环境的基本功能是否正常

resources/ - 资源文件目录

resources/robots/

  • 作用:存储机器人模型文件
  • 内容:各种机器人的 URDF 文件、网格文件、纹理文件等

resources/actuator_nets/

  • 作用:存储执行器网络模型
  • 内容:用于 Sim-to-Real 迁移的执行器神经网络模型(.pt 文件)

执行器网络详解:anydrive_v3_lstm.pt

1. 什么是执行器网络?

执行器网络(Actuator Network)是一个预训练的神经网络模型,用于在仿真中更准确地模拟真实机器人的执行器(电机)动态特性。它替代了传统的 PD(比例-微分)控制器,能够更好地模拟真实执行器的非线性行为、延迟、摩擦等特性。

2. 为什么需要执行器网络?

  • 传统 PD 控制器的局限性
    • 简单的 PD 控制器假设执行器是理想的,能够瞬间响应命令
    • 无法模拟真实电机的动态特性(如惯性、阻尼、非线性摩擦等)
    • 这导致仿真和真实环境之间存在"仿真到现实差距"(Sim-to-Real Gap)
  • 执行器网络的优势
    • 通过神经网络学习真实执行器的输入-输出映射关系
    • 使用 LSTM 结构能够记忆历史状态,更好地模拟执行器的动态响应
    • 在仿真中使用执行器网络训练的策略,更容易迁移到真实机器人上

3. 模型的具体作用

anydrive_v3_lstm.pt 是一个 LSTM 神经网络模型,它的功能是:

  • 输入
    • 位置误差:(目标位置 - 当前位置)
    • 当前速度:当前关节速度
    • 历史隐藏状态:LSTM 的 hidden state 和 cell state
  • 输出
    • 关节扭矩:直接输出应该施加到关节上的扭矩值
    • 更新后的隐藏状态:用于下一次计算

4. 是否需要自己训练?

不需要! 这个模型是预训练的,由项目维护者(ETH Zurich 的 Robotic Systems Lab)提供。它是基于真实 ANYmal 机器人的执行器数据训练得到的,已经能够很好地模拟真实执行器的行为。

5. 哪些文件调用了这个模型?

根据代码分析,以下文件使用了 anydrive_v3_lstm.pt

    • 配置文件中指定了使用执行器网络,并设置模型文件路径:
    • __init__ 方法中加载模型:
    • _compute_torques 方法中使用模型计算扭矩:

legged_gym/legged_gym/envs/anymal_c/anymal.py(第 51-54 行,第 71-78 行)

if self.cfg.control.use_actuator_network: actuator_network_path = self.cfg.control.actuator_net_file.format(LEGGED_GYM_ROOT_DIR=LEGGED_GYM_ROOT_DIR) self.actuator_network = torch.jit.load(actuator_network_path).to(self.device)
if self.cfg.control.use_actuator_network:# 准备输入:位置误差和速度 self.sea_input[:,0,0]=(actions * self.cfg.control.action_scale + self.default_dof_pos - self.dof_pos).flatten() self.sea_input[:,0,1]= self.dof_vel.flatten()# 调用执行器网络计算扭矩 torques,(self.sea_hidden_state[:], self.sea_cell_state[:])= self.actuator_network( self.sea_input,(self.sea_hidden_state, self.sea_cell_state))return torques else:# 否则使用传统的 PD 控制器returnsuper()._compute_torques(actions)

legged_gym/legged_gym/envs/anymal_c/mixed_terrains/anymal_c_rough_config.py(第 68-69 行)

use_actuator_network =True actuator_net_file ="{LEGGED_GYM_ROOT_DIR}/resources/actuator_nets/anydrive_v3_lstm.pt"

6. 使用场景

  • 当前使用:仅在 anymal_c_rough 任务中使用(粗糙地形训练)
  • 其他机器人:GO2、A1、Cassie 等其他机器人环境默认使用 PD 控制器
  • 如何启用:在对应机器人的配置文件中设置 use_actuator_network = True 并指定模型文件路径

7. 工作原理对比

控制方式输入计算方式输出
PD 控制器目标位置、当前位置、当前速度线性公式:τ = Kp*(θ_target - θ) - Kd*θ_dot扭矩
执行器网络位置误差、速度、历史状态LSTM 神经网络前向传播扭矩

执行器网络能够学习更复杂的非线性映射,从而更准确地模拟真实执行器的行为。

setup.py

  • 作用:legged_gym 包的安装脚本
  • 功能:定义包依赖(isaacgym、rsl-rl、matplotlib)

四、rsl_rl 文件夹详解

4.1 文件夹作用

rsl_rl 是一个快速、简洁的强化学习算法实现库,专门设计为在 GPU 上完全运行。目前主要实现了 PPO(Proximal Policy Optimization) 算法。

4.2 主要文件结构

4.2.1 rsl_rl/rsl_rl/ - 核心代码目录

__init__.py

  • 作用:包初始化文件
  • 功能:定义包的版本和基本信息

algorithms/ - 算法实现目录

algorithms/ppo.py

  • 作用:PPO 算法实现
  • 功能:
    • 实现 PPO 的核心算法逻辑
    • 包括策略更新、价值函数更新
    • 支持 GAE(Generalized Advantage Estimation)
    • 实现 clipped surrogate objective
    • 支持梯度裁剪

algorithms/__init__.py

  • 作用:算法模块初始化
  • 功能:导出 PPO 类

modules/ - 神经网络模块目录

modules/actor_critic.py

  • 作用:Actor-Critic 网络结构
  • 功能:
    • 定义策略网络(Actor)和价值网络(Critic)
    • 实现前向传播
    • 支持共享特征提取层
    • 输出动作分布参数(均值和标准差)和价值估计

modules/actor_critic_recurrent.py

  • 作用:带循环结构的 Actor-Critic 网络
  • 功能:
    • 在 Actor-Critic 基础上添加 RNN/LSTM 层
    • 支持处理序列数据
    • 用于需要记忆历史信息的环境

modules/__init__.py

  • 作用:模块初始化
  • 功能:导出 ActorCritic 和 ActorCriticRecurrent 类

runners/ - 训练运行器目录

runners/on_policy_runner.py

  • 作用:On-Policy 算法训练运行器

(注:PPO是一个 on-policy 算法,虽然它在实现上借鉴了一些 off-policy 的技巧。参考1参考2)

  • 功能:
    • 管理整个训练循环
    • 协调环境交互、数据收集、模型更新
    • 处理模型保存和加载
    • 集成 TensorBoard 日志记录
    • 管理训练迭代和检查点

runners/__init__.py

  • 作用:运行器模块初始化
  • 功能:导出 OnPolicyRunner 类

storage/ - 数据存储目录

storage/rollout_storage.py

  • 作用:经验回放缓冲区
  • 功能:
    • 存储环境交互数据(观测、动作、奖励、done 标志等)
    • 计算优势函数(Advantage)和回报(Return)
    • 支持批量数据采样
    • 管理经验数据的生命周期

storage/__init__.py

  • 作用:存储模块初始化
  • 功能:导出 RolloutStorage 类

env/ - 环境接口目录

env/vec_env.py

  • 作用:向量化环境接口
  • 功能:
    • 定义环境的标准接口
    • 支持批量环境交互
    • 提供 step()reset() 等方法
    • 所有环境类需要实现此接口

继承关系

VecEnv (接口/抽象基类) ↑ (实现接口,但不显式继承) BaseTask (基础任务类) ↑ (继承) LeggedRobot (四足机器人基类) ↑ (继承) Go2Robot (GO2机器人具体实现) 

训练时的调用流程

OnPolicyRunner.learn() ↓ env.step(actions) # 期望 VecEnv 接口 ↓ Go2Robot.step() # 实际调用 ↓ LeggedRobot.step() # 如果 Go2Robot 没有重写,调用父类 ↓ BaseTask.step() # 如果 LeggedRobot 没有重写,调用父类 

这是一个典型的适配器模式(Adapter Pattern):

  • VecEnv 定义了标准接口
  • BaseTask 及其子类实现了这个接口
  • 使得 legged_gym 的环境可以与 rsl_rl 的训练框架无缝集成

env/__init__.py

  • 作用:环境模块初始化
  • 功能:导出 VecEnv 基类

utils/ - 工具函数目录

utils/utils.py

  • 作用:工具函数集合
  • 功能:
    • 提供网络初始化函数
    • 提供激活函数选择
    • 其他辅助函数

utils/__init__.py

  • 作用:工具模块初始化

setup.py

  • 作用:rsl_rl 包的安装脚本
  • 功能:定义包依赖(torch、numpy)

五、项目工作流程

5.1 训练流程

  1. 环境创建:使用 task_registry.make_env() 创建仿真环境
  2. 训练器创建:使用 task_registry.make_alg_runner() 创建 PPO 训练器
  3. 训练循环
    • 环境交互:收集经验数据
    • 数据存储:将数据存入 RolloutStorage
    • 策略更新:使用 PPO 算法更新策略网络
    • 日志记录:记录训练指标到 TensorBoard
    • 模型保存:定期保存检查点

5.2 数据流

环境 (legged_gym) ↓ 观测、奖励 PPO 算法 (rsl_rl) ↓ 动作 Isaac Gym 仿真引擎 ↓ 物理状态 环境 (legged_gym) 

5.3 关键组件交互

  • Isaac Gym 提供物理仿真和 GPU 加速
  • legged_gym 定义任务、奖励函数、观测空间
  • rsl_rl 实现强化学习算法和训练流程

六、总结

本项目是一个完整的四足机器人强化学习训练框架,通过三个核心模块的协作:

  1. isaacgym:提供高性能的物理仿真环境
  2. legged_gym:定义具体的机器人任务和环境
  3. rsl_rl:实现强化学习算法和训练流程

整个系统支持:

  • 多种四足机器人模型
  • 自定义奖励函数和观测空间
  • GPU 加速的并行训练
  • 从仿真到实物的迁移学习

Read more

5分钟精通llama-cpp-python:从安装到AI应用实战全解析

5分钟精通llama-cpp-python:从安装到AI应用实战全解析 【免费下载链接】llama-cpp-pythonPython bindings for llama.cpp 项目地址: https://gitcode.com/gh_mirrors/ll/llama-cpp-python 想要在个人电脑上轻松运行大语言模型?llama-cpp-python作为专为开发者设计的Python绑定库,为您提供了一条快速接入llama.cpp推理引擎的便捷通道。本指南将带您深入掌握这个强大的AI工具包,从基础安装到高级功能应用,一站式解决所有技术难题!🚀 🎯 环境准备与系统兼容性 在开始安装llama-cpp-python之前,请确保您的环境满足以下要求: 基础环境配置: * Python 3.8或更高版本 * C编译器(Linux:gcc/clang,Windows:Visual Studio/Mingw,MacOS:Xcode) * 充足的内存和存储空间 平台特定注意事项: * Windows用户:建议使用Visual Studio构建工具 * MacO

[特殊字符] Meixiong Niannian画图引擎社区精选:50+高质量AI绘画作品及对应Prompt分享

Meixiong Niannian画图引擎社区精选:50+高质量AI绘画作品及对应Prompt分享 1. 为什么这款轻量画图引擎值得你立刻试试? 你有没有过这样的体验:看到一张惊艳的AI画作,心里直呼“这怎么做到的”,可一查部署要求——动辄32G显存、复杂环境配置、命令行调试半天……热情瞬间被浇灭?Meixiong Niannian画图引擎就是为打破这种门槛而生的。 它不是又一个需要折腾半天才能跑起来的实验项目,而是一个真正“开箱即用”的个人创作工具。基于Z-Image-Turbo底座,再叠上专为画图优化的meixiong Niannian Turbo LoRA权重,整个系统像一台调校精准的小型绘图引擎:不臃肿、不卡顿、不挑硬件。24G显存就能稳稳跑满,甚至部分20系显卡用户反馈在开启CPU卸载后也能流畅出图。更关键的是,它配了Streamlit做的可视化界面——没有终端黑窗口,没有yaml配置文件,只有清晰的输入框、滑动条和那个醒目的「🎀 生成图像」按钮。 这不是给工程师看的模型架构图,而是给创作者准备的画布。接下来,我们不讲参数原理,不列技术指标,直接带你走进真实用户的

Copilot认证后强制使用GPT-4o模型的底层逻辑与开发者应对策略

最近在深度使用GitHub Copilot时,发现一个挺有意思的现象:一旦完成企业认证或订阅升级,Copilot的后端模型似乎就被“锁定”为GPT-4o了。对于习惯了根据任务类型灵活切换模型(比如用GPT-4处理复杂推理,用GPT-3.5处理轻量补全)的开发者来说,这多少有点不便。今天就来聊聊这背后的技术逻辑,以及我们作为开发者可以有哪些应对策略。 先看一组直观的数据对比。我在本地简单模拟了两种模型对同一段代码补全请求的响应情况: # 模拟请求日志 import time # GPT-4 (假设调用) start = time.time() # ... 模拟API调用 gpt4_latency = 320 # 毫秒 gpt4_tokens = 1250 # GPT-4o (实际Copilot认证后调用) gpt4o_latency = 280 # 毫秒 gpt4o_tokens = 1180 print(f"GPT-4 响应延迟: {gpt4_latency}ms,

扫频信号 (Sweep/Chirp Signal) 原理与应用

扫频信号 (Sweep/Chirp Signal) 原理与应用

目录 前言 1. 什么是扫频信号? 2. 波形频率是如何变化的? 3. 扫描率 (Sweep Rate) 计算 2. 直观理解:与普通正弦波的区别 3. 常见分类 4. 核心作用:为什么要用扫频信号? 5. 项目实战分析 (结合 FPGA/C++ 代码) 实际测试结果: 测试信号:方波线性扫频(100Hz ~ 125kHz) 测试信号:正弦波线性扫频(100Hz ~ 2MHz) 实验建议 优化后的 FFT 绘图代码 6. 总结 前言         本文旨在记录扫频信号(Chirp)的时频特性,为后续基于扫频法的AD芯片性能测试与数据分析提供理论参考。 1. 什么是扫频信号? 定义:         扫频信号(Sweep