从 Isaac Gym 到 Isaac Sim / Isaac Lab:HIMLoco 迁移经验
把已有四足机器人强化学习项目迁到新仿真器,首先需要整理控制周期、观测顺序和训练样本的含义。HIMLoco 的这次迁移提供了一个具体案例:在 Blackwell 显卡上,旧环境能够加载训练入口,但执行设备计算时失败;迁移后完成了最小训练、参数更新和机器人视频录制。
本文基于 2026 年 6 月的本地实验与迁移源码整理。已验证规模包括单环境一次迭代、64 个环境两次迭代,以及四环境短视频。论文中的运动性能、完整收敛和真机控制尚未验证。安装步骤和原论文说明见主教程。
1. 先定位版本冲突所在的层
旧项目同时依赖 Python[编程语言]原生绑定、PyTorch[张量计算与深度学习框架]和仿真器二进制组件。单独升级其中一项,可能仍无法执行整个训练流程。
| 本次尝试 | 实验现象 | 对迁移决策的意义 |
|---|---|---|
| Isaac Gym Preview 4、Python[编程语言]3.7、PyTorch[张量计算与深度学习框架]1.10.0+cu113 | 帮助命令可以运行,设备计算报架构不匹配 | 导入成功不能证明训练可用 |
| Python[编程语言]3.8、PyTorch[张量计算与深度学习框架]2.4.1+cu124 | 所安装包的架构列表最高为 sm_90,本机为 sm_120,计算仍失败 |
此次升级组合仍无法满足硬件要求 |
| Isaac Sim 5.1、Isaac Lab、Python[编程语言]3.11、PyTorch[张量计算与深度学习框架]2.7.0+cu128 | 完成最小训练 | 以这一已验证组合开展任务适配 |
表 1 本次实验中的版本组合。 表中记录的是历史实测组合,不表示目前所有可用版本的范围。旧安装包只携带面向 3.6、3.7、3.8 的原生绑定,因此更换解释器还需要处理仿真器本身的兼容性。
环境诊断应同时检查设备识别和真实计算。以下命令在待检查的解释器环境内执行;矩阵运算后的同步可以让异步设备错误及时暴露。
bashpython - <<'PY'
import torch
print(torch.__version__, torch.version.cuda)
print(torch.cuda.get_device_name(0))
print(torch.cuda.get_device_capability(0))
print(torch.cuda.get_arch_list())
x = torch.randn(128, 128, device="cuda")
y = x @ x.T
torch.cuda.synchronize()
print(torch.isfinite(y).all().item())
PY
2. 按资产、任务和算法建立对应关系
原项目将大量环境逻辑集中在 legged_robot.py。迁移版复用 Isaac Lab 的 A1 速度跟踪任务,通过配置调整场景与控制参数,并在外部任务包中保留 HIM[混合内部模型]训练逻辑。
| 迁移层 | 原实现职责 | 本地迁移文件与核对重点 |
|---|---|---|
| 机器人与控制 | 初始姿态、关节目标、驱动器 | a1/rough_env_cfg.py:核对关节名称、顺序、默认姿态和动作缩放 |
| 任务定义 | 地形、速度指令、奖励、重置 | a1/rough_env_cfg.py:映射到场景及各管理器配置 |
| 观测 | 历史本体感知、训练特权信息 | him_one_step_obs、him_critic_obs:核对顺序、坐标系、缩放和历史方向 |
| 算法 | 策略更新与内部状态估计 | rsl_rl_him.py:适配观测分组、存储和辅助损失 |
| 运行入口 | 注册任务、启动训练、保存结果 | scripts/isaaclab_train_himloco.py:选择训练器和录制设置 |
表 2 源码迁移责任表。 表中 a1/ 和 rsl_rl_him.py 位于本地迁移包 source/himloco_isaaclab_tasks/himloco_isaaclab_tasks/。这些是迁移版文件,不是原作者仓库原有入口。
本次映射的物理步长为 0.005 秒,每四个物理步执行一次策略动作,因此策略周期为 0.02 秒,即 50 赫兹。动作缩放为 0.25,关节驱动参数为刚度 40、阻尼 1,单回合时长为 20 秒。迁移其他任务时,要同时核对动作保持时间、奖励是否乘以时间步长、终止判断频率;只复制奖励权重不足以保证训练目标一致。
3. 张量维度之外,还要核对样本含义
图 1 历史观测、内部模型与策略之间的数据流。 当前 45 维观测与估计的三维速度、16 维隐变量共同组成 64 维策略输入。来源:本项目根据 HIMLoco 源码整理;原方法图及出处见主教程。
历史输入为 45 × 6 = 270 维,价值网络输入为 45 + 3 + 3 + 187 = 238 维,动作输出为 12 维。这些维度可以帮助发现接口错误,但无法发现同维度的数据错位。
例如,当前帧放在历史开头还是结尾,会改变策略实际读取的信息。迁移代码中的 _legacy_history 将历史重排为旧算法期望的方向。检查这一操作时,应使用按时间编号的人工序列,同时检查环境重置后历史是否清空;仅检查输出长度无法确认正确性。
观测数值也有明确约定。当前实现对三维命令乘以 [2.0, 2.0, 0.25],对角速度乘以 0.25,对关节速度乘以 0.05,对机体线速度乘以 2.0。关节的排列、速度所在坐标系和地形高度参考点都需要独立核对。归一化后的输入变化会同时影响策略、价值估计与辅助监督。
4. 保留内部模型所需的下一时刻观测
HIM[混合内部模型]使用历史观测学习速度估计和隐状态表示。训练样本因此除了动作、奖励、终止标记,还需要下一时刻的特权观测。迁移版在 HIMRolloutStorage 中增加 next_critic_observations,并使其与同一批历史输入一同参与更新。
这里需要特别检查自动重置:环境结束后返回的观测可能属于新回合。直接把它作为旧回合动作的响应,会形成跨回合监督。当前迁移代码使用环境返回的下一次价值网络观测,尚未完成与旧终止观测处理的严格等价验证。继续训练前,应分别检查正常转移、摔倒终止、时间上限截断的样本,并决定恢复终止观测或屏蔽无效辅助监督。
另一个差异是外力观测:目前保留三个零值槽位以维持 238 维布局。这不意味着外力信息已经迁移完成。完整复现还需要确定外力的参考坐标系、作用时机,以及如何从环境事件记录中获得一致的监督值。
观测噪声也应检查实际配置。开启 enable_corruption 只是允许加入扰动;还要确认各观测项是否配置了具体噪声。本次不能仅凭该开关宣称已经还原原项目的噪声分布。
5. 将验证拆成训练、画面和行为三个检查点
单环境一次迭代用于确认环境创建、采样、反向传播和保存流程;64 个环境两次迭代用于检查批量维度与多个损失分支。两次迭代的曲线只能说明更新过程有记录,不能说明机器人已学会行走。
视频检查需要直接查看首帧、中间帧和末帧。本次最初生成的视频有正确的分辨率和时长,却只有地形。原因是默认视口看向世界原点,机器人位于分配的地形区域。将视口跟随目标设为第一个环境的 robot/trunk 后,画面才出现 A1。
pythonenv_cfg.viewer.origin_type = "asset_body"
env_cfg.viewer.env_index = 0
env_cfg.viewer.asset_name = "robot"
env_cfg.viewer.body_name = "trunk"
env_cfg.viewer.eye = (2.0, -2.0, 1.2)
env_cfg.viewer.lookat = (0.0, 0.0, 0.25)
代码 1 本次 A1 录制机位。 trunk 是该资产的机体名称;换机器人后需要重新查询身体名称。
录制间隔也影响结果。本次使用 --video_interval 1 时,每步重新触发录制,产生许多单帧片段;调整为 --video_length 120 --video_interval 100000 后,得到一段连续短视频。
视频 1 本地四环境、两次迭代的渲染验证。 来源:2026 年 6 月本项目实测,原片约 2.42 秒。机器人可见但姿态不稳定,说明拍摄目标已经正确,尚不能说明控制策略收敛。验证步态还需要固定命令下的持续运动、速度跟踪误差和摔倒统计。
6. 让经验能被继续复现
后续完整实验应保存环境与算法配置、代码版本、随机种子、训练曲线和选用的模型版本。增加训练轮数之前,先核对终止样本、观测噪声、关节排列以及奖励时间尺度;这些差异会改变训练过程,不能靠延长训练自动消除。
源码仓库适合保存配置、脚本和少量教学媒体。新建环境、模型权重、数据集和批量视频应写入独立数据盘;建议通过 DATA_ROOT 环境变量指定数据根目录,并将环境置于其 envs/ 子目录。面向其他机器时只需修改该变量,不要把机器相关的绝对路径写入教程。
当前迁移入口将日志根目录设为相对工作目录的 logs/rsl_rl。要将大规模输出迁出源码仓库,需要先增加可配置输出目录或明确配置外部存储映射;仅设置一个脚本未读取的环境变量不会改变保存位置。
本案例的十个模型文件都只经过一至两次迭代,没有可用于展示稳定步态的收敛权重,整理时已清理这些调试文件,保留配置、曲线和短视频。项目没有独立训练数据集;训练样本由并行仿真在线生成。重做最小验证会重新产生模型文件。
后续通过 Hugging Face 发布模型或数据时,发布清单应包含任务名称、文件来源、许可证、配置、校验值以及下载方法。成功上传并核验后,再按清单清理本地副本。访问令牌通过私有环境提供,不进入教程或版本记录。
参考入口
- HIMLoco 原仓库:原任务与算法源码。
- HIMLoco 官方项目页:方法图和作者演示。
- 本地迁移教程:历史实验的环境、命令与曲线。