第二章、初识Isaac sim及Isaac lab(1)
0 前言
官方网址:https://docs.isaacsim.omniverse.nvidia.com/latest/isaac_lab_tutorials/tutorial_policy_deployment.html#robot-setup
上一章已经安装了isaacsim及isaaclab,并初步运行了isaacsim及isaaclab中的部分demo。本章简单介绍isaacsim如何使用,以及isaaclab机器人学习框架。
注:该章旨在从大方向上了解框架,能做什么,并不对细节做叙述。
1 Isaac sim
我们仅了解Isaac sim的资产及机器人示例
Isaac sim的资产
1、进入Isaac sim的文件夹中,打开终端运行如下代码行:
./isaac-sim.sh
默认界面如下所示:
2、点击下图中红色框线位置可以看到Isaac sim中的资产信息(绿色框),单击资产(需要等待一会儿,请耐心~),右侧会弹出资产的详细信息,点击load as reference
或open file
可以打开资产,前者是连接形式,后者是直接打开文件,此时可以通过file->save as...
将资产保存到本地。
Isaac sim的机器人示例
1、首先需要先把这部分功能显示窗调出来(其他的相关功能也在这里),点击Window->Examples->Robotics Examples
点击后会在下方绿色框
2、按照下述1、2、3、4标号,依次点击就可以加载机器人示例,此处以一个简单示例为主,你可以尝试更多操作
2 Isaac lab
本文只叙述到环境参数文件部分后续内容将在 第二章、初识Isaac sim及Isaac lab(2)中继续
简介:Isaac Lab 是 Isaac Sim 的官方机器人学习框架,提供了API、强化学习、模仿学习等示例。该框架提供了在不同工作流程中设计任务的能力,包括模块化设计,可轻松高效地在模拟功能下创建机器人学习环境。
因此如果我们要用强化学习训练机器人运动,整个流程如下:
- 基于平坦地形的运动策略控制
宇树H1 人型机器人
和波士顿动力学Spot 四足机器人
的demo(实际上是给出一个案例,这个案例表示我们如果有一个训练好的策略那么可以通过isaacsim+isaaclab做相关的演示) - 在Isaac lab中怎么训练及导出策略
- 从Isaac lab读取环境参数文件
- 机器人定义类
- 位置到扭矩的转换
- 如何进行调试
- sim to real
1、基于Isaac sim演示,训练好的运动策略控制宇树H1 人型机器人
和波士顿动力学Spot 四足机器人
运动。
宇树H1 人型机器人:Window->Examples->Robotics Examples
后从下方弹出窗口中Robotics Examples->POLICY->Humanoid->LOAD
注:与上面内容中的Isaac sim的机器人示例操作相同,如遇到问题可以看上面的叙述。
完成上述操作后界面中会出现一个人型机器人,此时你可以通过键盘操作机器人运动,具体按键如下:
- 前进:向上箭头/数字键 8
- 左转:左箭头/数字 4
- 右转:右箭头/数字 6
波士顿动力学Spot 四足机器人:Window->Examples->Robotics Examples
后从下方弹出窗口中Robotics Examples->POLICY->Quadruped->LOAD
完成上述操作后界面中会出现一个四足机器人,此时你可以通过键盘操作机器人运动,具体按键如下:
- 前进:向上箭头/数字键 8
- 后退:后退箭头/数字 2
- 向左移动:左箭头/数字 4
- 向右移动:右箭头/数字 6
- 左转:N / NUM 7
- 右转:M / NUM 9
2、在Isaac lab中怎么训练及导出策略
训练
从 Isaac Lab 训练策略是部署策略的第一步。后续会有 Isaac Lab 教程可以训练现有的demo或自定义策略网络。
上述示例中使用的训练策略是针对 Unitree H1 人形机器人的Isaac-Velocity-Flat-H1-v0和针对波士顿动力 Spot 机器人的Isaac-Velocity-Flat-Spot-v0 。
以宇树的人型机器人为例,进入到你的Isaac lab文件夹下,打开终端,在终端中运行下述代码:
# 进入虚拟环境
conda activate env_isaaclab
# 配置一下ISAACSIM环境
source /{你的路径}/IsaacLab/_isaac_sim/setup_conda_env.sh
# 运行代码
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-H1-v0 --headless
注:现在已经开始训练模型了,你将会在同文件夹中看到一个新的文件夹名为logs
,在logs/rsl_rl/<task_name>/<time>
该地址下可以找到训练好的模型,以及智能体的策略网络,训练方法及环境参数(logs/rsl_rl/<task_name>/<time>/params/
文件夹中)等信息。
导出
可以使用 Isaac Lab 工作区内的/scripts/reinforcement_learning/rsl_rl/play.py
运行训练导出的策略。生成一个ONNX/pt文件。
# 进入虚拟环境
conda activate env_isaaclab
# 配置一下ISAACSIM环境
source /{你的路径}/IsaacLab/_isaac_sim/setup_conda_env.sh
# 运行代码
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Velocity-Flat-H1-v0 --num_envs 32
3、从Isaac lab读取环境参数文件
在前述内容中我们已经了解到参数文件在logs/rsl_rl/<task_name>/<time>/params/
文件夹中,接下来将简单分析该文件加下红色框标记中的文件内容。
(注:在该部分我们需要对)
1、
agent.yaml
2、env.yaml
Simulation Setup (模拟环境的描述)
sim:
physics_prim_path: /physicsScene
# 指定物理场景在isaac sim中物理属性(PhysicsScene)的Prim Path
# Prim Path 在 USD 场景树中的唯一路径标识
# 格式:/根节点/子节点/子子节点
# 以 / 开头表示绝对路径(从场景根目录开始)
# 示例:/World/PhysicsScene/Robot/Arm 表示一个机器人的手臂部件。
dt: 0.005
# 设置物理仿真步长(时间增量):
#1、单位:秒
#2、每 0.005 秒进行一次物理计算
#3、对应 200 Hz 的物理更新频率 (1/0.005 = 200)
render_interval: 4
# 控制渲染帧率与物理更新的比例关系
gravity: !!python/tuple
- 0.0
- 0.0
- -9.81
#设置三维重力加速度向量:
#1、格式:(X, Y, Z) 单位:m/s²
#2、此处 (0, 0, -9.81) 表示标准地球重力(垂直向下)
#3、设置为 (0,0,0) 可模拟无重力环境
enable_scene_query_support: false
# 是否启用场景查询功能
#1、场景查询用于射线检测、碰撞检测等
#2、禁用此功能可提升性能,但会失去物理场景的查询能力
use_fabric: true
# 是否使用fabric物理系统
#1、启用后支持布料、柔性体等软体物理模拟
#2、需要与物理材质(Physics Material)配合使用
disable_contact_processing: true
# 是否禁用接触力处理
#1、禁用后不会计算物体间的接触力
#2、适用于仅需碰撞检测但不需要力反馈的场景
#3、可显著提升性能
use_gpu_pipeline: true
# 是否启用 GPU 加速
device: cuda:0
# 指定物理计算使用的硬件设备:cuda:0 表示使用第 1 块 NVIDIA GPU
Robot Setup(机器人的相关设定)
1、scene:robot:init_state
描述了机器人的初始位置、方向、速度以及默认的关节位置和速度。
init_state:
pos: !!python/tuple
- 0.0
- 0.0
- 1.05
# 设置实体在世界坐标系中的初始位置。
#1、格式:(X, Y, Z),单位:米(m)
#2、[0.0, 0.0, 1.05] 表示实体初始位于 X=0, Y=0, Z=1.05 处(通常为站立高度)
rot: &id003 !!python/tuple
- 1.0
- 0.0
- 0.0
- 0.0
# 设置实体的初始旋转姿态(四元数表示)
#1、格式:(w, x, y, z),单位:无(标准化四元数)
#2、[1.0, 0.0, 0.0, 0.0] 表示 无旋转(默认朝向)
#3、若需调整姿态,可修改为其他四元数(如绕 Z 轴旋转 90°:[0.707, 0.0, 0.0, 0.707])
lin_vel: &id001 !!python/tuple
- 0.0
- 0.0
- 0.0
# 设置初始线速度。
#1、格式:(Vx, Vy, Vz),单位:米/秒(m/s)
#2、[0.0, 0.0, 0.0] 表示初始静止
ang_vel: *id001
# 设置初始角速度。
#1、格式:(ωx, ωy, ωz),单位:弧度/秒(rad/s)
#2、*id001 是 YAML 锚点引用,等价于 [0.0, 0.0, 0.0](对应lin_vel: &id001 的值)
#3、若需初始旋转,可单独设置(如 [0.0, 0.0, 1.0] 表示绕 Z 轴旋转)
joint_pos:
.*_hip_yaw: 0.0 # 髋关节偏航角(左右旋转)
.*_hip_roll: 0.0 # 髋关节横滚角(侧倾)
.*_hip_pitch: -0.28 # 髋关节俯仰角(前后摆动,-0.28弧度≈-16°)
.*_knee: 0.79 # 膝关节角度(0.79弧度≈45°)
.*_ankle: -0.52 # 踝关节角度(-0.52弧度≈-30°)
torso: 0.0 # 躯干关节(无动作)
.*_shoulder_pitch: 0.28 # 肩部俯仰角(0.28弧度≈16°)
.*_shoulder_roll: 0.0 # 肩部横滚角
.*_shoulder_yaw: 0.0 # 肩部偏航角
.*_elbow: 0.52 # 肘关节角度(0.52弧度≈30°)
# 设置关节的初始位置(角度或线性位移)。
#1、.* 是通配符,匹配左右对称关节(如 left_hip_yaw 和 right_hip_yaw)
#2、单位:弧度(rad),正负号表示方向
joint_vel:
.*: 0.0
# 设置所有关节的初始速度。
#1、.*: 0.0 使用通配符将所有关节速度设为 0
#2、单位:弧度/秒(rad/s)或 米/秒(m/s,线性关节)
2、scene:robot:init_state:actuators
描述了机器人关节的特性,例如力度和速度限制、刚度和阻尼。(注:想详细了解该部分内容可以看PID控制)
actuators:
legs:
class_type: omni.isaac.lab.actuators.actuator_pd:ImplicitActuator
joint_names_expr:
- .*_hip_yaw
- .*_hip_roll
- .*_hip_pitch
- .*_knee
- torso
# 通过正则表达式匹配目标关节。
#1、.*_hip_yaw 匹配所有以 _hip_yaw 结尾的关节(如 left_hip_yaw, right_hip_yaw)。
#2、torso 直接匹配名为 "torso" 的关节。
effort_limit: 300
# 关节最大输出力矩/力。
#1、牛·米(Nm,旋转关节)或 牛(N,线性关节)。
velocity_limit: 100.0
# 关节最大允许速度。
#1、弧度/秒(rad/s,旋转关节)或 米/秒(m/s,线性关节)。
stiffness:
.*_hip_yaw: 150.0
.*_hip_roll: 150.0
.*_hip_pitch: 200.0
.*_knee: 200.0
torso: 200.0
damping:
.*_hip_yaw: 5.0
.*_hip_roll: 5.0
.*_hip_pitch: 5.0
.*_knee: 5.0
torso: 5.0
# 定义 PD 控制的比例(刚度)和微分(阻尼)系数。
armature: null
# 电枢惯性补偿(通常指电机转子惯性)。
friction: null
# 关节摩擦系数(静态+动态摩擦)。
Observations Parameters(观测参数)
该配置定义了强化学习策略网络(Policy)输入观测数据的 构建规则,包括特征提取方式、噪声注入策略和数据后处理方法。
observations:
policy:
concatenate_terms: true
# 是否将所有观测项拼接为单一向量。
#1、true:将多个观测项(如 base_lin_vel、关节角度等)合并为一个一维张量,作为策略输入
#2、false:保持观测项为字典结构,需策略网络自行处理多模态输入。
enable_corruption: true
# 是否对观测数据添加噪声或扰动。
#1、true:在训练时注入噪声,提升策略鲁棒性(类似 域随机化)。
#2、false:使用原始观测数据,适合确定性环境验证。
base_lin_vel:
func: omni.isaac.lab.envs.mdp.observations:base_lin_vel
params: {}
# 定义如何获取基础线速度观测值。
#1、func:指定数据提取函数:base_lin_vel 函数通常返回机器人基座在 世界坐标系 中的线速度 (vx, vy, vz)。
#2、params: {}:函数调用时的额外参数(此处为空表示使用默认参数)。
noise:
func: omni.isaac.lab.utils.noise.noise_model:uniform_noise
operation: add
n_min: -0.1
n_max: 0.1
# 为观测值添加均匀分布噪声。
#1、func:噪声生成函数,此处为均匀分布噪声。
#2、operation:噪声施加方式:
# add:加法噪声 obsnoisy=obs+noiseobsnoisy=obs+noise
# multiply:乘法噪声 obsnoisy=obs×(1+noise)obsnoisy=obs×(1+noise)
#3、n_min 与 n_max:均匀分布的上下界,此处为 ±0.1 m/s。
clip: null
# 限制观测值的取值范围。
#1、clip: [-5.0, 5.0]:将观测值裁剪到 [-5, 5] 区间。
#2、null:不进行裁剪。
scale: null
# 对观测值进行缩放。
#1、scale: 0.1:将观测值乘以 0.1(缩小 10 倍)。
#2、null:保持原始数值范围。
Actions Parameters(动作参数)
该部分代码定义了一个关节位置动作(JointPositionAction),用于控制机器人(robot)的关节运动。
actions:
joint_pos:
class_type: omni.isaac.lab.envs.mdp.actions.joint_actions:JointPositionAction
# 指定了动作的类型为 JointPositionAction,这是一个用于控制关节位置的动作类。
# 它来自 omni.isaac.lab.envs.mdp.actions.joint_actions 模块。
asset_name: robot
# 指定了该动作应用于名为 robot 的资产(即机器人)。这意味着该动作将控制 robot 的关节。
debug_vis: false
# 设置是否启用调试可视化。false 表示不启用调试可视化功能。如果设置为 true,可能会在仿真中显示关节运动的可视化信息,用于调试。
joint_names:
- .*
# 指定了要控制的关节名称列表。这里使用正则表达式 .* 表示匹配所有关节。这意味着该动作将控制 robot 的所有关节。
scale: 0.5
# 设置动作的缩放因子。0.5 表示动作的输出值会被缩放为原来的 50%。例如,如果动作的输出值为 1.0,经过缩放后实际应用的值为 0.5。
offset: 0.0
# 设置动作的偏移量。0.0 表示没有额外的偏移量。如果设置为其他值,动作的输出值会加上该偏移量。
use_default_offset: true
# 设置是否使用默认的关节偏移量。true 表示使用默认的关节偏移量。默认偏移量通常是关节的初始位置或中性位置。
# 如果设置为 false,则忽略默认偏移量,仅使用 offset 参数指定的值。
Commands Parameters(命令参数)
该配置定义了机器人 基座速度命令 的生成方式,包括线速度、角速度及朝向控制参数。这些命令通常用于强化学习任务中的 目标设定 或 运动控制。
commands:
base_velocity:
class_type: omni.isaac.lab.envs.mdp.commands.velocity_command:UniformVelocityCommand
# 指定速度命令生成器的类型为UniformVelocityCommand。
#1、UniformVelocityCommand:从均匀分布中随机生成速度命令。
#2、适用于训练机器人适应不同速度需求的任务(如导航、避障)。
#3、其他类型:FixedVelocityCommand(固定速度)、WaypointCommand(路径点跟踪)。
resampling_time_range: !!python/tuple
- 10.0
- 10.0
# 定义速度命令的 重采样时间间隔。
#1、格式:(min_time, max_time),单位:秒(s)。
#2、[10.0, 10.0] 表示每 10 秒 重新生成一次速度命令。
#3、若需动态调整,可设为范围(如 [5.0, 15.0])。
debug_vis: true
# 是否启用命令的 可视化调试。
#1、true:在仿真环境中显示目标速度向量或朝向箭头。
asset_name: robot
# 指定速度命令应用的机器人对象。
heading_command: true
# 是否启用朝向控制。
#1、true:生成目标朝向角(yaw),机器人需调整姿态以匹配。
#2、false:仅控制线速度和角速度。
heading_control_stiffness: 0.5
# 朝向控制的刚度系数。
#1、值越大,机器人朝向调整越快
rel_standing_envs: 0.02
# 设置静止状态 的环境比例。
#1、0.02 表示 2% 的环境生成零速度命令(机器人保持静止)。
#2、用于训练机器人从静止状态启动的能力。
rel_heading_envs: 1.0
# 设置 启用朝向控制 的环境比例。
#1、1.0 表示所有环境均启用朝向控制。
#2、若设为 0.5,则 50% 的环境仅控制速度,不调整朝向。
ranges:
lin_vel_x: !!python/tuple # X 轴线速度范围
- 0.0
- 1.0
lin_vel_y: *id006 # Y 轴线速度范围(引用其他值)
ang_vel_z: !!python/tuple # Z 轴角速度范围
- -1.0
- 1.0
heading: !!python/tuple # 目标朝向角范围
- -3.141592653589793
- 3.141592653589793
# 定义速度命令的随机生成范围。
#1、lin_vel_x:X 轴线速度(前进/后退),单位:m/s。
#2、lin_vel_y:Y 轴线速度(侧向移动),单位:m/s。
#3、ang_vel_z:Z 轴角速度(旋转),单位:rad/s。
#4、heading:目标朝向角(yaw),单位:rad,范围 [-π, π]。