基础Locomotion策略训练是ATOM01强化学习训练体系的入门阶段,其目标是利用纯**近端策略优化(PPO)**算法,在IsaacLab高并行仿真环境中训练机器人获得稳定的平地行走与崎岖地形自适应运动能力。与后续基于模仿学习的AMP和BeyondMimic高级训练不同,本阶段完全依赖手工设计的奖励函数(Reward Shaping)引导策略收敛,无需任何参考动作数据集。通过本章,你将理解环境配置、观测与动作空间设计、奖励函数构成、域随机化机制以及完整的训练-测试-导出工作流。
训练架构概览
基础Locomotion采用Direct RL Environment架构,环境逻辑直接继承自IsaacLab的DirectRLEnv,而非基于Manager的模块化配置。这种设计的核心优势在于高透明度:所有观测计算、步进逻辑、奖励聚合和终止判断都以显式Python代码编写,便于中级开发者精确定义运动控制逻辑并快速迭代。训练管线从IsaacLab环境出发,经过RSL-RL的向量化包装器,最终由PPO算法进行策略更新。
flowchart TD
subgraph Env["IsaacLab DirectRLEnv"]
A[ATOM01机器人资产] --> B[接触传感器 / 足部扫描]
C[UniformVelocityCommand<br/>速度指令生成器] --> D[观测与奖励计算]
E[地形生成器<br/>Flat / Rough] --> D
B --> D
F[事件管理器<br/>域随机化 / 推搡] --> D
end
G[RslRlVecEnvWrapper<br/>动作裁剪与观测包装] --> H[OnPolicyRunner<br/>PPO 训练循环]
D --> G
H --> I["ActorCritic网络<br/>[512,256,128] ELU"]
H --> J[RolloutStorage<br/>经验缓存]
J --> H
整个训练系统包含两个注册环境:Atom01-Flat面向基础步态学习,地形以碎石与平地为主;Atom01-Rough面向复杂地形泛化,启用课程学习机制并引入对称性数据增强。两者共享同一套BaseEnv核心逻辑,仅在场景配置与智能体超参数上存在差异。
Sources: init.py
环境核心:BaseEnv
BaseEnv是所有基础Locomotion环境的抽象基类,其内部显式维护了Actor观测缓冲区、Critic观测缓冲区和动作历史缓冲区,用于支持时序信息融合与动作平滑性惩罚。
观测空间设计
观测采用Actor-Critic不对称设计。Actor(策略网络)只能获取机器人本体可感知的信息,而Critic(价值网络)则拥有仿真器提供的特权信息(Privileged Information),用于更准确地评估状态价值,从而稳定训练。
**Actor观测(单帧,共78维)**包含:角速度(3维)、投影重力(3维)、速度指令(3维)、关节位置偏差(23维)、关节速度(23维)、上一帧动作(23维)。通过actor_obs_history_length=10的历史缓冲区拼接后,策略网络实际输入维度为 780维。
**Critic观测(Flat环境,单帧139维)在Actor观测基础上追加:根线速度(3维)、足端接触标志(2维)、足端接触力(6维)、足端悬空时间(2维)、足端高度(2维)、关节加速度(23维)、关节力矩(23维)。Rough环境的Critic进一步引入高度扫描(Height Scan)**信息,由安装在base_link上的RayCaster以0.1m分辨率扫描前方1.6m×1.0m区域,生成11×17=187个高度点,使Critic观测总维度达到 326维。
这种分离设计是足式机器人RL训练的常见范式:策略网络在部署时仅依赖机载传感器可获得的量测,而价值网络在训练时利用完美信息降低价值估计方差。
Sources: base_env.py
动作空间与执行
动作空间为23维连续向量,对应ATOM01全身23个驱动关节的位置偏移量。动作首先经过裁剪(clip_actions=100.0),再乘以action_scale=0.25,最后叠加到默认关节位置上作为关节位置目标下发。物理仿真以dt=0.005为步长,每步环境决策通过decimation=4在仿真中执行4次,因此控制频率为 50Hz。动作历史缓冲区保留最近3帧动作,用于计算action_rate_l2与action_smoothness_l2奖励,抑制策略产生高频抖动。
Sources: base_env.py
终止条件
当机器人出现以下情况时,当前回合立即终止:躯干或大腿偏航/横滚连杆触地(terminate_contacts_body_names包含torso_link、*_thigh_yaw_link、*_thigh_roll_link)、基座姿态超出阈值、基座高度低于阈值,或达到最大回合时长20秒。终止时施加**-200.0的惩罚奖励**,防止策略采取危险姿态。值得注意的是,超时(time-out)不会施加惩罚,并在PPO的Bootstrap过程中利用价值函数估计进行回报折算。
Sources: base_env.py
奖励函数设计
ATOM01的奖励函数采用密集塑形(Dense Shaping)策略,包含17项以上的奖励与惩罚项,覆盖速度跟踪、能量效率、姿态稳定、足端行为与关节约束等多个维度。所有与运动相关的奖励均乘以projected_gravity_b[:,2]的截断因子,确保机器人在倾倒过程中不会获得异常奖励。
| 奖励项 | 权重 | 说明 |
|---|---|---|
track_lin_vel_xy_exp |
+1.0 | 在偏航坐标系下跟踪线速度的指数奖励 |
track_ang_vel_z_exp |
+1.0 | 跟踪偏航角速度的指数奖励 |
lin_vel_z_l2 |
-0.2 | 惩罚垂直方向弹跳 |
ang_vel_xy_l2 |
-0.1 | 惩罚横滚与俯仰角速度 |
energy |
-1e-4 | 惩罚关节功耗 |
joint_torques_l2 |
-1e-5 | 惩罚大力矩输出 |
joint_vel_l2 |
-2e-4 | 惩罚高关节速度 |
dof_acc_l2 |
-2.5e-7 | 惩罚关节加速度 |
action_rate_l2 |
-2e-2 | 惩罚动作突变 |
action_smoothness_l2 |
-2e-2 | 惩罚动作不平滑 |
undesired_contacts |
-1.0 | 惩罚非足端触地 |
flat_orientation_l2 |
-1.0 | 惩罚基座不水平 |
termination_penalty |
-200.0 | 回合终止惩罚 |
feet_air_time |
+0.25 | 奖励单足支撑时的悬空时间(阈值0.4s) |
feet_slide |
-0.3 | 惩罚触地足端滑动 |
feet_force |
-3e-3 | 惩罚足端冲击力过大 |
feet_distance |
+0.1 | 奖励双足横向间距保持在0.16~0.50m |
knee_distance |
+0.1 | 奖励双膝横向间距保持在0.18~0.35m |
feet_stumble |
-1.0 | 惩罚足部绊倒(水平力远大于垂直力) |
feet_orientation_l2 |
-0.1 | 惩罚足端姿态倾斜 |
dof_pos_limits |
-1.0 | 惩罚关节超限 |
joint_deviation_hip |
-0.03 | 惩罚髋关节偏离默认位置 |
joint_deviation_torso |
-1.0 | 惩罚躯干与手臂偏离默认位置 |
joint_deviation_arms |
-0.06 | 惩罚手臂俯仰偏离 |
joint_deviation_legs |
-0.01 | 惩罚腿部偏离默认位置 |
feet_contact_without_cmd |
+0.1 | 零速度指令时奖励双足触地站立 |
upward |
+0.4 | 奖励基座朝上(-gravity_z) |
stand_still |
-0.2 | 零指令且静止时惩罚关节偏移 |
feet_height |
+0.2 | 摆动相足端离地高度奖励 |
上述奖励在ATOM01RewardCfg中以RewTerm形式声明,实际计算逻辑位于mdp/rewards.py中。开发者可通过修改权重或增减奖励项快速迭代策略行为,例如增大feet_air_time权重可鼓励更大幅度的抬腿,而增大energy惩罚则会使步态更紧凑节能。
Sources: atom01_env_cfg.py, rewards.py
域随机化与事件管理
为了增强Sim2Real迁移能力,BaseEnv在EventManager中配置了多维度域随机化。所有随机化事件分为两类触发模式:
Startup模式(环境初始化时触发一次):随机化刚体物理材质(静摩擦0.3~1.6、动摩擦0.3~1.2)、基座与连杆质量(±3kg或缩放0.9~1.1)、质心偏移、驱动器刚度/阻尼增益(缩放0.9~1.1)以及关节摩擦与电枢参数。
Interval模式(训练过程中周期性触发):每10~15秒对机器人施加一次随机速度扰动(推搡),模拟外部冲击力。该扰动在X/Y/Z线速度和三轴角速度上均有随机分量,强迫策略学习鲁棒平衡能力。
此外,每次回合重置(Reset)时,机器人根状态会在位置±0.5m、偏航±π范围内随机初始化,关节位置则以默认姿态的0.5~1.5倍随机缩放,确保策略不依赖特定初始姿态。
Sources: base_config.py
地形生成与课程学习
地形配置直接决定了策略的泛化上限。基础Locomotion提供三种地形预设:
- GRAVEL_TERRAINS_CFG:30%随机起伏(±2~4cm噪声)+ 70%纯平地面,适用于
Atom01-Flat的基础步态学习。 - ROUGH_TERRAINS_CFG:课程制地形,包含倒金字塔楼梯、斜坡、随机网格、粗糙地面和平地,难度随训练进程自动提升。
- ROUGH_HARD_TERRAINS_CFG:更高难度的地形库,增加了深坑、星形障碍、间隙与踏脚石,适用于进阶鲁棒性训练。
Rough环境启用curriculum=True,当机器人在当前地形上行走距离超过地形尺寸一半时,自动晋升至更高难度地形;若行走距离过短,则降级。该机制通过update_terrain_levels实现,并在训练日志中记录Curriculum/terrain_levels均值。
flowchart LR
A[训练开始] --> B[随机初始化地形等级]
B --> C{行走距离<br/>> 4m?}
C -->|是| D[地形等级+1<br/>难度提升]
C -->|否| E{行走距离<br/>过小?}
E -->|是| F[地形等级-1<br/>难度降低]
E -->|否| G[保持当前等级]
D --> H[继续训练]
F --> H
G --> H
Sources: terrain_generator_cfg.py, base_env.py
PPO算法与网络配置
训练采用RSL-RL库的OnPolicyRunner驱动PPO算法。策略与价值网络共享相同的MLP结构,但输出头分离。对于Atom01-Flat与Atom01-Rough,核心超参数如下:
| 参数 | Flat | Rough | 说明 |
|---|---|---|---|
max_iterations |
9001 | 9001 | 最大训练迭代次数 |
num_steps_per_env |
24 | 24 | 每轮迭代中每个环境采集的步数 |
actor_hidden_dims |
[512,256,128] | [512,256,128] | 策略网络隐藏层 |
critic_hidden_dims |
[512,256,128] | [512,256,128] | 价值网络隐藏层 |
activation |
elu | elu | 激活函数 |
learning_rate |
1e-3 | 1e-3 | 初始学习率 |
schedule |
adaptive | adaptive | 根据KL散度自适应调节学习率 |
gamma |
0.99 | 0.99 | 折扣因子 |
lam |
0.95 | 0.95 | GAE lambda |
clip_param |
0.2 | 0.2 | PPO裁剪系数 |
entropy_coef |
0.005 | 0.005 | 熵正则系数 |
num_learning_epochs |
5 | 5 | 每批次优化轮数 |
num_mini_batches |
4 | 4 | Mini-batch数量 |
desired_kl |
0.01 | 0.01 | 目标KL散度 |
学习率采用自适应调度:当策略更新导致的KL散度超过1.5×desired_kl时学习率降低,低于0.5×desired_kl时学习率提升,从而在保证策略稳定更新的同时维持足够的探索强度。
Sources: atom01_agent_cfg.py, ppo.py
对称性数据增强
Atom01-Rough环境额外启用了对称性数据增强(Symmetry Augmentation)。由于ATOM01为左右对称人形机器人,可利用镜像变换将单条样本扩展为两条。具体而言,系统通过预定义的镜像索引与符号变换,将左/右关节观测与动作互换,并翻转具有方向属性的量测(如角速度、投影重力)。在训练时,该增强以两种形式生效:
- 数据增强(Data Augmentation):将原始样本与镜像样本拼接,使有效batch size翻倍。
- 镜像损失(Mirror Loss):在PPO损失中额外加入镜像动作的对数概率约束,系数为0.2。
对称性配置通过RslRlSymmetryCfg注入PPO算法,并由data_augmentation_func回调实现。该机制对于Rough环境尤为重要,因为它在不增加仿真开销的前提下显著提升了样本效率,帮助策略更快适应左右不对称的复杂地形冲击。
Sources: atom01_agent_cfg.py, ppo.py
训练、测试与导出工作流
基础Locomotion的完整工作流遵循“训练 → 测试 → 导出”的三段式路径。以下是具体操作命令与步骤说明。
1. 启动训练
在成功安装IsaacLab与atom01_train依赖后,使用以下命令启动Flat环境训练:
python robolab/scripts/rsl_rl/train.py --task=Atom01-Flat --headless --logger=tensorboard --num_envs=4096
启动Rough环境训练(启用对称性增强与课程学习):
python robolab/scripts/rsl_rl/train.py --task=Atom01-Rough --headless --logger=tensorboard --num_envs=4096
关键命令行参数包括:--num_envs控制并行环境数量(推荐4096或8192以充分利用GPU并行度);--max_iterations可覆盖配置中的迭代上限;--headless在无GUI服务器上必需;--logger支持tensorboard或wandb。训练日志与模型检查点默认保存在logs/rsl_rl/<experiment_name>/<timestamp>/目录下,每save_interval=1000次迭代保存一次。
Sources: train.py, README_CN.md
2. 可视化测试
训练完成后,使用play.py加载最新检查点进行可视化测试:
python robolab/scripts/rsl_rl/play.py --task=Atom01-Rough --num_envs=1
play.py支持--plane强制使用平地地形、--push_robot启用推搡扰动、--video录制训练/测试视频,以及通过--load_run与--checkpoint指定历史模型路径。测试脚本会自动将策略导出为JIT(TorchScript)与ONNX格式,存储在检查点同级目录,便于后续部署到ROS2推理节点。
Sources: play.py
3. 模型导出
在play.py执行过程中,以下导出逻辑自动触发:
- JIT导出:将Actor网络与观测归一化层打包为TorchScript,便于Python/C++运行时加载。
- ONNX导出:生成标准化ONNX模型,供ROS2推理节点或MuJoCo Sim2Sim验证使用。
若需手动导出,可直接调用isaaclab_rl.rsl_rl提供的export_policy_as_jit与export_policy_as_onnx工具函数。导出的模型文件可直接衔接Sim2Sim迁移与MuJoCo验证章节进行跨仿真器验证。
Sources: play.py
下一步
完成基础Locomotion策略训练后,你已掌握ATOM01在IsaacLab中的标准PPO训练范式。若策略在Flat与Rough环境中均表现良好,可依据需求进入以下进阶阶段:
- 若希望机器人模仿人类参考动作、实现更自然的步态,请继续阅读 AMP模仿学习与动作数据集。
- 若希望机器人掌握多种运动技能(如行走、起立、转向)并通过注意力机制切换,请继续阅读 BeyondMimic多技能与注意力策略。
- 若希望将训练好的策略迁移到MuJoCo并验证物理一致性,请继续阅读 Sim2Sim迁移与MuJoCo验证。