1. 为什么机器人仿真要在 Windows 上套一层 WSL2
如果你正在做强化学习、机械臂控制或者足式机器人算法,MuJoCo 大概率已经出现在你的工具清单里。它最吸引人的地方是接触动力学求解速度极快,同样的训练步数,MuJoCo 往往比通用仿真器省下大量时间。DeepMind 开源之后,Python 绑定做得非常干净,pip install mujoco就能用,底层 C 引擎自动编译,不需要你手动配环境变量。
但问题出在 Windows 原生环境上。MuJoCo 本身能跑,可一旦你后面要接 ROS2、要编译 C++ 控制器、要用到某些只在 Linux 下维护的依赖,Windows 就会开始给你制造麻烦。我见过太多人在 Windows 上折腾 ROS2 通信,最后卡在 DDS 发现机制或者路径分隔符上。所以目前比较省心的组合是:Windows 宿主机负责日常办公和显卡驱动,WSL2 里的 Ubuntu 负责跑仿真和算法。
这篇教程面向 Win10 和 Win11 用户,从零把 WSL2 + Ubuntu 22.04 + MuJoCo 的完整链路走一遍。你会拿到可以直接复制的.wslconfig、apt 依赖清单、Miniconda 安装步骤,以及一个能弹出 3D 窗口的测试脚本。目标只有一个:让你一次跑通,看到那个红方块和绿球在窗口里动起来。
需要提前说明的是,Win10 和 Win11 在图形界面上有本质差异,Win11 自带 WSLg,窗口可以直接弹出来;Win10 需要额外配一个 X Server。这个差异我会在第三节单独拆开讲,你按自己的系统对号入座就行。
2. 前置准备:WSL2 安装与 TaoToken 接入配置
2.1 安装 WSL2 与 Ubuntu 22.04
先确认你的 Windows 版本。Win10 需要 2004 及以上版本,Win11 全版本支持。打开管理员终端,右键开始菜单选“终端(管理员)”或“Windows PowerShell (管理员)”,执行:
wsl --install -d Ubuntu-22.04这条命令会自动启用虚拟机平台、安装 WSL2 内核、拉取 Ubuntu 22.04 镜像。安装完成后按提示输入 UNIX 用户名(全小写)和密码,密码输入时不显示,盲打回车即可。
如果你之前装过 WSL,可能会遇到ERROR_ALREADY_EXISTS。这说明系统里已经有这个发行版了,直接wsl -d Ubuntu-22.04进入即可。如果忘了密码想重来,先wsl --unregister Ubuntu-22.04注销(会清空数据),再重新执行安装命令。
强烈建议用 Ubuntu 22.04 LTS,这是目前机器人领域的主力版本,后面要装 ROS2 Humble 可以省掉大量源码编译的坑。
2.2 用 TaoToken 统一管理模型调用
仿真环境搭好之后,你大概率会想让 AI 帮你写控制器代码、解释报错、生成奖励函数。这时候如果每个模型都单独配 Key,管理起来很乱。我习惯用 TaoToken 做统一入口,它兼容 OpenAI 风格的接口,改一下base_url就能切换模型。
官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api 。你可以在控制台创建 Key,然后把它写进环境变量,后面写代码时直接读环境变量,不用硬编码。
对于长期做编码和 Agent 的场景,可以看看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。如果你只是想先验证模型能不能正常对话,用模型对话页面就够了:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。
Key 的创建入口在控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,遇到参数问题可以先翻这里。
2.3 配置 .wslconfig 控制资源占用
WSL2 默认会吃掉大量内存,跑仿真时如果宿主机还要开浏览器和 IDE,容易卡。在 Windows 用户目录下创建.wslconfig文件(路径是C:\Users\你的用户名\.wslconfig),写入:
[wsl2] memory=8GB processors=4 swap=2GB localhostForwarding=true内存和处理器按你机器实际情况调整。改完后在 PowerShell 执行wsl --shutdown重启 WSL 生效。这个配置能防止 WSL2 把宿主机内存吃满,实测下来对仿真稳定性帮助很大。
3. 可复制配置:图形界面、依赖与 MuJoCo 环境
3.1 Win11 与 Win10 的图形透传差异
这是整篇教程最关键的分叉点。
Win11 自带 WSLg,图形界面无缝透传。你不需要装任何额外软件,只要确保 Windows 本机显卡驱动是最新的,Linux 里的窗口就会像原生 Windows 程序一样弹出来,并且支持 GPU 加速。装完 Ubuntu 直接跳到 3.2 节。
Win10 默认不支持直接弹窗。你需要在 Windows 本机装一个 X Server,比如 VcXsrv。启动时务必勾选 “Disable access control”,否则 WSL 里的程序连不上。然后进入 WSL2 终端,把显示重定向到宿主机:
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0这行命令的意思是:从/etc/resolv.conf里取出宿主机 IP,把图形输出指向它。建议把这行写进~/.bashrc,省得每次手动敲:
echo 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk "{print \$2}"):0' >> ~/.bashrc source ~/.bashrc3.2 安装基础依赖
进入 WSL2 终端,先更新源并装一批 MuJoCo 渲染需要的库:
sudo apt update && sudo apt upgrade -y sudo apt install -y \ build-essential \ libgl1-mesa-dev \ libgl1-mesa-glx \ libglew-dev \ libosmesa6-dev \ libglfw3 \ libglfw3-dev \ libegl1 \ libxrandr2 \ libxinerama1 \ libxcursor1 \ libxi6 \ patchelf \ wget \ git这些库覆盖了 OpenGL 渲染、窗口管理和动态链接修补。libosmesa6-dev是无头渲染的后备方案,万一图形窗口出不来,还能用离屏渲染跑训练。
3.3 用 Miniconda 隔离环境
别用系统自带的 Python 直接装包,依赖冲突会让你怀疑人生。下载并安装 Miniconda:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh一路回车读条款,输入 yes 同意。最后一步问 “Proceed with initialization?” 时务必输入 yes。如果不小心选了 no 导致conda命令找不到,手动初始化:
~/miniconda3/bin/conda init bash source ~/.bashrc重启终端或source ~/.bashrc,看到提示符前面出现(base)后,创建专属环境:
conda create -n mujoco python=3.10 -y conda activate mujoco此时终端前缀变成(mujoco),环境就绪。
3.4 安装 MuJoCo
新版 MuJoCo 的 Python 绑定体验很好,底层自动调用 C 引擎,不需要去官网下载二进制再配环境变量。直接:
pip install mujoco如果你需要 GPU 加速渲染,可以额外装mujoco[mjx],但纯 CPU 跑接触动力学已经足够快。装完后用pip show mujoco确认版本,建议 3.0 以上。
4. 验证请求:跑通第一个 3D 仿真窗口
4.1 编写测试脚本
在终端用 nano 创建测试文件:
nano test_mujoco.py粘贴以下代码。这个脚本定义了一个红色方块和一个受重力下落的绿色球体,启动交互式窗口后步进 30 秒:
import mujoco import mujoco.viewer import time xml_string = """ <mujoco> <worldbody> <light name="top" pos="0 0 1"/> <geom name="red_box" type="box" size=".2 .2 .2" rgba="1 0 0 1"/> <geom name="green_sphere" pos=".2 .2 .5" size=".1" rgba="0 1 0 1"/> </worldbody> </mujoco> """ model = mujoco.MjModel.from_xml_string(xml_string) data = mujoco.MjData(model) with mujoco.viewer.launch_passive(model, data) as viewer: start = time.time() while viewer.is_running() and time.time() - start < 30: mujoco.mj_step(model, data) viewer.sync() time.sleep(model.opt.timestep)按Ctrl + O保存,Ctrl + X退出。
4.2 运行与预期结果
执行:
python test_mujoco.py如果一切正常,你的 Windows 桌面上会弹出一个 3D 窗口,左侧有控制面板,中间是红色方块和绿色圆球。绿球会受重力下落,碰到方块后弹开。窗口支持鼠标拖拽旋转视角、滚轮缩放。
Win11 用户此时应该直接看到窗口。Win10 用户如果窗口没弹出来,检查 VcXsrv 是否在运行、DISPLAY变量是否设置正确。可以在 WSL 里执行echo $DISPLAY确认输出是宿主机 IP 加:0。
4.3 用 TaoToken 辅助调试
如果运行时报错,可以把错误信息贴给模型让它帮你分析。用 curl 测试接口连通性:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "MuJoCo viewer 窗口不弹出,DISPLAY 已设置,怎么排查?"}] }'把TAOTOKEN_API_KEY换成你在控制台创建的 Key。返回正常说明接口通了,模型会给你排查思路。如果你用的是 Claude Code 做编码,可以参考 https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_content=claude-code&utm_campaign=rewrite 里的接入方式。
5. 本篇常见错排查
5.1 窗口不弹出或黑屏
Win10 最常见。先确认 VcXsrv 启动时勾了 “Disable access control”。然后检查DISPLAY变量:
echo $DISPLAY如果输出为空,说明~/.bashrc里的 export 没生效,手动执行一次再跑脚本。如果输出是:0而不是 IP 形式,说明取 IP 的命令失败了,可以改用固定写法:
export DISPLAY=$(ip route list default | awk '{print $3}'):0Win11 如果黑屏,先更新显卡驱动。WSLg 依赖宿主机的 GPU 驱动做加速,驱动太旧会导致渲染失败。
5.2 libGL 相关报错
报错信息里出现libGL error: MESA-LOADER或failed to open swrast,通常是缺少软件渲染后备。安装:
sudo apt install -y mesa-utils libglu1-mesa然后测试glxinfo -B看渲染器信息。如果显示llvmpipe,说明在用 CPU 软渲染,能跑但慢。想用 GPU 加速需要确保 WSL2 能访问宿主机显卡,Win11 一般自动支持。
5.3 conda 命令找不到
如果安装 Miniconda 时最后一步选了 no,conda不会自动加入 PATH。手动初始化:
~/miniconda3/bin/conda init bash source ~/.bashrc如果连~/miniconda3目录都不存在,说明安装中途失败了,重新执行安装脚本,注意最后一步选 yes。
5.4 pip 安装 mujoco 超时
国内网络直接拉 PyPI 可能慢。可以换镜像源:
pip install mujoco -i https://pypi.tuna.tsinghua.edu.cn/simple如果还是超时,检查 WSL2 的 DNS 配置。在/etc/resolv.conf里加上nameserver 8.8.8.8再试。
5.5 仿真步进卡顿
如果窗口能弹出但动画一顿一顿的,多半是time.sleep(model.opt.timestep)的精度问题。Python 的 sleep 最小粒度受系统调度影响,可以改成忙等待或者用viewer.sync()的节奏控制。另外确认.wslconfig里给的内存够用,内存不足会触发 swap,导致卡顿。
6. 接入与验证入口
环境跑通之后,下一步通常是接模型帮你写控制器或者调奖励函数。如果你只是验证模型能不能正常返回,用模型对话页面最快:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。如果你要长期做编码和 Agent 开发,Coding Plan 更合适:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。
Key 在控制台创建:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,创建后在 API Keys 页面管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。接入参数和报错码对照在文档里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
最后提醒一句:MuJoCo 的 XML 模型文件建议单独放一个目录,用git管理版本。仿真参数调优是个反复试错的过程,每次改动都提交一次,回滚起来方便。窗口跑通只是起点,后面把mj_step换成你的控制循环,才是真正开始。