下面给出教程conda安装
pip install numpy scipy matplotlib pandas
pip install stable-baselines3[extra] # 包含 Gym, tensorboard 支持
pip install tianshou cleanrl # 可选
pip install tensorboard wandb
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu122(CUDA 12.2 为例)
pip install gymnasium[all]
pip install mujoco mujoco-py
需要提前在系统安装 MuJoCo license 和库文件(
~/.mujoco/mujoco210或 mujoco 3.4)推荐两个版本都用,很方便
备注:这里给出安装显卡驱动和cuda以及cudnn的教程,驱动下载 cuda cudnn ,请自行参考
你要知道强化学习(RL)是什么,你安装的库都是干什么的,还有强化学习的根本机理,为什么强化学习可以让机器人学习,并部署到仿真和实际(simtosim,simtoreal),如果有时间我建议你读一下我上面的链接,如果没有时间,我建议你去问gpt这些问题,明白了这些东西你才能走下一步,否则很难,
我建议你去训练出来一个最简单的单摆,观察参数的变化,还有可以尝试不同的算法,来看看哪种算法适合哪种环境,哪种算法可以快速训练出来好的结果
下面给出一些经典案列
https://github.com/leggedrobotics/legged_gym
https://github.com/unitreerobotics/unitree_rl_gym.git
有一个大佬写的很好,这里我直接给出链接 深入浅出强化学习,如果在实现的过程中遇到错误,可以回来看看我的一些解决方法
export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json
先执行:
ls ~/anaconda3/envs/unitree_rl/lib/libpython3.8.so*
如果你看到类似:
libpython3.8.so
libpython3.8.so.1.0
那说明库是存在的,只是系统找不到
手动告诉系统去哪里找
export LD_LIBRARY_PATH=~/anaconda3/envs/unitree_rl/lib:$LD_LIBRARY_PATH
(3)在legged_gym运行仿真的时候要指定到底是哪个mujoco
设置环境变量
# 添加 MuJoCo 动态库路径到 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lzy/.mujoco/mujoco-3.4.0/bin
先在urdf里面加上(这里不过多解释,自己去查gpt去)
<mujoco>
<compiler
balanceinertia="true"
discardvisual="false" />
</mujoco>
下面给出命令
~/.mujoco/mujoco210/bin/compile /home/lzy/Desktop/ws_dog/src/dog/urdf/dog.urdf //你的模型 /home/lzy/Desktop/ws_dog/src/dog/xml/dog.xml //存放路径
如果出现下面错误
(unitree_rl) lzy@lzy-Dell-G15-5530:~/mujoco_dog$ ~/.mujoco/mujoco210/bin/compile /home/lzy/Desktop/ws_dog/src/dog/urdf/dog.urdf /home/lzy/Desktop/ws_dog/src/dog/xml/dog.xml Error: number of faces should be between 1 and 200000 in STL file '/home/lzy/Desktop/ws_dog/src/dog/meshes/body_link.STL'; perhaps this is an ASCII file? Object name = body_link, id = 0
请按照这个链接处理,提醒:千万要另存到其他地方,他并不是在你原来的上面操做,它相当于拷贝了一份(哭死)
然后就应该可以转了,转出来并不能直接用,只是一个框架。
然后可以往里面加上传感器和一些摩擦参数,加上地面(不加地面会直接掉下去)
<texture name="grid" type="2d" builtin="checker" rgb1=".1 .2 .3" rgb2=".2 .3 .4" width="300" height="300" mark="edge" markrgb=".2 .3 .4"/>
<material name="grid" texture="grid" texrepeat="2 2" texuniform="true" reflectance=".2"/>
<!-- 添加地面 -->
<geom name="ground" type="plane" size="10 10 0.1" pos="0 0 0" material="grid"/>
<!-- 添加光源 -->
<light name="light" pos="0 0 5" dir="0 0 -1" directional="true"/>
<mujoco model="dog scene">
<include file="dog.xml"/>
<statistic center="0 0 0.1" extent="0.8"/>
<visual>
<headlight diffuse="0.6 0.6 0.6" ambient="0.3 0.3 0.3" specular="0 0 0"/>
<rgba haze="0.15 0.25 0.35 1"/>
</visual>
<asset>
<texture type="skybox" builtin="gradient" rgb1="0.3 0.5 0.7" rgb2="0 0 0" width="512" height="3072"/>
<texture type="2d" name="groundplane" builtin="checker" mark="edge" rgb1="0.2 0.3 0.4" rgb2="0.1 0.2 0.3"
markrgb="0.8 0.8 0.8" width="300" height="300"/>
<material name="groundplane" texture="groundplane" texuniform="true" texrepeat="5 5" reflectance="0.2"/>
</asset>
<worldbody>
<light pos="0 0 1.5" dir="0 0 -1" directional="true"/>
<geom name="floor" size="0 0 0.05" type="plane" material="groundplane"/>
<geom pos="1.2 0 0.04" type="box" size="0.1 2 0.04" quat="1.0 0 0 0"/>
<geom pos="1.6 0 0.04" type="box" size="0.1 2 0.04" quat="1.0 0 0 0"/>
<geom pos="2.3 0 0.02" type="box" size="0.2 2 0.15" quat="1.0 0 0 0"/>
<geom pos="2.6 0 0.02" type="box" size="0.22 2 0.3" quat="1.0 0 0 0"/>
<geom pos="2.8 0 0.02" type="box" size="0.23 2 0.45" quat="1.0 0 0 0"/>
<geom pos="3 0 0.02" type="box" size="0.24 2 0.6" quat="1.0 0 0 0"/>
<geom pos="3.2 0 0.02" type="box" size="0.25 2 0.75" quat="1.0 0 0 0"/>
<geom pos="3.4 0 0.02" type="box" size="0.26 2 0.9" quat="1.0 0 0 0"/>
</worldbody>
</mujoco>
接下来要验证是否成功
cd .mujoco/mujoco210/bin/
./simulate
然后把xml文件拖进去即可,成功显示就是成功
如果出现下面错误,就把stl文件全部复制到xml下面,应该就能解决
Error: could not open STL file '/home/lzy/Desktop/dog/body_link.stl'
Object name = body_link, id = 0, line = 7, column = 9
首先克隆全新源码到自己的目录里面!(你之前学习的不推荐用,不知道被改了什么地方)
按下面操作创建自己的任务
cd legged_gym/
cd envs/
然后创建ws_dog文件夹(名字随意),创建下面的文件,注意类名一定要相同,其实就是类似于c++的继承
ws_dog/
├── __init__.py # 创建任务、注册环境
├── dog.xml # MuJoCo XML 文件
├── ws_dog_config.py # 训练/环境配置
└── ws_dog.py # 环境类(注册到 legged_gym)
下面是最简单实例
ws_dog.py
from legged_gym.envs.base.legged_robot import LeggedRobot
class YourDog(LeggedRobot):
def __init__(self, cfg, sim_params, physics_engine, sim_device, headless):
super().__init__(cfg, sim_params, physics_engine, sim_device, headless)
ws_dog_config.py
from legged_gym.envs.base.legged_robot_config import (
LeggedRobotCfg,
LeggedRobotCfgPPO
)
# =========================
# 机器人环境配置
# =========================
class YourDogCfg(LeggedRobotCfg):
# -------- 环境基础参数 --------
class env(LeggedRobotCfg.env):
num_envs = 512
# 并行仿真的环境数量(GPU 并行)
# 数量越大,采样越快,但显存占用越高
num_observations = 235
# 单步观测向量的维度
# 使用 LeggedRobot 默认观测结构(关节、IMU、速度等)
num_actions = 12
# 动作维度,通常等于关节数
# 四足 × 3 关节 = 12
episode_length_s = 8.0
# 单个 episode 最长持续时间(秒)
# 超时会强制 reset
# -------- 初始状态配置 --------
class init_state(LeggedRobotCfg.init_state):
pos = [0.0, 0.0, 0.35]
# 机器人 base 在世界坐标系中的初始位置
# z=0.35 通常略高于站立高度,防止一开始穿地
default_joint_angles = {
# 机器人 reset 时的关节初始角度(单位:弧度)
# ⚠️ 关节名字必须与 dog.xml 中完全一致
"lf_joint1": 0.0, "lf_joint2": -0.9, "lf_joint3": 0.2,
"rf_joint1": 0.0, "rf_joint2": -0.9, "rf_joint3": 0.2,
"lb_joint1": 0.0, "lb_joint2": -0.9, "lb_joint3": 0.2,
"rb_joint1": 0.0, "rb_joint2": -0.9, "rb_joint3": 0.2,
}
# 这一组角度决定了“站立姿态”
# 初始姿态非常重要,差了会直接训练崩
# -------- 地形配置 --------
class terrain(LeggedRobotCfg.terrain):
mesh_type = "plane"
# 使用无限平面地形
# 强烈建议:站立 / 行走初期只用 plane
# -------- 指令系统(期望运动)--------
class commands(LeggedRobotCfg.commands):
num_commands = 3
# 指令维度:vx, vy, yaw_rate
resampling_time = 1000.0
# 指令重采样时间(秒)
# 时间很大 ≈ 整个 episode 不变
heading_command = False
# 是否使用期望朝向(一般行走才用)
class ranges(LeggedRobotCfg.commands.ranges):
lin_vel_x = [0.0, 0.0]
lin_vel_y = [0.0, 0.0]
ang_vel_yaw = [0.0, 0.0]
# 所有指令范围设为 0
# 👉 表示“站立任务”,不要求运动
# -------- 控制器参数 --------
class control(LeggedRobotCfg.control):
control_type = "P"
# P 控制(位置控制)
# action = 期望关节角度增量
stiffness = {
"hip": 100.0,
"thigh": 110.0,
"calf": 110.0
}
# 关节等效刚度(Kp)
# 越大越“硬”,但太大会抖
damping = {
"hip": 3.0,
"thigh": 3.5,
"calf": 3.5
}
# 关节阻尼(Kd)
# 用于抑制振荡
action_scale = 0.05
# 策略输出的动作缩放
# 实际关节目标变化 = action * action_scale
decimation = 2
# 控制降采样
# 每 decimation 个仿真步更新一次 action
# -------- 机器人资产配置 --------
class asset(LeggedRobotCfg.asset):
file = "{LEGGED_GYM_ROOT_DIR}/legged_gym/envs/ws_dog/dog.xml"
# MuJoCo XML 模型路径
name = "ws_dog"
# 机器人在仿真中的名称
foot_name = "link4"
# 脚端 link 的名字
# 用于接触检测、奖励计算
penalize_contacts_on = ["link2", "link3"]
# 如果这些 link 接触地面,会给予惩罚
# 通常是大腿 / 小腿
terminate_after_contacts_on = ["body", "robot"]
# 如果这些 link 接触地面,直接终止 episode
# 防止机器人趴地“躺赢”
default_dof_drive_mode = 2
# 2 = 位置控制(gymapi.DOF_MODE_POS)
# -------- 奖励函数配置 --------
class rewards(LeggedRobotCfg.rewards):
base_height_target = 0.35
# 期望 base 高度(用于高度奖励)
class scales(LeggedRobotCfg.rewards.scales):
termination = -50.0
# 提前终止的惩罚(很大)
base_height = 8.0
# 保持高度的奖励权重
orientation = 12.0
# 保持身体姿态(roll / pitch)的奖励权重
# =========================
# PPO 训练参数
# =========================
class YourDogCfgPPO(LeggedRobotCfgPPO):
class algorithm(LeggedRobotCfgPPO.algorithm):
pass
# 使用 legged_gym 默认 PPO 参数
# 新手阶段不建议乱改
class runner(LeggedRobotCfgPPO.runner):
max_iterations = 2500
# 训练迭代次数
# 实际 step = iterations × num_envs × steps_per_env
run_name = "ws_dog_stand"
# 日志 & 模型保存名称
__init__.py
from legged_gym.utils.task_registry import task_registry
from .ws_dog import YourDog
from .ws_dog_config import YourDogCfg, YourDogCfgPPO
# 注册任务
task_registry.register(
"ws_dog",
YourDog,
YourDogCfg(),
YourDogCfgPPO()
)
完成上面的还需要再envs/__init__.py 加入
from . import ws_dog
最后一定要执行,让Python 能 import legged_gym,否则找不到自定义任务,务必加上
export PYTHONPATH=~/Desktop/my_legged_rl/legged_gym:$PYTHONPATH
然后在legged_gym/legged_gym/legged_gym/scripts里面执行下面命令,就可以训练了
python train.py --task=ws_dog
训练的结果在legged_gym/logs即可查看,至此simtosim初步实现。





