准备训练

将urdf重定向legged_gym/resources/robots/pyGo2/urdf

在urdf_studio点击导出

点击URDF,然后点击导出ZIP

然后找到这个目录

/home/lpa/RF/issacsim/legged_gym/resources/robots

把zip解压到robots文件夹中

理论上urdf的路径是

file = '{LEGGED_GYM_ROOT_DIR}/resources/robots/go2_description_urdf/go2_description/go2_description.urdf'

在envs中自定义配置文件

在这个目录下找到a1的配置文件,复制整个文件夹,重命名为Go2

/home/lpa/RF/issacsim/legged_gym/legged_gym/envs

将a1的配置文件改为Go2_config

用vscode打开。

类名重定义

将A1RoughCfg改为Go2Cfg

PPO类也要对应修改

添加环境类

然后添加环境类,和我们用SB3很类似,定义观察空间、动作空间等

需要再次强调:在Go2的URDF定义中我们讲解过,Go2拥有24个关节,但是24 是 URDF 物理模型中为了计算碰撞、惯性等产生的所有运动副(包含了一些虚拟关节或被动连接)。在强化学习中,我们只控制电机,不需要去控制那些物理连接点。因此真正需要控制的电机个数就是12.

  • num_envs = 4096: 并行环境的数量,这里设置为 4096 个,用于加速训练。
  • num_actions = 12: 动作空间的维度,有 12 个可控制的自由度
  • num_observations = 48: 观测空间的维度,表示环境向智能体提供的状态信息有 48 个数值。
  • num_privileged_obs = None: 特权观测(privileged observations)的维度。
class Go2Cfg( LeggedRobotCfg ):

    class env(LeggedRobotCfg.env):
        num_envs = 4096
        num_actions = 12
        num_observations = 48

        # 如果你没有 privileged obs 就保持 None
        #num_privileged_obs = 36
        num_privileged_obs = None
添加摄像机观察类

然后再添加一个摄像机观察类,就是初始相机的位置,用过mujoco的肯定很熟悉

class viewer(LeggedRobotCfg.viewer):
    ref_env = 0
    pos = [1.0, 1.0, 0.3]
修改初始化类

接下来要修改初始化类,也就是决定机器人的初始位姿。

只修改初始位置即可,0.4米有点高了

pos = [0.0, 0.0, 0.15] # x,y,z [m]

设置地形

  • mesh_type = "plane"

    • 将地形设置为平坦地面
    • 这是最基础的设置,通常用于调试机器人是否能站稳或行走。
    • 如果要训练机器人适应复杂地形(如楼梯、斜坡、崎岖地面),通常会将其改为 "trimesh"
  • measure_heights = False

    • 关闭高度测量功能。
    class terrain(LeggedRobotCfg.terrain):
        mesh_type = "plane"
        measure_heights = False
修改urdf引用路径
file = '{LEGGED_GYM_ROOT_DIR}/resources/robots/go2_description_urdf/go2_description/go2_description.urdf'

记得把name="a1"改为Go2

修改日志名称

我们之后可以通过tensorboard查看训练的过程,这个experiment_name就是日志的名字,我们暂且叫咕咕嘎嘎。

experiment_name = 'gugugaga'

完整代码

from legged_gym.envs.base.legged_robot_config import LeggedRobotCfg, LeggedRobotCfgPPO

class Go2Cfg( LeggedRobotCfg ):

    class env(LeggedRobotCfg.env):
        num_envs = 4096
        num_actions = 12
        num_observations = 48

        # 如果你没有 privileged obs 就保持 None
        #num_privileged_obs = 36
        num_privileged_obs = None
    
    class viewer(LeggedRobotCfg.viewer):
        ref_env = 0
        pos = [1.0, 1.0, 0.3]

    class init_state( LeggedRobotCfg.init_state ):
        pos = [0.0, 0.0, 0.15] # x,y,z [m]
        default_joint_angles = { # = target angles [rad] when action = 0.0
            'FL_hip_joint': 0.1,   # [rad]
            'RL_hip_joint': 0.1,   # [rad]
            'FR_hip_joint': -0.1 ,  # [rad]
            'RR_hip_joint': -0.1,   # [rad]

            'FL_thigh_joint': 0.8,     # [rad]
            'RL_thigh_joint': 1.,   # [rad]
            'FR_thigh_joint': 0.8,     # [rad]
            'RR_thigh_joint': 1.,   # [rad]

            'FL_calf_joint': -1.5,   # [rad]
            'RL_calf_joint': -1.5,    # [rad]
            'FR_calf_joint': -1.5,  # [rad]
            'RR_calf_joint': -1.5,    # [rad]
        }

    class control( LeggedRobotCfg.control ):
        # PD Drive parameters:
        control_type = 'P'
        stiffness = {'joint': 20.}  # [N*m/rad]
        damping = {'joint': 0.5}     # [N*m*s/rad]
        # action scale: target angle = actionScale * action + defaultAngle
        action_scale = 0.25
        # decimation: Number of control action updates @ sim DT per policy DT
        decimation = 4

    class terrain(LeggedRobotCfg.terrain):
        mesh_type = "plane"
        measure_heights = False

    class asset( LeggedRobotCfg.asset ):
        file = '{LEGGED_GYM_ROOT_DIR}/resources/robots/go2_description_urdf/go2_description/go2_description.urdf'
        name = "Go2"
        foot_name = "foot"
        penalize_contacts_on = ["thigh", "calf"]
        terminate_after_contacts_on = ["base"]
        self_collisions = 1 # 1 to disable, 0 to enable...bitwise filter
  
    class rewards( LeggedRobotCfg.rewards ):
        soft_dof_pos_limit = 0.9
        base_height_target = 0.25
        class scales( LeggedRobotCfg.rewards.scales ):
            torques = -0.0002
            dof_pos_limits = -10.0

class Go2CfgPPO( LeggedRobotCfgPPO ):
    class algorithm( LeggedRobotCfgPPO.algorithm ):
        entropy_coef = 0.01
    class runner( LeggedRobotCfgPPO.runner ):
        run_name = ''
        experiment_name = 'gugugaga'

  

在envs中自定义环境

直接pass 

from legged_gym.envs.base.legged_robot import LeggedRobot
# 注意:其实 cfg 通常是在 registry 里加载的,这里不一定要 import,除非你在类内部硬编码要用
# from legged_gym.envs.Go2.Go2_config import Go2Cfg 

class Go2(LeggedRobot):
    """
    Go2 机器人环境类
    继承自 LeggedRobot,使用默认实现。
    如果有特殊的奖励函数或逻辑,可以在这里添加。
    """
    # 如果不需要额外的初始化逻辑,直接 pass 即可
    pass 

在envs的__init__.py脚本注册训练代码

找到并用vscode打开__init__.py

添加task_redistry注册训练任务

from legged_gym.envs.Go2.Go2_env import Go2
from legged_gym.envs.Go2.Go2_config import Go2Cfg, Go2CfgPPO

task_registry.register("Go2", Go2, Go2Cfg(), Go2CfgPPO())

然后装一下tensorboard,在此前课程已经讲过了

pip install tensorboard

小报错处理——numpy导致的float别名问题

这是一个非常经典的 NumPy 版本兼容性问题。你遇到的报错是因为 Isaac Gym 的 torch_utils.py 文件使用了旧版的 NumPy 语法,而你的 Conda 环境中安装的是新版 NumPy(1.20 或更高版本)。

🛠️ 问题原因

在 NumPy 1.20 版本之前,np.float 是 float 的一个别名。但从 NumPy 1.20 开始,这个别名被正式移除了。

  • 报错代码行dtype=np.float
  • 原因:Python 找不到 np.float 这个属性。
✅ 解决方案

你需要修改 Isaac Gym 源码中的一个文件,将 np.float 替换为 Python 内置的 float

打开

code /home/lpa/RF/issacsim/IsaacGym_Preview_4_Package/isaacgym/python/isaacgym/torch_utils.py

替换为float

小报错处理——distutiles版本弃用

这又是一个经典的 Python 版本兼容性问题!你遇到的 AttributeError: module 'distutils' has no attribute 'version' 报错,是因为你当前的 Python 版本较新,已经弃用了 distutils 模块,但 PyTorch 的旧版代码中还在使用它。

code进来编写

code /home/lpa/miniconda3/envs/issacsim/lib/python3.8/site-packages/torch/utils/tensorboard/__init__.py

完全替换为下文

import tensorboard
# 1. 彻底注释掉旧的 distutils 导入
# from setuptools import distutils
# LooseVersion = distutils.version.LooseVersion

# 2. 使用新的导入方式
from packaging.version import Version as LooseVersion

# 3. 版本检查逻辑(保持不变)
if not hasattr(tensorboard, '__version__') or LooseVersion(tensorboard.__version__) < LooseVersion('1.15'):
    raise ImportError('TensorBoard logging requires TensorBoard version 1.15 or above')

# 4. 【关键修改】删除或注释掉下面这两行 del 语句!
# 因为 'distutils' 没有被导入,所以不能删除它。
# 而且 'LooseVersion' 后面还要用,也不能在这里删掉。
# del distutils
# del LooseVersion
# del tensorboard

# 5. 继续后面的导入
from .writer import FileWriter, SummaryWriter  # noqa: F401
from tensorboard.summary.writer.record_writer import RecordWriter  # noqa: F401

开始训练

这个CUDA要根据自己的显卡配,如果不确定,就直接用后面这段,不加cuda配置。

TORCH_CUDA_ARCH_LIST="8.9" python legged_gym/scripts/train.py --task=Go2

小报错处理——CUDA冲突问题

如果你的显卡和issacsim的版本有冲突,就会报下面的错:

如果报错了,那很遗憾,要重装torch,这个版本问题很多。

请在终端执行以下命令:

卸载

pip uninstall torch torchvision torchaudio -y

重装新版本

pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117

在tensorboard查看训练过程

我们之前experiment_name取名为gugugaga,因此新开一个终端,输入

tensorboard --logdir=logs/gugugaga --port=6006

出现这个网站后打开就能看到了,具体参数含义就不在此讲解了。

Logo

更多推荐