双轮足机器人的动作很容易让人把注意力放在“轮子转得多快”上。但轮子一加速,机身姿态、腿部支撑和地面接触会一起变化。让它保持平衡、跟随速度指令,再承受一些扰动,本质上是一个持续反馈的控制问题。
整理这套轮足项目时,我更关心策略到底学到了什么,以及训练中的动作如何在部署端保留原来的含义。下面围绕项目中的 Isaac Gym、PPO、ONNX 和 ROS 链路展开:从观测与奖励出发,走到最终的关节命令。
强化学习面对的是一个连续控制任务
每一步,环境提供机器人状态和运动指令,策略产生动作,物理仿真推进后返回奖励与下一次观测。策略需要在连续时间的后果中找到合适的控制方式,而不是逐帧模仿一张标准姿势图。
velocity command + robot observation
-> policy -> leg / wheel commands
-> physics step -> reward + next observation平地速度跟踪、受扰后恢复和复杂接触会产生不同的学习难点。前进距离也不能独立代表表现:机身剧烈摇摆、轮子打滑或者关节命令抖动,都可能伴随较高的短期速度。
项目采用 legged_gym 风格的训练环境。Isaac Gym 用于并行物理仿真,PPO 负责从交互轨迹中更新策略。大规模并行训练的背景可参考 Learning to Walk in Minutes;论文中的训练时间和机器人表现不等于这个项目的实测结果。
Actor 能看到什么,决定了策略能部署到哪里
项目配置采用 28 维 actor observation、148 维 critic observation 和 7 维动作。这些是策略接口的总维度,不能直接拿来推断机器人有几条腿或几个电机。
| 接口 | 配置维度 | 用途 |
|---|---|---|
| Actor observation | 28 | 策略执行时可取得的输入 |
| Critic observation | 148 | 训练时用于估计价值的扩展输入 |
| Policy action | 7 | 待映射为关节命令的动作向量 |
Actor 的输入围绕本体感知组织:姿态或重力方向、角速度、关节状态、指令与动作历史等。具体拼接顺序、是否包含某类状态以及缩放方式,需要与当前配置逐项核对。历史堆叠还会引入额外的时间维度,不能把单帧 28 维直接当成 encoder 的完整输入长度。
Critic 的信息更丰富,配置中包含额外状态与地形高度采样。这是非对称 actor-critic 的思路:训练时可以借助仿真信息改善价值估计,部署时动作策略不能依赖真机拿不到的真值。
历史观测提供线索,不等于直接测量
可选的 mlp_encoder 对历史观测做编码,再与当前输入和指令一起进入策略。历史里的姿态变化、关节响应与动作,可以提供惯性、接触和响应延迟的线索。
但 encoder 并不会自动成为一个经过验证的速度传感器。基座速度究竟来自显式状态估计,还是由历史特征间接表示,需要在训练与部署两侧说清楚。仿真中的真实速度也不能不加处理地变成真机输入。
PPO 怎样把一次 rollout 变成策略更新
PPO 交替进行环境采样和多轮小批量更新。Actor 描述动作分布,critic 估计未来回报;优势估计帮助判断某个动作比当前预期好多少。
训练时常用高斯分布采样动作以探索。PPO 的 clipped objective 根据新旧策略的概率比和优势限制更新激励,减少一次更新把策略推得过远的倾向;它并不保证每轮更新后运动一定更稳定。
sample rollout with the current policy
estimate returns and advantages with GAE
update actor with the clipped policy objective
fit current value predictions to return targets
apply entropy regularization and collect fresh data对应实现可以对照 rsl_rl 的 PPO 源码。价值损失更新的是当前 critic 的预测;采样时保存的旧预测只作为参考,不能拿一个冻结的旧值冒充正在学习的网络输出。
项目分析中的训练配置如下。它们是理解训练设置的起点,不是一组适用于所有轮足机器人的最优超参数。
| 参数 | 配置值 | 关注点 |
|---|---|---|
| 并行环境数 | 4096–8192 | 采样规模与硬件负载 |
| 学习率 | 1e-3 | 更新幅度及调度 |
| 折扣因子 gamma | 0.99 | 未来回报的权重 |
| GAE lambda | 0.95 | 优势估计的偏差与方差 |
| 每批数据的训练轮数 | 5 | 数据复用与策略偏移 |
| Mini-batch 数 | 4 | 更新批次划分 |
| 熵系数 | 0.01 | 探索强度 |
并行环境增加的是采样能力。训练是否更快、最终策略是否更好,还取决于 rollout 长度、仿真开销、更新开销与任务难度,不能从环境数量直接换算出收敛时间。
奖励函数,定义了机器人愿意怎样前进
速度跟踪奖励让机器人接近目标线速度和角速度;其他项约束它用什么代价完成任务。项目配置中能看到动作变化、关节加速度、力矩与碰撞等惩罚。
| 奖励或惩罚项 | 希望引导的行为 | 需要警惕的现象 |
|---|---|---|
| 线速度、角速度跟踪 | 跟随运动指令 | 为追指令牺牲姿态 |
| 竖直速度惩罚 | 减少不必要的上下振动 | 抑制需要的腿部动作 |
| 动作变化惩罚 | 避免相邻时刻命令突变 | 过重时反应迟钝 |
| 力矩、关节加速度惩罚 | 限制执行代价和剧烈响应 | 过重时不愿运动 |
| 碰撞惩罚 | 减少不期望接触 | 接触定义错误导致误导 |
调奖励时,我会把总回报拆成各分项,同时看机身姿态、速度误差与动作曲线。总回报上升可能来自某个容易获取的奖励,并不自动说明抗扰或地形适应性提高。
奖励也和时间尺度有关。同一项惩罚在仿真步长、策略更新间隔或控制 decimation 改变后,可能产生不同效果。因此,比较两个策略时要连同这些设置一起记录。
轮子和腿,需要不同的动作解释
策略输出一个归一化向量,部署端再把它映射为物理命令。腿部关节通常采用目标位置与 PD 控制,轮子则采用目标角速度。相同的数值不能不经转换就同时交给这两类执行器。
下面是动作适配的概念表达,具体索引、尺度和限位由对应机器人配置决定:
a = clip(policy_output, -1, 1)
leg_position_target = nominal_position + leg_scale * a_leg
wheel_velocity_target = wheel_scale * a_wheel这里要对齐动作顺序、默认关节位置、位置与速度的单位、轮子方向,以及增益和限幅。只要左右轮符号或腿部零位有一处不一致,训练中正确的动作就可能在部署时变成另一种运动。
探索分布与部署动作要分别约定
训练中的 actor 可以输出均值并配合标准差采样,部署时则要明确导出的图到底输出均值、采样结果还是其他动作表示。不能因为训练有高斯探索,就默认真机也必须持续加入同样的随机扰动。
使用确定性均值还是采样,是需要明确和评估的部署设置。动作裁剪则只是数值边界,仍需下层的关节限位、模式检查和异常处理配合。
Sim-to-Real,要把变化放进训练
项目分析包含摩擦、质量、执行延迟、观测噪声和外部推力等随机化。目标是在训练中覆盖一定范围的物理变化,让策略减少对某一个理想环境的依赖。
随机化范围仍需要物理依据。范围太窄覆盖不了真实误差,太宽也可能让训练长期面对不合理组合。评估时应额外保留一些参数组合,观察速度误差、跌倒情况和动作饱和,而不是只看训练回报。
执行器响应也属于差异来源。若引入 actuator network,它需要来自执行器响应数据的训练与独立验证,不能把目录里存在一个网络文件当成已经解决电机动力学差异。
从 ONNX 到 ROS,保留策略的原意
训练端导出部署所需的 actor,若策略依赖历史 encoder,也要一起保存。部署不需要把训练用 critic 和特权输入搬到机器人上。
IMU / encoders -> state estimation
-> observation assembly and history
-> normalization -> encoder, if used -> ONNX actor
-> action mapping -> hybrid joint interfaceROS 的 update 回路把状态估计、模式分发、策略推理与命令下发串起来。模型、观测顺序、缩放参数、动作映射和控制周期应属于同一份部署契约。
有些输入使用固定 scale,有些实现使用均值和方差统计。部署必须复现训练实际使用的方式。文件成功导出 ONNX 后,还应拿同一批观测比较训练框架与 ONNX Runtime 的动作输出,并验证历史缓冲区在 reset 和模式切换时的行为。
正常、速度、楼梯和防摔等模式,可以通过状态机选择不同策略;模式名称本身不证明相应能力已经通过测试。切换时还需要检查当前姿态、目标命令与历史状态是否适合新的策略。
用分开的指标检查学习结果
我会把评估分成三层:仿真任务表现、模型导出一致性、部署回路表现。对应关注速度跟踪与跌倒率、相同输入下的动作差异,以及完整控制周期的耗时和异常处理。
关于实时性,应测量从读取状态到下发命令的整个周期,并关注尾部延迟和超时;单次 MLP 推理很快,不能直接推导出控制回路总能准时。关于运动能力,则要记录地形、速度命令、扰动条件和重复次数。
这篇文章记录的是强化学习训练与部署的工程链路,没有附上可复核的真机测试表,因此不把稳定爬楼、自复位或毫秒级延迟写成已测得的结论。更值得持续追踪的,是策略在每一步究竟看到了什么、优化了什么,以及最后真正给电机下发了什么。