
AMP工程迁移手册:基于TienKung-Lab的 Roban 机器人AMP任务实现
AMP 工程迁移手册:基于 TienkungLab 的 Roban 机器人 AMP 任务实现
本项目基于天工开源工程 TienKung-Lab,面向 Roban 机器人设计了一套从训练到部署的对抗运动先验(AMP)步态控制框架,并完成了系统研究与工程实现。工程已开源,见开源仓库,详细直接的操作流程请参考工程内的README.md,本文主要讲述迁移工作的实现与关键奖励函数的介绍。
🔗 项目开源地址:ROBAN_AMP_based_TienKung-Lab
💡 详细的直接操作流程请参考工程内的README.md,本文将重点解析迁移工作的底层实现逻辑与关键奖励函数的设计。
一、 快速启动:训练与推理流程
1. 模型训练
在本仓库根目录下执行(路径请按你的实际克隆位置修改):
cd ROBAN_AMP_based_TienKung-Lab
python legged_lab/scripts/train.py --task roban_walk --headless --num_envs 4096 --logger tensorboard
2. 推理与导出
训练完成后,使用以下命令加载模型并进行验证:
python legged_lab/scripts/play.py --task roban_walk --num_envs 1 --load_run <run_name> --checkpoint <ckpt>
二、 TienKungLab 迁移链路详解
整条迁移链路可以拆解为六个连续的标准化阶段:建立目录骨架 ➡️ 完成资产接入 ➡️ 统一关节顺序 ➡️ 网络维度闭环 ➡️ 域随机化 ➡️ 奖励体系搭建。采用这种模块化的组织方式,能够确保每一步都有明确产出,在遇到问题时也能更精准地定位。
最终工程需要交付的基础框架包含四块:
- 一个可启动的新任务:
<robot_name>_walk - 一个目标机器人专用环境:
XxxEnv - 一套任务与算法配置:
XxxWalkFlatEnvCfg+XxxWalkAgentCfg - 一套已验证过维度的输入定义:
Actor_single、Critic_single、AMP_single
1. 步骤梗概
整条迁移链路可以理解为六个连续阶段:先建立目录骨架,再完成接入操作,然后统一关节顺序,接着做网络输入维度闭环,最后进入域随机化和奖励函数体系的搭建与设计。这样组织的好处是每一步都有明确产出,出问题时也更容易定位。
2. 建立目录骨架
目录骨架的作用是先定义我们的后续任务,资产相关内容集中在 legged_lab/assets/<robot_name>/,环境与任务相关内容集中在 legged_lab/envs/<robot_name>/,这样后续查问题时可以快速定位到对应模块。
其中,assets 目录至少要有 __init__.py、<robot_name>.py、urdf/、usd/,envs 目录至少要有 __init__.py、<robot_name>_envs.py、walk_cfg.py,任务注册本身不在子目录内完成,而是在 legged_lab/envs/__init__.py 统一添加入口。目录示意可以先按下面这个框架搭出来:
legged_lab/
├── assets/
│ └── <robot_name>/
│ ├── __init__.py
│ ├── <robot_name>.py # 资产定义
│ ├── urdf/
│ └── usd/
└── envs/
├── __init__.py # 任务注册入口
└── <robot_name>/
├── __init__.py
├── <robot_name>_envs.py # 环境逻辑
└── walk_cfg.py # 任务配置
💡 工程参考指引:
- 资产定义看
legged_lab/assets/roban_s2/roban_s2.py- 环境逻辑看
legged_lab/envs/roban/roban_envs.py- 任务注册看
legged_lab/envs/__init__.py
3. 适配操作指南
3.1 接入机器人资产
接入机器人资产的核心目标,是交付一个能被场景直接引用的 <ROBOT>_CFG,这是机器人在仿真中的定义,后面所有观测、动作、AMP 逻辑都要通过它获得关节和刚体语义。
具体落地时,先把 URDF 和 USD 放到 urdf/ 与 usd/ 目录下,再在 <robot_name>.py 定义 <ROBOT>_CFG,最后在同目录的 __init__.py 导出,这个流程决定了后面所有配置能否被正常 import 和复用。
<ROBOT>_CFG 建议始终按三段来组织,迁移其他机器人时,把这三段改对,配置整体才不会跑偏:
- ⚙️
spawn(生成配置):负责“怎么把机器人生成到仿真里”,重点是asset_path、接触传感开关、刚体与求解器参数。 - 🧍
init_state(初始状态):负责“机器人初始站成什么样”,重点是pos/rot/joint_pos/joint_vel(如给出 21 个关节初值)。 - ⚡
actuators(驱动配置):负责“关节怎么被驱动”,重点是按腰、腿、臂分组配置关节匹配、力矩和速度上限、PD 参数(刚度、阻尼和摩擦)。
3.2 迁移环境类 (XxxEnv)
环境类迁移里,真正要紧的是尽早为「目标机器人」单独维护一份 Env,而不是在 Tienkung 的实现上不断打补丁。比较稳妥的做法,是直接把 tienkung_env.py 复制到 <robot_name>_envs.py,将类名改为 XxxEnv,后续所有与机体相关的修改都发生在这份副本上。
可以把该阶段工作分为两层:
🛠️ 第一层:启动级(确保名字解析不报错)
这层关心能否在仿真里正确解析出刚体与关节(让 __init__ 与 init_buffers 完整执行完毕)。
- 整理 URDF 清单:动代码前,整理一份关节名与常用 link 名的清单作为唯一替换依据。凡是接触、终止、奖励里出现的字符串,必须能在 URDF 中找到,避免凭印象手写。
- 替换基础配置:将原指向 Tienkung 的配置全部替换为目标机器人的
XxxWalkFlatEnvCfg等,并检查残留。若不替换干净,即使启动,跑的也是另一套机器人的参数。 - 对齐刚体 Link:集中在
walk_cfg.py的 robot 段(如terminate_contacts_body_names、feet_body_names)。按语义逐一替换,确保列表里是定义好的 link 而不是关节名。 - 精确解析名称:在
init_buffers中,find_bodies解析的name_keys必须与 URDF 严格一致(参考 Roban 第 159–165 行)。偏差会导致空张量,使接触力、终止条件全部失真。同理,find_joints需与 URDF 关节名一致且符合运动学排列习惯(参考 Roban 第 167–215 行)。
启动自检:名称对齐后,用少并行的
train做最小启动。若init_buffers顺利结束无报错,且日志打印出的“URDF 内部关节顺序”与“策略所用顺序”对照无误(参考第 242–247 行),则第一层闭合。
🧠 第二层:语义级(确保列顺序语义一致)
这层关乎策略网络操作的关节维度,与仿真张量里的列顺序是否语义一致。若出错,行为上会表现为动作不协调、不对称。Isaac Lab 中 robot.data.joint_pos 顺序由 URDF 决定,与策略输出的第 j 维无天然对应,必须人为固定并统一使用(Roban 约定为:腰 -> 左腿六 -> 右腿六 -> 左臂四 -> 右臂四,共21自由度)。
- 拼装策略顺序:在
init_buffers内用已分组的索引,按既定顺序通过torch.cat拼成policy_joint_ids(见第 226–235 行)。 - 构建映射字典:构造
robot_to_policy,值为该关节在策略向量中的列号,未参与控制置为 -1(见第 236–240 行)。 - 观测与动作闭环:
- 在
compute_current_observations中,供 Actor 使用的数据必须通过[:, self.policy_joint_ids]从robot.data取出,否则网络读写语义不一致(见第 489–502 行)。 - 在
step中,策略输出先缩放为delta_policy,必须散射回填delta_robot[:, self.policy_joint_ids] = delta_policy再下发,否则部分关节收不到指令(见第 597–605 行)。
- 在
- AMP与可视化对齐:凡涉及 AMP 的函数(如
get_amp_obs_for_expert_trans)及可视化逻辑,拼接顺序必须与policy_joint_ids及配置字段一致,避免“维度匹配但风格错位”。
动作自检:对策略向量单一维度施加微小扰动,观察是否仅有对应语义关节运动。若响应在其他关节,立即复查上述映射关系。
3.3 迁移任务配置
任务配置迁移主要发生在 walk_cfg.py。这一步决定训练入口如何组装场景、如何定义观测历史长度、如何约束 AMP 输入,是主配置闭环。
标准做法是在 walk_cfg.py 中定义 XxxWalkFlatEnvCfg 和 XxxWalkAgentCfg,然后对齐关键字段:
scene.robot必须绑定<ROBOT>_CFG,否则场景链路断开。robot.actor_obs_history_length与critic_obs_history_length明确设置。amp_num_joints与num_amp_observations与环境定义一致。
3.4 注册任务
让训练脚本“看得见”你新任务名的最后一步。在 legged_lab/envs/__init__.py 增加语句:
task_registry.register("<robot_name>_walk", XxxEnv, XxxWalkFlatEnvCfg(), XxxWalkAgentCfg())
如果不注册,命令行传了 --task 也不会命中目标配置。
三、 网络输入维度标准化
网络维度建议先以参数表形式固定,再写入代码。这个动作的意义是把“维度口径”从代码隐含逻辑变成显式约束。
以本工程为例,关键变量及其取值(K 即 num_amp_observations)如下表:
| 维度变量 | 含义说明 | 取值 (Roban) |
|---|---|---|
N_dof |
机器人控制自由度 | 21 |
N_cmd |
速度控制指令维度 | 3 |
N_ang |
基座角速度维度 | 3 |
N_g |
重力投影向量维度 | 3 |
N_last_action |
上一帧动作维度 | 21 |
N_priv |
特权观测维度 | 5 |
N_amp_root |
AMP 根节点特征 | 10 |
N_amp_ee |
AMP 末端执行器特征 | 12 |
K |
AMP 观测帧数 | 2 |
在这个口径下,三条核心网络维度公式可以统一计算:
Actor_single = N_ang + N_g + N_cmd + N_dof + N_dof + N_last_action (+ N_gait_optional)
Critic_single = Actor_single + N_priv
AMP_single = N_dof + N_dof + N_amp_root + N_amp_ee
Disc_input = AMP_single * K
维度计算结果:
依据上表,可得出:Actor_single = 72、Critic_single = 77、AMP_single = 64、Disc_input = 128。
⚠️ 训练时至少要确认三件事的 Tensor Shape:
- Actor 帧形状
== [num_envs, Actor_single]- Critic 帧形状
== [num_envs, Critic_single]- AMP 单帧形状
== [num_envs, AMP_single]
四、 类人步态的奖励函数体系
在完成底层架构迁移后,实现高质量类人步态的核心在于构建适配 Roban 动力学特性的奖励函数体系与分阶段的训练机制。单纯依赖基础的任务奖励极易导致机器人产生违背物理常理的极端动作,因此必须结合数学约束进行循序渐进的优化。本部分仅展示核心奖励函数及其代表性训练成果:
1. 基准步态的建立
基准步态旨在为机器人确立初步的行走姿态与指令响应能力,核心奖励函数如下:
-
任务跟踪奖励:引导机器人精准响应平面线速度和偏航角速度指令。采用指数型高斯核函数构建奖励信号,以确保信号平滑并避免梯度爆炸。
- 线速度跟踪误差与奖励:
- 角速度跟踪误差与奖励:
- 线速度跟踪误差与奖励:
-
物理约束奖励:
- 姿态稳定性:包含基座高度惩罚(防止过度深蹲
)以及躯干竖直约束(鼓励上身保持直立):
- 足部运动特征:惩罚支撑相中的足底滑移以提高步态稳健性:
同时约束脚掌姿态()防止严重踮脚或内外翻,并对两脚间距设置二次型惩罚以维持合理的安全步宽。
- 姿态稳定性:包含基座高度惩罚(防止过度深蹲
-
控制平滑与硬件保护:
- 动作平滑度惩罚(抑制高频振荡):
- 关节功率惩罚(降低能耗,保护电机):
- 对膝盖、躯干等非期望接触部位施加冲击力阈值惩罚。
- 动作平滑度惩罚(抑制高频振荡):
🎥 本阶段的“基准步态”结果如图所示,步态呈现明显的非自然性。
2. 步态对称性与质量提升
为解决双足运动中常见的非对称现象,需要从时域、频域及网络结构三个维度进行约束:
- 时空对称性正则化:对左右腿的支撑相时长(
t_sup_L,t_sup_R)、单周期位移步幅(||d_L||,||d_R||)进行高斯核比对,强制引导两侧运动均衡:
- 频域特征约束 (FFT):对左右对称关节对的动作序列进行快速傅里叶变换,提取减去均值后的幅值序列
A_L,A_R,惩罚前 20 个主要频率分量上的差异:
- 对称性网络架构 (Mirror Loss):在损失函数中引入对称性正则项,要求策略网络
π在镜像观测s_mirror下的输出应与原始输出a的镜像版本保持一致:
🎥 若不适用正确的对称性,训练结果的不对称现象将十分明显,如下图所示:
🎥 正确的对称性引导下,训练结果虽不完美,但相对正常,如下图所示:
五、 多轨迹的采样与融合
多轨迹融合的必要性:传统的参考轨迹训练多依赖单一运动模式如固定匀速直行,存在运动模式固化、面对动态扰动时泛化能力差的劣势。为突破此限制,本项目在底层数据加载侧参考了其他 AMP 工程的多轨迹融合机制,即在训练阶段,判别器网络不再局限于单一直线轨迹,而是从多轨迹混合分布中进行随机采样,详细机制如下所述。
假设每条专家轨迹在训练中的采样权重为 w_i,提供给判别器的专家数据状态转移概率分布可表示为各独立轨迹分布的混合加权,公式如下:
详细的动作轨迹数据及其权重见下表。
| 运动模态 | 轨迹说明 | 采样权重 (w_i) |
|---|---|---|
| 直线运动 | 直行(中速) | 0.0714 |
| 直行(低速) | 0.0952 | |
| 后退(中速) | 0.0952 | |
| 后退(低速) | 0.0952 | |
| 弧线与曲线 | 弧线行进(左转,小转弯半径) | 0.0476 |
| 弧线行进(右转,小转弯半径) | 0.0476 | |
| 弧线行进(左转,中等转弯半径) | 0.0476 | |
| 弧线行进(右转,中等转弯半径) | 0.0476 | |
| 沿椭圆路径行走 | 0.0476 | |
| 沿圆形路径行走 | 0.0476 | |
| 原位旋转 | 原地转圈(低速,逆时针) | 0.0714 |
| 原地转圈(低速,顺时针) | 0.0714 | |
| 原地转圈(中速,逆时针) | 0.0714 | |
| 原地转圈(中速,顺时针) | 0.0714 | |
| 静止状态 | 静止站立 | 0.0714 |
这种混合采样机制打通了多形态动作的先验特征空间,使得判别器能够拟合更宽泛的运动参考分布,进而引导策略网络生成在复杂任务中具备强泛化能力与抗干扰鲁棒性的拟人步态。
💡 **值得注意的是:**融入多轨迹采样融合机制后的机器人将在多指令下表现出更高的灵活性,底层逻辑是 AMP 十分看重专家数据的影响,下面将展示专家数据在相同奖励函数配置下对于训练结果的直接影响。
| 🎥 GMR (General Motion Retargeting) 专家动作 | 🎥 策略网络最终训练结果 |
|---|---|
专家数据 A
|
专家数据 A
|
专家数据 B
|
专家数据 B
|





