当前位置: 首页 > news >正文

【具身相关】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 中的机器人控制策略。

工作流程:

  1. 使用 Isaac Gym 创建仿真环境。
  2. 使用 Legged Gym 配置四足机器人的任务和环境。
  3. 使用 rsl_rl训练强化学习策略。
  4. 将训练好的策略部署到实际机器人上。

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 + cctrl + 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 训练代码详解

http://www.mrgr.cn/news/94279.html

相关文章:

  • Python规则引擎DIY:从零开始构建规则引擎
  • [Ai 力扣题单] 数组基本操作篇 27/704/344
  • [C语言笔记]07、数组
  • 数据结构--【栈与队列】笔记
  • 【自学笔记】MoonBit语言基础知识点总览-持续更新
  • WPF 与 GMap.NET 结合实现雷达目标动态显示与地图绘制
  • Android SharedPreference 详解
  • UVC摄像头命令推流,推到rv1126里面去
  • 各种attention mode有什么区别?
  • 边缘 AI 探索:EdgeOne 借力 DeepSeek R1 加速落地
  • AI 大模型统一集成|让 AI 聊天更丝滑:WebSocket 实现流式对话!
  • 变量赋值汇编
  • 二分查找易错点分析报告
  • 图论·拓扑排序
  • 多数元素——面试经典150题(力扣)
  • Leetcode 刷题笔记1 动态规划part08
  • 【原创】springboot+vue智能办公管理系统设计与实现
  • 学习springboot-Bean管理(Bean 注册,Bean 扫描)
  • ESP-IDF ubuntu版本 V5.2
  • react实现一个列表的拖拽排序(react实现拖拽)