使用 Genesis 训练 Unitree Go2 四足机器人步态控制

张开发
2026/4/19 20:55:36 15 分钟阅读

分享文章

使用 Genesis 训练 Unitree Go2 四足机器人步态控制
使用Genesis 训练 Unitree Go2 四足机器人步态控制作者背景北航自动化控制水组硕士C 扎实Python 在学。已完成 PPO vs PID 倒立摆对比实验本文记录从零开始用 Genesis 仿真器训练 Go2 步态策略的完整过程包含所有踩坑和解决方案。本文只是跑了案例后续打算继续。环境Windows 11 WSL2 Ubuntu RTX 5060Blackwell, sm_120 Conda PyTorch nightly cu128一、背景为什么选 Genesis 而不是 Isaac Gym很多教程都在用 unitree_rl_gym它依赖的是 Isaac Gym Preview 4。但在开始之前必须搞清楚一个关键概念区分否则会踩大坑名称版本号形式状态用途Isaac Gym Preview 4Preview 1/2/3/4没有4.5/5.0❌ 已弃用停止维护unitree_rl_gym 依赖它Isaac Sim4.0 / 4.5 / 5.0✅ 现役Isaac Lab 依赖它Isaac Labv1.x / v2.x✅ 官方推荐新一代RL框架Genesis0.4.x✅ 2024年底新出本文使用RTX 5060Blackwell架构sm_120的特殊问题Isaac Gym Preview 4 的物理引擎是预编译闭源二进制不支持 sm_120大概率跑不起来失败记录见上一篇博客RTX 5060 WSL2 搭建 Go2 强化学习训练环境记录(失败记录)-CSDN博客。Isaac Sim 在 WSL2 上也有严重的 GPU 识别问题。Genesis 是纯 Python 实现对新架构友好且官方有完整的 Go2 示例因此是当前环境下的最优选择。二、环境配置2.1 前提条件Windows 侧已安装最新 NVIDIA 驱动支持 BlackwellWSL2 Ubuntu 已安装Conda 虚拟环境 rl 已建好PyTorch nightly cu128 已装好运行输出torch.cuda.is_available() 返回 True2.2 安装 GenesisGenesis 可以直接 pip 安装不需要克隆整个仓库pip install genesis-world # 验证 python -c import genesis; print(Genesis OK) # 找到包的安装路径示例文件在这里 python -c import genesis; import os; print(os.path.dirname(genesis.__file__))2.3 安装训练依赖# 注意必须是 rsl-rl-lib 5.0.0旧版会报 ImportError pip install rsl-rl-lib5.0.0 tensorboard -i https://pypi.tuna.tsinghua.edu.cn/simple踩坑1如果 pip 报 ProxyError是因为之前设置了错误的代理环境变量。解决方法unset http_proxy unset https_proxy unset HTTP_PROXY unset HTTPS_PROXY sed -i /WINDOWS_HOST/d ~/.bashrc sed -i /https_proxy/d ~/.bashrc sed -i /http_proxy/d ~/.bashrc2.4 获取 Go2 示例文件由于国内网络问题我直接 git clone Genesis 仓库会失败GnuTLS TLS 解码错误。解决方案在 Windows 浏览器里直接下载以下三个文件然后复制到 WSL2https://raw.githubusercontent.com/Genesis-Embodied-AI/Genesis/main/examples/locomotion/go2_train.py https://raw.githubusercontent.com/Genesis-Embodied-AI/Genesis/main/examples/locomotion/go2_eval.py https://raw.githubusercontent.com/Genesis-Embodied-AI/Genesis/main/examples/locomotion/go2_env.py假设下载到 D:\RL\Genesis\在 WSL2 里执行mkdir -p ~/genesis_examples/locomotion cp /mnt/d/RL/Genesis/go2_train.py ~/genesis_examples/locomotion/ cp /mnt/d/RL/Genesis/go2_eval.py ~/genesis_examples/locomotion/ cp /mnt/d/RL/Genesis/go2_env.py ~/genesis_examples/locomotion/三、关键报错与解决方案汇总报错1libcuda.so lib not found / Arch[cuda] is not supported[W] [cuda_driver.cpp:load_lib35] libcuda.so lib not found. RuntimeError: Arch[Arch.cuda: 4] is not supported原因Genesis 的底层物理引擎quadrants找不到 WSL2 里的 CUDA 库。WSL2 的 libcuda.so 在特殊路径下不在标准 LD_LIBRARY_PATH 里。解决# 验证 libcuda.so 确实存在 ls /usr/lib/wsl/lib/libcuda* # 临时修复 export LD_LIBRARY_PATH/usr/lib/wsl/lib:$LD_LIBRARY_PATH # 永久修复写入 bashrc echo export LD_LIBRARY_PATH/usr/lib/wsl/lib:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc报错2unrecognized arguments: --headless新版 Genesis 不需要 --headless 参数WSL2 无显示器环境下会自动检测。直接去掉该参数python go2_train.py -e go2_experiment报错3ImportError: Please install ‘rsl-rl-lib5.0.0’pip install rsl-rl-lib5.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple报错4FileNotFoundError: logs/go2-walking/cfgs.pkleval 默认找 go2-walking 这个实验名但训练时用了自定义名字。加 -e 参数指定python go2_eval.py -e go2_v2报错5GenesisException: No display detectedWSL2 没有显示器eval 脚本默认开 viewer 会失败。在 Go2Env() 初始化时设置 show_viewerFalse。报错6GenesisException: Scene is already built相机必须在 scene.build() 之前添加。Go2Env 初始化时已经 build 了 scene所以需要用 monkey-patch 方式在 build 前插入相机见第五节 eval 完整代码。报错7TypeError: can’t assign a str to a torch.FloatTensorfollow_entity 的 fixed_axis 参数不是字符串是三元组。正确用法# 错误 cam.follow_entity(env.robot, fixed_axisz) # 正确(x, y, z)None 表示跟随数值表示固定在该值 cam.follow_entity(env.robot, fixed_axis(None, 2.5, 0.8))四、训练cd ~/genesis_examples/locomotion # 设置 CUDA 库路径每次新终端都要或者已写入 bashrc export LD_LIBRARY_PATH/usr/lib/wsl/lib:$LD_LIBRARY_PATH # 开始训练1000轮约12分钟 python go2_train.py -e go2_v2 --max_iterations 1000另开一个终端监控训练曲线conda activate rl cd ~/genesis_examples/locomotion tensorboard --logdir logs # Windows 浏览器打开 http://localhost:6006训练指标解读Steps per second: 415948 ← RTX 5060 跑 Genesis41万步/秒 Mean reward: 21.90 ← 核心指标从0涨到21说明策略在收敛 rew_tracking_lin_vel: 0.9924 ← 线速度跟踪接近1.0表示基本收敛 ✅ rew_tracking_ang_vel: 0.1995 ← 角速度跟踪还有提升空间 rew_lin_vel_z: -0.0054 ← 惩罚项接近0说明机器人没有乱跳 ✅ Time elapsed: 00:12:08 ← 1000轮只用了12分钟模型保存位置logs/go2_v2/model_0.pt, model_100.pt, …, model_999.pt五、可视化录制步态视频由于 WSL2 没有图形界面使用 Genesis 内置的录制功能生成 mp4。完整 go2_eval.py含镜头跟随import argparse import os import pickle from importlib import metadata import torch try: if int(metadata.version(rsl-rl-lib).split(.)[0]) 5: raise ImportError except (metadata.PackageNotFoundError, ImportError, ValueError) as e: raise ImportError(Please install rsl-rl-lib5.0.0.) from e from rsl_rl.runners import OnPolicyRunner import genesis as gs from go2_env import Go2Env def main(): parser argparse.ArgumentParser() parser.add_argument(-e, --exp_name, typestr, defaultgo2-walking) parser.add_argument(--ckpt, typeint, defaultNone) args parser.parse_args() gs.init(backendgs.cpu) log_dir flogs/{args.exp_name} with open(flogs/{args.exp_name}/cfgs.pkl, rb) as f: env_cfg, obs_cfg, reward_cfg, command_cfg, train_cfg pickle.load(f) reward_cfg[reward_scales] {} # 必须在 scene.build() 前添加相机用 monkey-patch 实现 original_build gs.Scene.build cam_holder {} def patched_build(self, *args, **kwargs): cam_holder[cam] self.add_camera( res(1280, 720), pos(0.0, 2.5, 0.8), # 侧面视角 lookat(0.0, 0.0, 0.3), fov45, GUIFalse, ) return original_build(self, *args, **kwargs) gs.Scene.build patched_build env Go2Env( num_envs1, env_cfgenv_cfg, obs_cfgobs_cfg, reward_cfgreward_cfg, command_cfgcommand_cfg, show_viewerFalse, ) gs.Scene.build original_build cam cam_holder[cam] # 自动选最新 checkpoint if args.ckpt is None: ckpts [f for f in os.listdir(log_dir) if f.startswith(model_) and f.endswith(.pt)] ckpts.sort(keylambda x: int(x.split(_)[1].split(.)[0])) ckpt_num int(ckpts[-1].split(_)[1].split(.)[0]) print(fAuto-selected checkpoint: model_{ckpt_num}.pt) else: ckpt_num args.ckpt runner OnPolicyRunner(env, train_cfg, log_dir, devicegs.device) runner.load(os.path.join(log_dir, fmodel_{ckpt_num}.pt)) policy runner.get_inference_policy(devicegs.device) obs_dict env.reset() # 镜头跟随X轴跟机器人Y轴固定2.5侧面Z轴固定0.8高度 cam.follow_entity(env.robot, fixed_axis(None, 2.5, 0.8), smoothing0.1) output_path os.path.abspath(flogs/{args.exp_name}/go2_follow.mp4) print(fRecording to: {output_path}) cam.start_recording() with torch.no_grad(): for i in range(500): actions policy(obs_dict) obs_dict, rews, dones, infos env.step(actions) cam.render() if (i 1) % 100 0: print(f Step {i1}/500) cam.stop_recording(save_to_filenameoutput_path, fps50) print(f✅ Done! Video: {output_path}) if __name__ __main__: main()运行并复制到 Windows“mnt/h后面跟自己路径”python go2_eval.py -e go2_v2 cp ~/genesis_examples/locomotion/logs/go2_v2/go2_follow.mp4 /mnt/d/RL/Genesis/最后在windows对应的盘可以找到视频go2_follow六、项目结构总览~/genesis_examples/locomotion/ ├── go2_env.py # 核心观测空间、动作空间、奖励函数定义 ├── go2_train.py # 训练入口 ├── go2_eval.py # 推理录视频 └── logs/ └── go2_v2/ ├── cfgs.pkl # 训练配置存档 ├── model_0.pt # 各轮次模型 ├── model_100.pt ├── ... ├── model_999.pt # 最终模型 └── go2_follow.mp4 # 录制的步态视频七、参考资料Genesis 官方文档https://genesis-world.readthedocs.iounitree_rl_gymhttps://github.com/unitreerobotics/unitree_rl_gymunitree_rl_labIsaac Lab版https://github.com/unitreerobotics/unitree_rl_labNVIDIA CUDA on WSL2https://docs.nvidia.com/cuda/wsl-user-guide/index.html

更多文章