Skip to content

WantDog/RL-DOG

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

初窥强化学习

1.环境要求

(1)推荐使用虚拟环境,使用conda创建,可以管理python版本

下面给出教程conda安装

(2)相关库,推荐装NVIDIA驱动,训练贼快(就是有点难装)

pip install numpy scipy matplotlib pandas
pip install stable-baselines3[extra]  # 包含 Gym, tensorboard 支持
pip install tianshou cleanrl         # 可选
pip install tensorboard wandb
CPU-only PyTorch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
GPU PyTorch(可选):
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu122(CUDA 12.2 为例)
OpenAI Gym / Gymnasium
pip install gymnasium[all]
MuJoCo(CPU/GPU 可用)
pip install mujoco mujoco-py

需要提前在系统安装 MuJoCo license 和库文件(~/.mujoco/mujoco210 或 mujoco 3.4)推荐两个版本都用,很方便

备注:这里给出安装显卡驱动和cuda以及cudnn的教程,驱动下载 cuda cudnn ,请自行参考

2.基础知识

你要知道强化学习(RL)是什么,你安装的库都是干什么的,还有强化学习的根本机理,为什么强化学习可以让机器人学习,并部署到仿真和实际(simtosim,simtoreal),如果有时间我建议你读一下我上面的链接,如果没有时间,我建议你去问gpt这些问题,明白了这些东西你才能走下一步,否则很难,

小试牛刀

我建议你去训练出来一个最简单的单摆,观察参数的变化,还有可以尝试不同的算法,来看看哪种算法适合哪种环境,哪种算法可以快速训练出来好的结果

下面给出一些经典案列

月球着陆器

单摆

3.跑开源项目(建议宇树和legged_gym)

https://github.com/leggedrobotics/legged_gym

https://github.com/unitreerobotics/unitree_rl_gym.git

3

4.快速实现以及避一些坑(注:推荐使用mujoco210版本)

有一个大佬写的很好,这里我直接给出链接 深入浅出强化学习,如果在实现的过程中遇到错误,可以回来看看我的一些解决方法

(1)如果安装的isaac gym打开黑屏,直接参考下面

export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json

1

(2)在运行时要指定你的python路径,不然报错非常厉害

先执行:

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

5.往mujoco部署自己的模型

先在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"/> 

5

		<!-- 添加地面 -->
        <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"/>

6也可以写一个scene.xml来加上地面

<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文件拖进去即可,成功显示就是成功

2

如果出现下面错误,就把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

6.借助legged_gym训练

首先克隆全新源码到自己的目录里面!(你之前学习的不推荐用,不知道被改了什么地方)

按下面操作创建自己的任务

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

4

训练的结果在legged_gym/logs即可查看,至此simtosim初步实现。

About

强化学习四足机器人仿真训练教程,目前只实现了sim to sim ,基于legged_gym框架,仅供参考。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors