【具身相关】legged_gym, isaacgym、rsl_rl关系梳理及相关笔记
【具身相关】legged_gym, isaacgym、rsl_rl关系梳理及相关笔记
- 总体关系
- IsaacGym
- legged_gym
- rsl_rl
- 三者的关系
- legged_gym代码库介绍
- 环境模块env
- 地形设置
- 创建环境
- 和训练相关的几个函数
- 算法模块
- 相关笔记
- headless
- play.py渲染视频
- 训练指定GPU
- BarrierTrack_kwargs
- decimation 参数
- num_actions
- env_spacing
- self_collisions
- sim
- 参考文献
总体关系
IsaacGym
- Isaac Gym 是 NVIDIA 开发的一个高性能物理仿真平台,专门用于强化学习和机器人控制任务。它基于 NVIDIA 的 PhysX 物理引擎,并利用 GPU 加速仿真,能够同时运行数千个仿真环境。
- 主要特点:
GPU 加速:利用 GPU 并行计算能力,支持大规模并行仿真。
高性能:能够同时运行数千个仿真环境,适合强化学习训练。
灵活的 API:提供 Python API,方便与深度学习框架(如 PyTorch)集成。
支持多种机器人:包括四足机器人、机械臂、无人机等。
视觉和物理仿真:支持视觉传感器(如 RGB 相机、深度相机)和物理传感器(如 IMU、力传感器)。
legged_gym
- Legged Gym 是一个基于 Isaac Gym 的四足机器人强化学习框架,由 ETH Zurich 的 Robotic Systems Lab 开发。它专注于训练四足机器人(如 ANYmal、Spot)的运动控制策略。
- 主要特点:
基于 Isaac Gym:利用 Isaac Gym 的高性能仿真能力。
模块化设计:环境、策略、奖励函数等模块高度可配置。
支持多种机器人:包括 ANYmal、Spot 等四足机器人。
强化学习集成:与 rsl_rl 强化学习库无缝集成。
rsl_rl
- rsl_rl 是 ETH Zurich 的 Robotic Systems Lab 开发的一个轻量级强化学习库,专门用于机器人控制任务。它基于 PyTorch 实现,支持多种强化学习算法(如 PPO、SAC)。
- 主要特点:
轻量级:代码简洁,易于扩展和修改。
基于 PyTorch:与 PyTorch 生态系统无缝集成。
支持多种算法:包括 PPO、SAC 等常用强化学习算法。
高效训练:针对机器人控制任务进行了优化。
三者的关系
- Isaac Gym 提供高性能的物理仿真环境。
- Legged Gym 基于 Isaac Gym,专注于四足机器人的强化学习任务。
- rsl_rl 提供强化学习算法的实现,用于训练 Legged Gym 中的机器人控制策略。
工作流程:
- 使用 Isaac Gym 创建仿真环境。
- 使用 Legged Gym 配置四足机器人的任务和环境。
- 使用 rsl_rl训练强化学习策略。
- 将训练好的策略部署到实际机器人上。
legged_gym代码库介绍
- 项目地址:legged_gym代码库
环境模块env
-
环境模块定义了四足机器人的仿真环境和任务,它是 legged_gym 的核心部分,负责与 Isaac Gym 的交互
-
这里将机器人看做是环境,env下每一个文件夹对应一种机器人
-
base/:包含基础环境类和机器人类的实现。
-
legged_robot.py:定义了四足机器人的基类,包括机器人初始化、状态更新、奖励计算等功能。
-
legged_robot.py中的
_init_buffers
会定义许多变量,如果二次开发就在这个函数中加
-
legged_robot_config.py:机器人配置类,用于定义机器人的物理参数、控制参数等
-
每个环境由一个环境文件
xx.py
和一个配置文件xx_config.py
定义 -
base_task中定义了许多变量 比如观测、奖励、回合长度的buffer
地形设置
- 地形设置在xx_config.py中以
mesh_type
指定
mesh_type = 'trimesh' # "heightfield" # none, plane, heightfield or trimesh
none:不使用任何地形网格,地形是完全平坦的。
plane:使用一个平坦的平面作为地形。
heightfield:使用二维高度场来表示地形,类似于栅格的形式,每个点的高度值定义了地形的形状。
trimesh:使用三角形网格来表示地形,可以更精确地定义复杂的地形形状。一般做有地形的训练 比如楼梯、上下坡都设置为trimesh
创建环境
在 LeggedGym 中,
_process_rigid_shape_props、_process_dof_props 和 _process_rigid_body_props
是三个重要的函数,它们在机器人仿真环境的创建和配置过程中起着关键作用。以下是对这些函数的详细介绍:
_process_rigid_shape_props
该函数在 _create_envs 函数中调用,用于处理刚体形状的属性。它接受两个参数:rigid_shape_props_asset(从 URDF 文件中加载的刚体形状属性)和 env_id(环境 ID)。函数的主要功能是根据需要修改刚体形状的属性,例如摩擦系数、恢复系数等,以适应特定的仿真需求。
_process_dof_props
该函数在 _create_envs 函数中调用,用于处理自由度(DOF)的属性。它接受两个参数:dof_props_asset(从 URDF 文件中加载的自由度属性)和 env_id(环境 ID)。函数的主要功能包括:
储存关节属性:将关节的位置、速度、扭矩等限制存储到张量中,便于后续使用。
修改关节限制:根据配置文件中的参数(如 soft_dof_pos_limit),对关节的位置限制进行调整,以确保关节运动的安全性和合理性。
返回修改后的属性:对输入的自由度属性进行修改后,返回这些属性,以便在仿真环境中应用。
_process_rigid_body_props
该函数在 _create_envs 函数中调用,用于处理刚体的属性。它接受两个参数:body_props(从 URDF 文件中加载的刚体属性)和 env_id(环境 ID)。函数的主要功能是根据需要修改刚体的属性,例如质量、惯性张量等,以适应特定的仿真需求。
- 创建环境由
_create_envs 函数
完成,用于创建多个仿真环境,每个环境中包含一个机器人实例
函数功能
1.加载机器人模型:从 URDF 文件中加载机器人的模型,并根据配置文件中的参数设置模型的属性。
2.创建多个环境:根据配置文件中的参数创建多个仿真环境,每个环境中包含一个机器人实例。
3.处理刚体属性:对机器人的刚体形状属性、自由度属性和刚体属性进行处理和修改,以适应特定的仿真需求。
4.设置机器人初始状态:为每个机器人设置初始位置、姿态、速度等。
5.存储机器人身体部位的索引:存储机器人身体不同部位的索引,便于后续的访问和操作。
函数步骤
1.加载机器人模型:
从配置文件中获取机器人模型的路径。
设置加载模型的选项,如固定关节、替换圆柱体为胶囊体等。
加载机器人模型,并获取模型的刚体名称、自由度名称等信息。
2.处理模型属性:
获取机器人模型的刚体形状属性、自由度属性和刚体属性。
根据需要对这些属性进行处理和修改,例如调整摩擦系数、关节限制等。
3.创建仿真环境:
根据配置文件中的参数创建多个仿真环境。
在每个环境中,创建机器人实例,并设置其初始位置和姿态。
对机器人模型的属性进行设置,并将机器人添加到环境中。
4.存储索引:
存储机器人身体不同部位的索引,例如脚部、需要惩罚接触的部位等。
- 根据num_envs,创建多个环境
- 这里的env是指一个智能体(机器人),把这个叫做环境
和训练相关的几个函数
_push_robots、_update_terrain_curriculum、update_command_curriculum 和 check_termination
在 LeggedGym 中,_push_robots、_update_terrain_curriculum、update_command_curriculum 和 check_termination 是四个重要的函数,它们在仿真环境的控制和训练过程中起着关键作用。以下是对这些函数的详细介绍:
_push_robots
这个方法通过给机器人一个随机的基础速度来模拟冲击,用于域随机化训练,增强机器人在不同情况下的鲁棒性。
_update_terrain_curriculum
实现了一种基于游戏的课程学习方法,根据机器人在环境中的行走距离来调整它们所处的地形难度,以此来逐步提高机器人在复杂地形上的表现。
update_command_curriculum
根据机器人追踪速度的表现来调整指令的范围,是另一种课程学习策略,旨在逐步提高机器人对更复杂指令的响应能力。
check_termination
该部分代码判断当前时间步是否超过了预设的最大时间步 self.max_episode_length。如果超过,则该环境的仿真步数达到上限,需要终止。它综合了接触力、姿态、高度和超时等条件,任何一个条件触发,都会导致该环境的重置。 避免2real时做出危险的行为,重置后会给一个惩罚
这些函数在 LeggedGym 的环境创建和训练过程中扮演着重要角色。它们通过对机器人模型的刚体形状、自由度和刚体属性进行处理和修改,确保了仿真环境的准确性和灵活性。用户可以根据具体的仿真需求,通过这些函数对机器人模型进行定制化调整。
step、pre_physics_step、_compute_torques 和 compute_observations
在 LeggedGym 中,step、pre_physics_step、_compute_torques 和 compute_observations 是四个关键的函数,它们在仿真环境的控制和训练过程中起着核心作用。以下是对这些函数的详细介绍:
step
这个方法是环境的主要接口,用于接收智能体的动作并推进仿真一步。它执行以下操作:
调用 pre_physics_step 方法,该方法处理动作并将其转换为物理仿真可以使用的格式。
更新仿真环境,应用动作并计算新的状态。
调用 compute_observations 方法,该方法计算新的观测值。
调用 compute_reward 方法,该方法计算奖励值。
检查是否需要终止当前仿真步。
pre_physics_step
这个方法在物理仿真步之前被调用,用于处理智能体的动作并将其转换为物理仿真可以使用的格式。它执行以下操作:
根据动作计算关节扭矩,这通常涉及到调用 _compute_torques 方法。
将计算出的扭矩应用到机器人的关节上。
_compute_torques
这个方法根据智能体的动作计算关节扭矩。它执行以下操作:
根据动作和当前状态计算每个关节的目标位置或速度。
根据控制策略(如位置控制、速度控制或扭矩控制)计算实现这些目标所需的扭矩。
返回计算出的扭矩,这些扭矩将被应用到机器人的关节上。
compute_observations
这个方法计算当前环境状态的观测值,这些观测值将被提供给智能体作为输入。它执行以下操作:
从环境中提取相关状态信息,如机器人关节的位置、速度、角速度等。
根据配置文件中的参数选择和处理这些状态信息,形成观测向量。
返回观测向量,这些观测值将被用于训练或测试智能体。
算法模块
- PPO的相关设置也在xx_config中定义
- 定义新环境时,需要在__init__函数中注册,传入类、配置、PPO的类
相关笔记
headless
- headless参数允许用户在没有图形界面的情况下运行仿真,从而节省计算资源并提高效率,headless (bool): Run without rendering if True,true表示启动无渲染模式
- 运行直接传入 --headless 即可以在无渲染模式下进行训练,eg.
python legged_gym/scripts/train.py --headless --task go2
play.py渲染视频
- 已训练好的策略,加载该策略并输出视频,添加
--record
参数来启用视频录制:
python legged_gym/scripts/play.py --task go2 --load_run 包含config.json和策略的文件夹路径 --record
- ps:play是不会停止的,需要手动用键盘停止,可使用
ctrl + c
或ctrl + z
- 保存视频的逻辑写在finally块中,当手动停止后才会保存视频
训练指定GPU
- 使用
--sim_device
:指定用于物理模拟的设备,通常设置为cuda:0
使用第一块 GPU - 使用
--rl_device
:指定用于 RL 算法的设备,同样可以设置为cuda:0
或其他 GPU ID python legged_gym/scripts/train.py --headless --task go2_field --sim_device cuda:1 --rl_device cuda:2
- 或者可以通过
CUDA_VISIBLE_DEVICES=0,1,2
来限制程序能看到的GPU设备 graphics_device_id
是一个参数,用于指定用于图形渲染的设备序号。这个参数在创建模拟环境时使用,默认是0
BarrierTrack_kwargs
- 在 IsaacGym 或 LeggedGym 中,
BarrierTrack_kwargs
是一个参数字典,用于配置障碍赛道(Barrier Track)的相关设置 - BarrierTrack_kwargs 是一个字典,包含多个键值对,每个键值对代表一个配置选项。以下是一些常见的配置选项:
options:指定障碍赛道中可能出现的障碍类型,例如 “jump”、“leap”、“down” 等。
leap:指定特定障碍(如跳跃障碍)的详细参数,例如 “fake_offset” 等。
draw_virtual_terrain:布尔值,指定是否绘制虚拟地形。
decimation 参数
- 在 LeggedGym 中,
decimation
参数通常用于控制仿真步长的采样率。它决定了仿真环境中每多少个时间步(time steps)进行一次状态更新或奖励计算。这个参数在仿真和训练过程中起着重要的作用,因为它可以影响到仿真精度和计算效率 - 表示每多少个时间步进行一次状态更新或奖励计算
- 仿真精度:较小的 decimation 值意味着更频繁的状态更新,仿真精度更高,但计算量也更大。
计算效率:较大的 decimation 值可以减少计算量,提高训练速度,但可能会降低仿真精度。
num_actions
- List item
env_spacing
- 初始化机器人时,各机器人之间的间隔距离
self_collisions
- 在 LeggedGym 中,self_collisions 参数用于控制机器人是否启用自碰撞检测。这个参数通常在配置文件中设置,用于决定机器人在仿真过程中是否考虑自身不同部件之间的碰撞。
- self_collisions = 0 # 1 to disable, 0 to enable…bitwise filter
- self_collisions:一个整数,用于启用或禁用自碰撞检测。
0:启用自碰撞检测,机器人会检测并处理自身不同部件之间的碰撞。这意味着机器人在运动过程中不能穿过自身。
1:禁用自碰撞检测,机器人不会检测自身不同部件之间的碰撞。这意味着机器人在运动过程中可以穿过自身。
sim
- dt = 0.005 仿真频率,表示0.005秒执行一次仿真
- **dt × decimation就是一个step的时间 **
在 LeggedGym 中,sim 类的参数用于配置仿真的基本设置。以下是这些参数的详细介绍:
dt
含义:仿真时间步长,单位为秒(s)。它决定了仿真中每个时间步的时间间隔。
作用:较小的 dt 值可以提高仿真精度,但会增加计算量;较大的 dt 值可以提高仿真速度,但可能会降低精度。
示例:dt = 0.005 表示每个时间步的时间间隔为 0.005 秒。
substeps
含义:每个仿真时间步内进行的物理仿真子步数。
作用:增加 substeps 可以在不改变时间步长的情况下提高仿真精度,但会增加计算量。
示例:substeps = 1 表示每个时间步内只进行一次物理仿真。
gravity
含义:重力加速度,单位为米每二次方秒(m/s²)。它是一个三维向量,表示重力在三个坐标轴上的分量。
作用:定义了仿真环境中重力的方向和大小。
示例:gravity = [0., 0., -9.81] 表示重力加速度为 9.81 m/s²,方向沿 z 轴负方向。
up_axis
含义:定义了坐标系中哪个轴是向上的。0 表示 y 轴向上,1 表示 z 轴向上。
作用:决定了机器人在仿真环境中的朝向和重力方向。
示例:up_axis = 1 表示 z 轴是向上的。
no_camera
含义:布尔值,表示是否禁用相机渲染。
作用:禁用相机渲染可以提高仿真速度,特别是在不需要可视化的情况下。
示例:no_camera = True 表示禁用相机渲染。
参考文献
- 强化学习框架-Legged Gym 训练代码详解