从零配置Legged Gym与RSL RL:机器人强化学习环境搭建全攻略

从零配置Legged Gym与RSL RL:机器人强化学习环境搭建全攻略 最近在尝试将强化学习应用到机器人运动控制时发现legged_gym和rsl_rl这两个开源框架的组合非常强大但环境配置过程却是一道不小的门槛。网上资料要么过于零散要么版本过时导致在依赖安装、编译和测试环节反复踩坑。本文旨在提供一个从零开始、手把手式的完整环境配置指南整合了官方文档、社区经验以及我个人的踩坑记录。无论你是刚接触机器人强化学习的学生还是希望快速搭建仿真环境的开发者都能按照本文的步骤成功配置出一个可运行、可调试的legged_gym rsl_rl开发环境并跑通第一个四足机器人训练demo。1. 背景与核心概念为什么是Legged Gym RSL RL在深入配置之前我们有必要理解这两个工具各自扮演的角色以及它们组合起来的价值。这对于后续排查问题和进行二次开发至关重要。1.1 强化学习与机器人运动控制强化学习Reinforcement Learning, RL是机器学习的一个分支其核心思想是智能体Agent通过与环境交互根据获得的奖励Reward或惩罚来学习如何采取行动Action以达成某个目标。在机器人运动控制中智能体就是机器人控制器环境是物理世界或仿真器动作是发送给电机的扭矩指令奖励则根据机器人的运动表现如速度、稳定性、能耗来设计。传统的机器人控制方法如PID、模型预测控制严重依赖精确的动力学模型而强化学习能够通过学习直接从传感器数据映射到控制指令甚至能处理模型不准确、环境不确定的情况非常适合像四足机器人这样具有高度非线性动力学和复杂接触问题的系统。1.2 Legged Gym高性能机器人仿真环境Legged Gym是一个基于NVIDIA Isaac Gym的高性能四足机器人仿真环境。Isaac Gym是一个允许在GPU上进行大规模并行物理仿真的工具这意味着它可以同时仿真成千上万个机器人实例极大加速了强化学习训练数据的收集过程。Legged Gym提供了标准化的机器人模型如ANYmal、Aliengo等经典四足机器人。丰富的任务场景平地行走、爬坡、越障、抗干扰等。高效的仿真后端所有物理计算和状态渲染都在GPU上并行完成速度远超传统的CPU仿真器如PyBullet、MuJoCo。与强化学习框架的接口它负责定义观察空间Observation、动作空间Action、奖励函数Reward和重置条件Reset并将这些信息提供给RL算法。简单说Legged Gym负责“模拟世界”。1.3 RSL RL轻量级强化学习算法库RSL RL是一个由苏黎世联邦理工学院机器人系统实验室开源的强化学习算法库。它设计轻量、模块化专注于机器人领域的连续控制问题。它实现了PPO、SAC等当前主流的强化学习算法并针对机器人训练做了大量优化如观察值归一化、优势估计等。RSL RL提供了算法实现PPO等算法的稳定、高效实现。训练流程管理处理数据收集、模型更新、日志记录和模型保存。与仿真环境的交互它从Legged Gym获取数据计算动作并返回给仿真环境。简单说RSL RL负责“学习大脑”。1.4 二者协作流程典型的训练流程如下环境初始化Legged Gym创建N个并行仿真环境。交互循环Legged Gym将当前所有环境的观测关节角度、角速度、地形信息等传给RSL RL。RSL RL的策略网络根据观测计算出动作目标关节位置或扭矩。Legged Gym执行动作进行一步物理仿真得到新的观测和奖励。该步数据观测动作奖励新观测结束标志被存入RSL RL的经验缓冲区。学习更新当缓冲区数据足够时RSL RL利用PPO等算法更新策略网络和价值网络。循环往复重复步骤2-3直到策略性能收敛。2. 环境准备与版本说明配置成功的关键在于版本匹配。以下是我验证过的稳定组合强烈建议你使用相同或相近的版本以避免不必要的兼容性问题。操作系统Ubuntu 20.04 或 22.04 LTS本文以Ubuntu 22.04为例。这是Isaac Gym官方支持的系统。Windows和macOS不支持。Python3.8 或 3.9。Python 3.10及以上版本可能存在包依赖问题。CUDA11.3 或 11.6/11.7。Isaac Gym对CUDA版本有要求需与PyTorch版本匹配。PyTorch1.12.0 或 1.13.0需与CUDA版本对应。核心工具Git用于克隆代码库。Conda推荐或 venv用于创建独立的Python环境。关键仓库版本legged_gym建议使用当前活跃分支如main本文基于2023年底的commit。rsl_rl使用与legged_gym推荐匹配的版本通常有对应的commit hash。在开始前请确保你的系统已安装NVIDIA显卡驱动并且可以通过nvidia-smi命令正常查看GPU信息。3. 完整环境配置实战接下来我们将一步步完成所有环境的搭建。请严格按照顺序操作。3.1 步骤一创建并激活Conda环境使用Conda可以完美隔离项目依赖避免与系统Python或其他项目冲突。# 创建一个名为legged_rl的Python 3.9环境 conda create -n legged_rl python3.9 -y # 激活环境 conda activate legged_rl激活后命令行提示符前应出现(legged_rl)字样。3.2 步骤二安装PyTorch与CUDA根据你的CUDA版本安装对应的PyTorch。访问 PyTorch官网 获取最新安装命令。例如对于CUDA 11.7# 安装PyTorch 1.13.0 CUDA 11.7 pip install torch1.13.0cu117 torchvision0.14.0cu117 torchaudio0.13.0 --extra-index-url https://download.pytorch.org/whl/cu117安装完成后验证python -c import torch; print(torch.__version__); print(torch.cuda.is_available())应输出PyTorch版本和True。3.3 步骤三安装Isaac Gym这是配置中最关键且最容易出错的一步。下载Isaac Gym访问 NVIDIA Isaac Gym 下载页面 。你需要注册NVIDIA开发者账号免费。选择适合你系统的版本对于Ubuntu 22.04选择对应的预览版或正式版。下载得到的通常是一个.tar.gz文件例如IsaacGym_Preview_4_Package.tar.gz。解压并安装# 假设下载文件在 ~/Downloads 目录 cd ~/Downloads tar -xzf IsaacGym_Preview_4_Package.tar.gz cd isaacgym安装Python依赖和Isaac Gym包# 安装所需的Python包 pip install -r requirements.txt # 安装isaacgym包本身。这步会编译一些C扩展。 pip install -e .-e参数代表以“可编辑”模式安装方便后续查看源码。运行测试示例验证安装cd examples python 1080_balls_of_solitude.py如果安装成功你会看到一个弹窗显示许多小球在物理仿真中弹跳。注意Isaac Gym需要图形界面如果你在无图形界面的服务器上需要设置离屏渲染这更为复杂本文不展开。3.4 步骤四克隆并配置Legged Gym克隆仓库# 切换到你的工作目录例如 ~/projects cd ~/projects git clone https://github.com/leggedrobotics/legged_gym.git cd legged_gym安装Legged Gym的Python依赖pip install -e .同样使用-e模式安装。关键配置设置Isaac Gym路径 Legged Gym需要知道Isaac Gym安装在哪里。通常通过设置环境变量ISAACGYM_PATH_HEADLESS来实现。但更常见的做法是修改其源码中的路径。 打开文件legged_gym/legged_gym/utils/__init__.py或legged_gym/legged_gym/envs/__init__.py具体位置可能随版本变化找到设置isaacgym_path的代码行。通常它会是isaacgym_path “/path/to/your/isaacgym”你需要将其修改为你实际的Isaac Gym解压路径例如isaacgym_path “/home/yourusername/Downloads/isaacgym”或者你也可以在运行脚本前设置环境变量更推荐不修改源码export ISAACGYM_PATH_HEADLESS/home/yourusername/Downloads/isaacgym # 然后将该行添加到你的 ~/.bashrc 中以便永久生效3.5 步骤五克隆并配置RSL RL克隆仓库cd ~/projects # 或你的legged_gym同级目录 git clone https://github.com/leggedrobotics/rsl_rl.git cd rsl_rl安装RSL RLpip install -e .版本兼容性检查 legged_gym的requirements.txt中通常会指定其依赖的rsl_rl版本可能是一个git commit hash。请检查legged_gym/requirements.txt文件。如果里面有类似rsl-rl githttps://github.com/leggedrobotics/rsl_rl.gitcommit_hash的行则意味着legged_gym依赖于特定版本的rsl_rl。最简单的方法是直接使用legged_gym要求的版本。你可以通过git checkout commit_hash切换到指定提交。如果使用最新版大部分情况下也是兼容的但可能存在微小API变动。3.6 步骤六运行测试训练现在所有组件都已就位。让我们运行一个最简单的训练脚本验证整个流程是否通畅。进入legged_gym目录并运行训练脚本cd ~/projects/legged_gym # 使用一个轻量级配置进行测试例如训练步数少一些 python scripts/train.py --taskanymal_c_flat--taskanymal_c_flat表示在平地上训练ANYmal-C机器人。默认情况下训练会运行一定步数如1000步用于验证环境是否能正常交互和学习。观察输出 如果一切正常你将看到类似以下的输出Loading environment… Creating simulation… Initializing RSL RL… Start training… Step: 0, Mean Reward: -10.5, Episode Length: 50 Step: 100, Mean Reward: -5.2, Episode Length: 150 …同时Isaac Gym的视觉窗口会打开显示多个机器人实例在仿真中尝试行走。恭喜至此核心环境配置已经成功。4. 核心配置文件与参数解析能运行之后我们需要理解如何控制训练过程。核心配置通过YAML文件完成。4.1 Legged Gym的任务配置 (legged_gym/legged_gym/cfg/)这个目录下的文件定义了机器人和环境。anymal_c.yaml: 定义了ANYmal-C机器人的URDF路径、电机模型、观测空间和奖励函数权重。terrain.yaml: 定义了地形参数如平地、斜坡、随机粗糙地形等。commands.yaml: 定义了给机器人的速度命令范围。例如anymal_c.yaml中关键部分# 奖励函数权重是强化学习调参的核心 reward_config: scales: lin_vel_z: -2.0 # 惩罚Z轴速度跳跃 ang_vel_xy: -0.05 # 惩罚身体旋转 orientation: -5.0 # 惩罚身体倾斜 torques: -0.0001 # 惩罚扭矩节能 feet_air_time: 1.0 # 奖励足端腾空时间促进奔跑 collision: -1.0 # 惩罚身体碰撞 feet_stumble: -0.0 # 惩罚足端打滑调整这些权重可以 drastically 改变机器人的学习行为。例如增加feet_air_time的权重机器人会更倾向于跑动增加orientation的负权重机器人会更稳定。4.2 RSL RL的训练配置 (rsl_rl/rsl_rl/cfg/)这个目录下的文件定义了强化学习算法本身的参数。ppo.yaml: 包含了PPO算法的所有超参数。algorithm: learning_rate: 1e-3 # 学习率太大可能导致训练不稳定太小则学习慢 schedule: ‘adaptive’ # 学习率调度策略 gamma: 0.99 # 折扣因子未来奖励的重要性 lam: 0.95 # GAE广义优势估计参数 runner: max_iterations: 3000 # 最大训练迭代次数 save_interval: 500 # 每隔多少步保存一次模型 log_interval: 10 # 日志打印间隔 policy: actor_hidden_dims: [256, 256, 256] # 策略网络隐藏层维度 critic_hidden_dims: [256, 256, 256] # 价值网络隐藏层维度学习率和网络结构是最常调整的参数。对于更复杂的任务可能需要更大的网络更多层或每层更多神经元。4.3 如何自定义训练通常你不需要直接修改全局的YAML文件。legged_gym的train.py脚本支持通过命令行参数指定自定义配置文件。创建自定义配置目录mkdir -p ~/projects/my_legged_config cd ~/projects/my_legged_config复制并修改基础配置cp ../legged_gym/legged_gym/cfg/task/anymal_c.yaml my_anymal_c_custom.yaml cp ../legged_gym/legged_gym/cfg/train/ppo.yaml my_ppo_custom.yaml然后使用文本编辑器修改my_anymal_c_custom.yaml中的奖励权重或my_ppo_custom.yaml中的学习率。使用自定义配置启动训练cd ~/projects/legged_gym python scripts/train.py --taskanymal_c_flat \ --headless \ # 无图形界面运行节省资源 --num_envs4096 \ # 增加并行环境数量以加速训练 --cfg_task~/projects/my_legged_config/my_anymal_c_custom.yaml \ --cfg_train~/projects/my_legged_config/my_ppo_custom.yaml \ --max_iterations50005. 常见问题与排查思路 (FAQ)配置和运行过程中你几乎一定会遇到以下一些问题。这里提供了详细的排查思路。问题现象可能原因排查与解决方案ImportError: cannot import name ‘…’ from ‘isaacgym’1. Isaac Gym未正确安装。2. Python环境路径问题。3. Isaac Gym版本与代码不兼容。1. 在Isaac Gym目录下重新执行pip install -e .。2. 确认当前Conda环境已激活且在该环境下安装的isaacgym。3. 检查legged_gym仓库的README或issues确认其要求的Isaac Gym版本。CUDA error: no kernel image is available for executionPyTorch/CUDA版本与Isaac Gym内部编译的CUDA版本不匹配。确保三者一致系统CUDA版本、PyTorch安装的CUDA版本、Isaac Gym编译的CUDA版本。最稳妥的方法是使用Isaac Gym官方推荐版本的PyTorch通常在Isaac Gym的requirements.txt中指定。运行训练脚本后Isaac Gym窗口黑屏或卡住1. 显卡驱动问题。2. 离屏渲染模式设置不正确。3. 系统缺少OpenGL库。1. 更新NVIDIA驱动至最新稳定版。2. 如果是在服务器上确保正确设置了export ISAACGYM_HEADLESS1并安装了必要的libgl库 (sudo apt install libgl1-mesa-glx)。3. 尝试先运行Isaac Gym自带的例子如1080_balls看是否正常。训练时reward一直为负且不增长1. 奖励函数权重设置极端。2. 学习率过高或过低。3. 观测值或奖励值出现NaN。4. 策略网络初始化问题。1. 检查anymal_c.yaml中的奖励权重确保正负奖励平衡。先从默认配置开始。2. 尝试降低学习率如从1e-3降到5e-4。3. 在代码中添加检查打印观测和奖励的范围。4. 尝试不同的随机种子 (--seed参数)。内存不足 (OOM) 错误--num_envs设置过大超出了GPU显存。减少并行环境数量。对于RTX 3090 (24GB)num_envs4096通常是安全的对于更小的显卡尝试2048或1024。在train.py脚本中降低此参数。AttributeError: module ‘numpy’ has no attribute ‘float’NumPy版本过高1.24其中np.float等别名已被移除。降低NumPy版本pip install numpy1.23.5。这是Isaac Gym等旧代码库的常见问题。克隆仓库或安装时网络超时网络连接问题尤其是从GitHub克隆或下载PyTorch时。1. 为Git配置代理如果合法合规且你有权限。2. 使用PyTorch的国内镜像源pip install torch ... -i https://pypi.tuna.tsinghua.edu.cn/simple。3. 手动下载whl文件安装。6. 最佳实践与工程建议成功运行第一个Demo只是开始。要将强化学习应用于实际的机器人控制研究或项目需要遵循以下工程实践。6.1 环境与依赖管理坚持使用Conda环境为每个项目或每个实验分支创建独立环境记录所有依赖 (conda env export environment.yaml)。固定版本在团队协作中务必固定所有核心包的版本PyTorch, Isaac Gym, legged_gym, rsl_rl避免“在我机器上能跑”的问题。使用Docker进阶对于更复杂的部署或确保绝对一致性可以考虑为整个环境创建Docker镜像。6.2 实验管理与日志使用Tensorboardlegged_gym和rsl_rl默认集成了Tensorboard日志。训练时使用--tensorboard参数然后通过tensorboard --logdir runs查看训练曲线奖励、 episode长度等这是分析训练进程最重要的工具。系统化命名实验给每次训练运行起一个描述性的名字--experiment_name“anymal_flat_lr1e4_envs4096”并在代码或笔记中记录对应的配置修改。保存配置与代码快照在训练开始时自动将当前使用的所有配置文件、以及训练脚本的git commit hash保存到日志目录中。这样任何时候都能精确复现实验。6.3 训练调参策略一次只改变一个变量调试时不要同时修改学习率、网络结构和奖励函数。先找到一个能学习的基础配置例如官方提供的默认平地配置然后逐个变量调整观察影响。从简单任务开始不要一开始就挑战复杂地形。先在平地 (anymal_c_flat) 上让机器人学会站立和行走然后再逐步增加地形难度 (anymal_c_rough,anymal_c_slope)。善用--resume参数训练可以从上次保存的模型继续。这对于长时间训练或调整参数后继续微调非常有用。监控关键指标除了总奖励还要关注子奖励项如reward_lin_vel_z,reward_orientation、 episode长度、价值函数损失等它们能告诉你算法具体在优化什么、是否出现了梯度爆炸或消失。6.4 代码与模型版本控制对自定义配置和脚本使用Git将你的my_legged_config目录和任何修改过的训练脚本纳入版本控制。模型检查点管理训练生成的model_XXXX.pt文件可能很大。定期清理旧的检查点只保留关键迭代的模型。可以考虑将最终模型上传到网盘或模型仓库。6.5 向真实机器人部署的考量仿真到实物的转移Sim2Real是一个巨大挑战。legged_gym提供了一些工具来缩小差距域随机化在仿真中随机化机器人的质量、摩擦系数、电机延迟等参数让策略学会应对不确定性。查看配置中的domain_randomization部分。观测噪声在观测中添加噪声模拟真实的传感器误差。动作延迟模拟控制指令的执行延迟。使用PD控制器legged_gym默认输出的是关节位置目标内部会通过一个PD控制器转换为扭矩。你可以调整PD增益来模拟不同硬度的执行器。配置好环境是探索机器人强化学习广阔世界的第一步。你现在拥有了一个强大的工具链Isaac Gym提供的高速仿真Legged Gym提供的标准化机器人环境以及RSL RL提供的稳健学习算法。接下来你可以尝试修改奖励函数让机器人学会奔跑、跳跃或者尝试更复杂的地形甚至将训练好的策略通过ONNX导出部署到真实的四足机器人硬件平台需要额外的中间件和安全考量。这个领域迭代迅速建议多关注原仓库的Issues和Pull Requests以及相关论文如《Learning to Walk in the Wild》不断更新你的知识和工具链。如果在实践中遇到本文未覆盖的新问题欢迎在社区交流讨论。