在 WSL2 上搭建机器人强化学习环境(IsaacGym + MuJoCo 踩坑实录)
具身智能绕不开一个核心环节:机器人的强化学习训练。让四足机器狗学会跑、双足机器人站稳,第一步就是搭好仿真环境。
但主流框架(NVIDIA Isaac Gym)对 Windows 支持极差。重装双系统太折腾,WSL2 是个好选择——但配置过程坑也不少。这篇文章记录我在 Windows 笔记本 + RTX 4060 + WSL2 上完整搭建环境的全过程,以及每个报错的解决方法。
先把这些搞清楚
搭建环境之前,我们先认识一下机器人强化学习的四件套:
四件套
| 组件 | 介绍 |
|---|---|
| Isaac Gym | GPU 并行物理引擎,能同时跑几千个个仿真环境 |
| RSL-RL | ETH 开源的 PPO 算法实现 |
| Unitree RL Gym | 宇树的机器人模型 + 训练模板(Go2/G1/H1) |
| MuJoCo | 高精度物理引擎,训练完用来验证和演示 |


训练流程
IsaacGym 创建 4096 个环境 → 策略网络输出动作 → GPU 模拟物理→ 收集经验 → RSL-RL 的 PPO 更新策略 → 循环 1500 轮→ 训练完成 → MuJoCo 验证效果 → 部署到真机我的环境
- Windows 11 + WSL2 Ubuntu 26.04
- GPU: NVIDIA RTX 4060 Laptop (8GB)
- 驱动: NVIDIA 610.47 (WSL 内 610.43.02)
- Python 3.8.20 (conda)
步骤 1:WSL2 + 显卡驱动
WSL2 的好处是 GPU 直接透传——Windows 装了驱动,WSL 里就能用 CUDA。不需要在 WSL 里装 NVIDIA 驱动。
# PowerShell 管理员wsl --install# 重启重启后进 Ubuntu 终端,先确认显卡能认到:
nvidia-smi# 应该看到 RTX 4060,显存 8188MiB如果提示 nvidia-smi: command not found,说明显卡驱动没装或 WSL 版本不对。确保:
- Windows 端装了最新 NVIDIA Game Ready 驱动
wsl --version确认是 WSL2
装一些底层依赖:
sudo apt updatesudo apt install -y build-essential cmake libx11-dev libxext-dev mesa-utils mesa-vulkan-drivers步骤 2:Conda 环境
# 装 minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash Miniconda3-latest-Linux-x86_64.sh -b -u~/miniconda3/bin/conda init bashsource ~/.bashrc
# 创建环境conda create -n robot_gym python=3.8 -yconda activate robot_gym为什么 Python 3.8? Isaac Gym Preview 4 的预编译
.so文件绑定了libpython3.8.so,用其他版本会报ImportError: libpython3.8.so.1.0: cannot open shared object file。
步骤 3:PyTorch + CUDA
pip install torch==2.0.0 torchvision==0.15.1 --index-url https://download.pytorch.org/whl/cu118pip install numpy==1.20.0
numpy==1.20不是乱写的——IsaacGym 的 reward 计算用了旧 API,新版 numpy 会报错。
验证 CUDA 可用:
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"# True# NVIDIA GeForce RTX 4060 Laptop GPU步骤 4:Isaac Gym
去 NVIDIA 开发者页面 下载 IsaacGym_Preview_4_Package.tar.gz(需要注册 NVIDIA 开发者账号)。
解压后放到 home 目录:
cp -r /mnt/d/IsaacGym_Preview_4_Package ~/cd ~/IsaacGym_Preview_4_Package/isaacgym/python/pip install -e .⚠️ 这里有两个坑:
坑 1:libpython3.8.so.1.0 找不到
IsaacGym 的 .so 文件需要 libpython3.8.so,它在 conda 的 lib 目录下但不在系统搜索路径里。解决:
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH坑 2:PhysX GPU 物理不生效
WSL2 的 libcuda.so 在 /usr/lib/wsl/lib/,不是标准路径。PhysX 初始化 GPU 物理时会报 internal error : libcuda.so!,然后回退到 CPU。
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH验证 GPU 物理是否启用:
import isaacgym # 先 import isaacgym,再 import torch!顺序不能反import torchfrom isaacgym import gymapi
gym = gymapi.acquire_gym()p = gymapi.SimParams()p.physx.use_gpu = Truep.use_gpu_pipeline = Trues = gym.create_sim(0, 0, gymapi.SIM_PHYSX, p)# 输出应该包含:# +++ Using GPU PhysX# Physics Device: cuda:0# GPU Pipeline: enabledgym.destroy_sim(s)import 顺序:
isaacgym必须在torch前面! 否则会报ImportError: PyTorch was imported before isaacgym modules。
步骤 5:RSL-RL + Unitree RL Gym
mkdir -p ~/RL/code/unitree_rl_gymcd ~/RL/code/unitree_rl_gym
git clone https://github.com/leggedrobotics/rsl_rl.gitcd rsl_rl && git checkout v1.0.2 && pip install -e .
cd ..git clone https://github.com/unitreerobotics/unitree_rl_gym.gitcd unitree_rl_gym && pip install -e .步骤 6:MuJoCo
pip install mujoco==3.2.3MuJoCo 的 GPU 渲染在 WSL2 下默认是软渲染(llvmpipe),画面会卡顿。要启用 GPU 渲染:
export GALLIUM_DRIVER=d3d12export D3D12_DEFAULT_ADAPTER_NAME=NVIDIA验证:
glxinfo -B | grep "Device:"# 硬渲染: Device: D3D12 (NVIDIA GeForce RTX 4060 Laptop GPU)# 软渲染: Device: llvmpipe (LLVM ...) ← 没生效步骤 7:写进 .bashrc
每次手动 export 太麻烦,直接加到 ~/.bashrc 末尾:
# GPU Compute (CUDA)export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
# IsaacGym viewer 兼容性修复unset WAYLAND_DISPLAY
# MuJoCo 默认软渲染(稳定),需要 GPU 渲染时手动开export MUJOCO_GL=glfw
# 快捷命令alias gpu-render-on='export GALLIUM_DRIVER=d3d12 D3D12_DEFAULT_ADAPTER_NAME=NVIDIA MESA_D3D12_DEFAULT_ADAPTER_NAME=NVIDIA; echo "MuJoCo GPU ON"'alias gpu-render-off='unset GALLIUM_DRIVER D3D12_DEFAULT_ADAPTER_NAME MESA_D3D12_DEFAULT_ADAPTER_NAME; echo "GPU render OFF"'再在 conda 环境激活时自动加载库路径:
mkdir -p ~/miniconda3/envs/robot_gym/etc/conda/activate.d/cat > ~/miniconda3/envs/robot_gym/etc/conda/activate.d/env_vars.sh << 'EOF'#!/bin/bashexport LD_LIBRARY_PATH="$CONDA_PREFIX/lib:/usr/lib/wsl/lib:$LD_LIBRARY_PATH"export MUJOCO_GL=glfwEOFchmod +x ~/miniconda3/envs/robot_gym/etc/conda/activate.d/env_vars.sh最终测试
conda activate robot_gymcd ~/RL/code/unitree_rl_gym/unitree_rl_gym
# 1. IsaacGym GPU 训练测试(headless,不渲染窗口)python legged_gym/scripts/train.py --task=go2 --headless --max_iterations=3
# 2. MuJoCo 部署测试gpu-render-oncd deploy/deploy_mujocopython deploy_mujoco.py g1.yaml两个都没报错就说明环境 OK 了。
开始训练
conda activate robot_gymcd ~/RL/code/unitree_rl_gym/unitree_rl_gym
# 正式训练 Go2python legged_gym/scripts/train.py --task=go2 --headless
# 看训练曲线tensorboard --logdir=logs/| 参数 | 含义 |
|---|---|
--task=go2 | 训练 Go2 机器狗 |
--task=g1 | 训练 G1 人形机器人 |
--task=h1 | 训练 H1 人形机器人 |
--headless | 关掉渲染窗口(训练更快,推荐) |
--max_iterations=1000 | 限制训练轮数 |
--resume | 从 checkpoint 恢复训练 |
我踩过的坑(问题清单)
1. IsaacGym viewer 随机 segfault
训练时去掉 --headless 偶尔崩溃。这是 NVIDIA 610.x 驱动在 WSL2 上的已知 bug,和 CUDA-GL 互操作有关。临时 workaround 是 unset WAYLAND_DISPLAY 能缓解,但不保证彻底解决。建议训练全程用 --headless,如果需要查看最终效果请用 MuJoCo。
2. PhysX 落在 CPU 上
Physics Device: cpu 说明 libcuda.so 没被找到。检查 echo $LD_LIBRARY_PATH 是否包含 /usr/lib/wsl/lib。
3. CONDA_SHLVL 嵌套
反复 conda activate 没先 deactivate 会导致环境变量重复拼接(LD_LIBRARY_PATH 变几十行),严重时会 segfault。conda deactivate 多次直到干净,再重新 conda activate robot_gym。
4. MuJoCo 渲染卡顿
跑 glxinfo -B | grep "Device:",如果显示 llvmpipe 说明在软渲染。执行 gpu-render-on 切换到 D3D12 GPU 加速。
5. import isaacgym 放在 import torch 后面
IsaacGym 会直接报错让你改。养成习惯:isaacgym 永远在最前面。
6. WSL2 别在外面套 Git Bash
从 wsl 命令启动或者直接打开 Ubuntu 终端。Git Bash 里跑 wsl 命令会有路径转换问题(中文乱码),直接进 WSL 终端就没事。
总结
花了大概两天把这些坑趟完了。Windows 笔记本做机器人 RL 训练是可行的,WSL2 的 GPU 透传也够用(RTX 4060 训练 Go2 大约 63k steps/s)。关键是配好 LD_LIBRARY_PATH 和 Mesa 渲染驱动。
接下来的文章会以Open Duck Mini v2为例介绍整个训练流程。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!