RL

小双足机器人技术报告:强化学习与 Sim-to-Real

Posted on 2026-10-07mujocosim to realppohim

记录十自由度小双足机器人 luwu_walker 的 PPO / HIM 训练、关节辨识与实机迁移,结合日志数据分析执行器响应、左右摆幅及当前验证边界。

项目背景

luwu_walker 是本猫在陆吾智能实习时接手的第一个项目。它是一个十自由度、高度约 50 cm 的小型双足机器人,对标宇树科技的 Q MINI。这次做的是强化学习行走的前期可行性验证,还没有进入产品化验证。

前期的时间大致是:7 月 20–28 日做 sim-to-sim,7 月 30 日–8 月 6 日做 sim-to-real。

下面从奖励函数设计开始,记录 luwu_walker 的训练过程,以及 sim-to-real 中遇到的问题和对应的解决方法。

项目代码:Luwu_Walker_RL-sim2real

视频展示

luwu_walker 第一版模型的 Sim-to-Real 实机演示

1. luwu_walker 的结构与控制方式

luwu_walker 高约 50 cm,有十个主动关节。每条腿包含 hip-z、hip-x、thigh、shank、ankle 五个关节。训练时,策略根据速度命令和机体状态,连续给出各个关节的位置目标。这样 luwu_walker 就能完成起步、摆腿、落脚,并维持机体稳定,关节也不用一直重复一套固定轨迹。

下面主要讲 luwu_walker 后续使用的 V2 canonical-frame 任务。先看整个控制过程:

速度命令 + IMU姿态/角速度 + 关节状态 + 历史动作
                       ↓
             强化学习策略(HIM)
                       ↓
        步态频率/相位修正 + 十关节位置目标
                       ↓
       位置控制器、驱动器、连杆与地面接触
                       ↓
            新一帧关节和IMU观测

1.1 先分清策略版本

luwu_walker 开发过程中换过几代 ONNX,有些接口看起来相似,里面的输入和动作含义却有区别。所以记录实验时,就把模型文件、任务 ID 和输入维度一起记下来了。

策略版本ONNX 输入 → 输出控制含义对应阶段
早期 V141 → 10直接输出十关节动作,属于旧 walker_mujoco / Android UDP 链路早期仿真阶段,指标与 V2 分开记录
V2 PhaseAssist43 → 1243 维单帧观测;12 个动作包括步频、相位修正和十关节位置目标加入显式步态时钟和足部奖励
V2 HIM / RealSysId HIM215 → 12五帧历史按观测项展开;10 个关节动作含义仍与 PhaseAssist 一致后续迁移训练和实机推理使用的版本
V2 RealSysId HIM Straight215 → 12从 RealSysId HIM 迁移,额外约束航向与侧向漂移2026-08-26 完成仿真微调,目前没有找到对应的上机验证记录

luwu_walker 当前登记的实机 RealSysId 模型是 model/walker_v2_him/policy_real_sysid_20260824.onnx,SHA256 为 3e47fdc8c1573c641d8473479d8807f0b4cacb1c4b50c51c531cff7f8a586878。这里要注意,RS00 脚本的默认 policy-kind 还是 phase_assist,使用 HIM 时要加上 --policy-kind him。运行 RealSysId 版本还要通过 --policy 指定对应路径,否则只知道用了“HIM 模型”,仍然没法确定实际跑的是哪个文件。

2. 强化学习训练策略

2.1 算法、训练框架与网络架构

luwu_walker 使用 PPO(Proximal Policy Optimization) 训练策略,训练环境用的是 mjlab 1.2.0。MuJoCo 仿真、任务配置、观测和动作、奖励以及并行环境都由 mjlab 管理,训练部分使用 RSL-RL 的 on-policy PPO runner。代码里的 HimPPO 继承了 RSL-RL PPO,另外加上 HIM 估计器的辅助监督。简单来说,Actor 负责给出连续动作的分布,Critic 负责估计当前状态的价值,训练时再用两者计算优势、更新策略。

luwu_walker 的 PhaseAssist 和 HIM 在输入维度、网络结构上都有区别,放在一起看会更清楚:

策略结构输入与网络输出 / 训练作用
V2 PhaseAssist Actor-CriticActor 接收当前帧 43 维观测;Critic 接收训练用的独立 critic 观测,其中可包含额外仿真状态。两者分别使用全连接 MLP,隐藏层为 512/256/128,激活函数为 ELU,并启用观测归一化。Actor 使用连续高斯分布。Actor 输出 12 维动作:步频、相位修正及十个关节目标;Critic 输出价值估计。
V2 HIM Actor-CriticActor 输入为 5 帧 × 43 维,即 215 维历史。历史估计器使用 128/64 隐藏层,预测 3 维机体线速度和 8 维隐变量;将当前帧 43 维与这 11 维估计拼接成 54 维,再送入 512/256/128 的 ELU 策略 MLP。Critic 保持独立价值网络。Actor 输出 12 维动作;Critic 使用独立的训练用 critic 观测和价值网络。训练时另用 8 维解码器预测仿真特权目标中的接触状态与接触力;速度和接触辅助损失系数分别为 1.0、0.25。部署时策略只接收观测历史,不读取仿真特权目标。

对应到 ONNX,PhaseAssist 是 43 → 12,HIM 是 215 → 12。HIM 的 215 维来自五帧历史,按观测项展开;单帧仍然是 43 维。早期 V1 的 41 → 10 则是另一代接口。上面的网络维度按当前源码配置整理,PPO 的学习率、迭代数会随从头训练和迁移微调而变化,后面会写到具体配置。

2.2 从步态先验到 PhaseAssist

luwu_walker 早期先靠速度跟踪和足部接触奖励学会基本走路,到了 V2 再加入显式相位辅助。PhaseAssist 把步态频率限制在 1.6–2.2 Hz,相位修正限制在 ±0.1π,单关节位置动作乘以 0.5 后,叠加到 luwu_walker 的默认关节姿态上。速度命令较低时,会放宽脚部与行走相位的匹配要求,减少步态奖励对站立的干扰。

具体到奖励,PhaseAssist 会同时考虑速度跟踪和脚部动作。实机迁移训练保存的配置里,线速度跟踪权重为 4,角速度跟踪权重为 3;另外还有足部 gait/contact 匹配、摆动期离地高度、摆动末端足部水平、重复触地和落脚惩罚。也就是让 luwu_walker 跟随命令、左右脚交替、抬到合适的高度,并控制摆脚末端的姿态,减少连续触地。配置中的足部步态项权重为 +3.0,摆动高度项为 -0.05,末端水平项为 -0.02,重复触地项为 -0.1。这里列的是对应任务的配置,之前各版策略的权重会有不同。

这样做保留了策略调整动作的空间,同时给步态周期、频率和相位划定了较小的范围,方便 luwu_walker 先学会稳定走路。不过到了实机上还有一个问题:策略为了纠正姿态,可能会给出高频关节目标。仿真里的理想执行器能跟上,真实电机却可能摆不到目标幅度,动作也会慢半拍。这就是幅值衰减和相位滞后,后面的 RealSysId 会通过辨识和随机化处理这部分仿真与实机的差异。

2.3 HIM:从单帧状态扩展到观测历史

HIM Actor 使用连续五帧观测估计机体线速度和一个 8 维隐变量,再将估计量与当前帧状态拼接后送入策略网络。每帧为 43 维,ONNX 输入为 5 × 43 = 215 维,输出仍为 12 维动作。策略网络为三层 MLP(512/256/128,ELU);速度估计器以 3 维线速度为监督目标,隐变量解码器用接触状态及接触力等特权训练目标提供辅助监督。

训练时用到的特权目标,包括 3 维基座线速度、左右脚接触状态和接触力。接触状态和接触力由仿真环境提供,luwu_walker 实机没有对应的足底力传感器。上机后,ONNX 靠五帧关节、IMU 和动作历史推断速度和隐变量,仿真真值只在训练时使用。另外,启动时会先用首帧填满历史缓存,所以最开始的五帧都是同一次采样,后面再逐帧更新。

2.4 PPO 与迁移训练配置

luwu_walker 的 RealSysId HIM 从 ToeForward HIM 的 model_2999.pt 接着训练,并按实机辨识结果调整执行器、关节偏差、IMU 振动和地面摩擦。PPO 配置为 5 个学习 epoch、4 个 minibatch,学习率 5×10⁻⁵(adaptive schedule),熵系数 0.003,每次迭代收集 24 个仿真步。基础仿真步长为 0.002 s,decimation 为 10,也就是物理仿真跑 500 Hz,策略更新跑 50 Hz。单回合上限为 20 s,一共使用 4096 个并行环境。

这次迁移训练新增了 3000 次迭代。前 1500 次在平地训练,约从恢复后的第 1500 次迭代开始加入平地摩擦课程,低摩擦 0.15–0.45 和较高摩擦 0.9–1.6 各占约一半样本。脚本固定了起始 ToeForward checkpoint 的哈希:2a5a50e9ab64e5246d87fe71a1188d57067da7760076bd8ca9da06ce6ea368d4。训练完成后,将 model_5998.pt 导出为 ONNX,哈希与本地登记的 RealSysId 模型一致,这样就能把训练 checkpoint 和部署文件对应起来。

2.5 让训练分布更接近实机

做 RealSysId 的时候,luwu_walker 已经有了一些实测数据,可以把测到的偏差、延迟和噪声逐项加进训练环境。单独给理想电机加白噪声,覆盖不了这些差异。具体处理如下:

差异来源仿真处理方式对应目的
编码器偏差以十关节逐关节 bias 为中心,并在训练中加入偏差扰动避免策略依赖零误差关节反馈
关节动力学加入逐关节 damping、friction 与延迟;实测中心值附近进行扰动让目标到实际位置的动态差异进入闭环
传感器时序关节反馈延迟随机化;执行器滞后在 0 至 1 个物理步范围内扰动覆盖控制链中的采样和驱动延迟
位置/速度观测关节位置噪声约 ±0.04 rad、速度噪声约 ±0.4 rad/s避免策略只适应无噪声仿真状态
IMU加入安装偏差、偏置/尺度/噪声、动态瞬态和关节振动耦合逼近真实 IMU 在动作期间的污染
地面与结构对摩擦、质量/质心、PD 增益和外推扰动做域随机化提升对接触和个体差异的适应性

顺序就是先测量,再把测量得到的分布放进仿真。这里也有局限:关节滞后、传感器噪声和摩擦都只用有限的参数描述,机构背隙、线缆的影响、足底材料和实际接触变化,还没法靠这些参数完整复现。

2.6 Straight 微调:让 luwu_walker 走直线

RealSysId 让策略学到了左右硬件的实际差异。不过在 2026-08-25 的实机分析中发现,即使输入对称的状态,策略给出的左右目标摆幅也有差别,luwu_walker 在实机上会逐渐走成圈。后面为此新建了 WalkerV2Canonical-Walk-PhaseAssist-RealSysId-HIM-Straight,保留 RealSysId 的五帧历史、真实关节 profile 和 IMU corruption,再加上期望航向保持和侧向速度惩罚。训练从 model_5998.pt 开始,新增 1000 次迭代,原来的 RealSysId 任务也保留下来。

外接盘保存的 2026-08-26 训练文件里,Straight 最后 100 次迭代的平均 reward 约为 132.88,平均 episode length 约为 938.9 步,估计器损失约为 0.194。从这些指标看,仿真训练已经收敛。实机步行成功率还需要上机测量,目前也没找到 Straight 的上机记录。这个版本的 policy.onnx 只在外接日志盘的训练目录中找到,本地模型目录登记的仍然是哈希以 3e47… 开头的 RealSysId ONNX。

3. Sim-to-Real 部署流程

3.1 标定与动作映射

luwu_walker 上机前,先把坐标系、关节顺序、正方向、编码器零点、默认站姿和控制器增益核对一遍。这里容易混淆的是零位和默认姿态。文档里的编码器零位对应伸直姿态,策略的默认目标则是屈膝姿态。拿 left_shank 来说,encoder_zero_rad=4.1596 是标定零位,策略默认姿态约为 -0.79 rad。这两个值各有用途,设置站姿时要用对应的姿态目标。

ONNX 输出的十个关节目标,先按 canonical joint order 对应到 CAN 设备,再根据标定结果换算到编码器坐标。下发之前,还会经过限幅、变化率约束和安全检查。所以看日志时要分清三个量:ONNX 输出了什么、经过安全处理后下发了什么、电机实际转到了哪里。分析跟踪效果时,主要比较下发目标和实际位置,单看策略动作还不知道电机有没有跟上。

3.2 推理模式、IMU 与安全检查

luwu_walker 的 RS00 推理入口支持 shadow 和驱动器控制模式。shadow 可以先检查模型输入输出、推理耗时和数据采集,电机是否跟随策略运动还要在控制模式下验证。8 月 17 日的 HIM shadow 日志中,推理频率约为 49.7–50 Hz,p95 推理耗时约为 1.3–3.3 ms。不过当时出现了多次关节超时和错误,还没达到进入执行模式的条件,这组数据只能用来说明推理情况。

IMU 用了哪种融合方式也要记下来。推理入口默认还是 legacy IMU,使用 MEKF 要加上 --imu-fusion-source mekf。2026-08-26 交接文档里的建议命令选了 MEKF,不过 8 月 24 日的实机日志没有保存完整启动参数,那几次各用了哪个融合器,目前还无法确定。

运行模式检查条件用途
strictIMU age 15 ms、关节 age 15 ms、时间戳 skew 10 ms;位置误差 0.08 rad、速度误差 0.1 rad/s;重力模长 0.9–1.1 g、倾角 10°用于严格检查时序、反馈与姿态条件
fully-open evaluationIMU age 100 ms、关节 age 250 ms;关闭 skew 限制,位置/速度误差门放宽到 10 rad / 33 rad/s,安全目标范围放宽诊断模式,放宽反馈拒绝条件;热保护、驱动故障、看门狗和摔倒阻尼仍保留

记录 luwu_walker 的上机结果时,要把运行模式一起写上。fully-open-evaluation 放宽了检查条件,这个模式下能跑起来,说明的是放宽配置下的运行情况;strict 的检查门槛和安全裕度需要另外评估。

3.3 上机时按什么顺序检查

结合 luwu_walker 现有的工具和调试中遇到的问题,上机时可以按下面的顺序来:

  1. 先上电检查:核对十关节映射、编码器方向和零位,再看温度、驱动故障和关节反馈时序。
  2. 回到默认姿态:先用风险较低的目标让 luwu_walker 进入默认姿态,核对目标、实际角度、速度和力矩反馈是否一致。
  3. 跑 shadow:指定要用的 ONNX,检查输入维度、归一化、五帧历史顺序、推理频率和 p95 延迟。这一步记录的是推理结果,运动效果留到实际控制时再看。
  4. 测单关节响应:固定姿态和增益,做低幅度扫频,记录目标与实际角度,再拟合增益、相位滞后和等效延迟。
  5. 低速走一小段:记下 strict / fully-open 模式、IMU 来源、模型哈希、标定哈希和命令,同时记录十关节目标、实际值、误差、倾角和安全事件。
  6. 分段看日志:把站立、每段运动、开始出现风险、失衡和恢复分开统计,先看清楚跟踪误差和姿态风险谁先出现,哪些误差是在摔倒之后才出现的。
  7. 带回仿真再试:把实测 profile 或这次改动的单个变量带回训练和回放,用同版本策略重新评估。要判断某个改动有没有用,还需要控制其他条件;不同条件下的日志只能分别说明各自的情况。

4. 关节拟合、实验对比与关键日志

4.1 十关节扫频拟合:6 Hz 附近的幅值和相位

2026-08-21 的 actuator_identification_20260821_032034 对 luwu_walker 的十个关节逐一做了 5–7 Hz 扫频。下面取各关节最接近 6.00 Hz 的拟合点,列出增益、相位滞后和等效延迟。增益就是实际摆动幅值除以目标幅值,相位滞后和延迟则描述动作跟慢了多少。这些值对应本轮测试的姿态,换个姿态还需要重新测量。

关节频率增益相位滞后等效延迟
左 hip-z6.00 Hz0.442102.7°47.6 ms
左 hip-x6.00 Hz0.213133.7°61.9 ms
左 thigh6.00 Hz0.43691.4°42.3 ms
左 shank6.00 Hz0.71694.2°43.6 ms
左 ankle6.00 Hz0.65493.6°43.3 ms
右 hip-z6.00 Hz0.53084.7°39.2 ms
右 hip-x6.00 Hz0.207142.3°65.9 ms
右 thigh6.00 Hz0.548105.7°48.9 ms
右 shank6.00 Hz0.50698.8°45.8 ms
右 ankle6.00 Hz0.65288.6°41.0 ms

从表里能看到,luwu_walker 各关节的响应差别比较大。6 Hz 时,增益约为 0.21–0.72,相位滞后约为 85–142°,同一条腿上的髋、膝、小腿和踝关节也有不同的动态响应。另外,这轮测试中左 shank 用的是 Kp=23,右 shank 用的是 Kd=0.9,其余关节大多为 Kp=20, Kd=0.7。左右控制参数本身就有区别,分析时还得把这部分影响考虑进去。扫频姿态、增益和载荷都会影响结果,重新做实验时也要一起记录。

下图展示左右 shank 和 ankle 的扫频曲线;十个关节在 6 Hz 附近的数据列在上表。

图 1|5–7 Hz 关节扫频:幅值增益

2026-08-21 actuator identification · 左右 shank 与 ankle · 增益 = 实际响应幅值 / 目标幅值

0.00.20.40.60.8 5.255.505.756.006.256.506.75 频率(Hz)幅值增益
左 shank右 shank 左 ankle右 ankle

读图提示:这四个关节在扫频中均显示频率相关的幅值变化;拟合曲线对应该轮的姿态和控制器增益,不代表所有负载与姿态下的固定传递函数。

4.2 默认姿态下,低频和高频能跟上多少

2026-08-18 的默认姿态 chirp,先让 luwu_walker 回到标定的默认关节姿态,再让指定的 shank 运动。约 2 Hz 时,两侧 shank 的幅值增益接近 1;到约 4.25–4.75 Hz,left shank 就出现了明显的衰减和滞后。

关节 / 测试频点增益相位滞后说明
左 shank,1.76 Hz0.91723.6°低频默认姿态 chirp
右 shank,1.76 Hz0.94421.1°低频默认姿态 chirp
左 shank,2.00 Hz0.96324.5°低频默认姿态 chirp
右 shank,2.00 Hz0.97422.2°低频默认姿态 chirp
左 shank,4.25 Hz0.33857.9°高频默认姿态 chirp
左 shank,4.50 Hz0.55365.5°高频默认姿态 chirp
左 shank,4.75 Hz0.36163.4°高频默认姿态 chirp

在这组默认姿态和测试增益下,luwu_walker 基本能跟上正常约 2 Hz 的 shank 摆动。到了 4.25–4.75 Hz,left shank 实际只摆到目标幅值的约 34%–55%,相位滞后约 58°–66°。也就是说,策略额外给出的高频动作,可能会改变实际摆腿的幅度和时刻。至于每次失衡是否由高频动作先触发,还需要继续看时序。

下图展示默认姿态 shank 的低频 / 高频响应。低频和高频来自不同测试段,所以图里的线段是断开的,中间没测过的频率也没有做插值。

图 2|默认姿态 shank:低频跟踪与高频衰减

2026-08-18 default-pose chirp · 低频左右 shank 与高频左 shank 分开测试

0.000.250.500.751.00 1.52.03.04.05.0 频率(Hz)幅值增益 0.9170.9630.3380.5530.361
左 shank:1.76–2.00 Hz 右 shank:1.76–2.00 Hz 左 shank:4.25–4.75 Hz

两组频段来自独立测试窗口。低频曲线显示约 2 Hz 时增益接近 1;高频左 shank 增益降至约 0.34–0.55,并伴随约 58–66° 相位滞后。中间空白频段没有测量值,因此没有连线。

4.3 低频三角波参数与仿真实测 profile

luwu_walker 还做过一次低频关节辨识:输入 0.1 Hz 三角波,每个关节跑约 3 个周期,记录位置和速度响应,再用这些数据确定仿真被动参数和偏差的中心值。源码里用 τ ≈ load(q) + damping·q̇ + friction·sign(q̇) 描述拟合参数,另外保存编码器偏差和延迟步数。

参数左侧代表值右侧代表值含义
hip-z damping0.6450.373三角波拟合中心值
hip-x damping1.0840.225三角波拟合中心值
shank delay9 步(左)8 步(右)配置中的延迟步数,不换算成毫秒
shank encoder bias+0.01364 rad+0.04322 rad加入实测 profile 的偏差中心值

低频拟合主要用来看摩擦、阻尼和静态偏差,5–7 Hz 扫频则用来看高频动态,两种测试各有用途。只做高频 chirp,也没法确定低速库仑摩擦。目前 luwu_walker 仓库里保存了训练用的 empirical_profile.py,表里的数值可以从源码中查到。不过从三角波 CSV 重新生成完整 profile 的独立拟合程序还没保存下来,仅靠当前项目还无法完整重跑这一步。

4.4 8 月 24 日实机日志:运行情况和左右摆幅

下面选了 luwu_walker 的两条实机日志,都有有效关节遥测,也做过分段统计。不过两次采样率不同,policy/controller/calibration 哈希、命令和启动参数也没有保存完整,所以先分别看各自的运行情况,做单变量前后对比还缺少条件。

运行记录记录时长遥测率运动段数累计运动时间最大倾角
remote_run_20260824_082451236.6 s26.1 Hz7111.1 s29.2°
remote_run_20260824_085029138.5 s45.9 Hz574.5 s41.1°

第二条采样率更高,比较方便看高频关节波动。这次记录更短、运动时间更少,最大倾角也更大。不过模型版本和运行参数没有记全,目前还判断不了两次稳定性差别来自哪里,也无法判断哪一版模型更稳;采样率和稳定性的因果关系同样需要另做对照。

再看 085029 的第一个运动段。取运动开始 0.5 s 后、首次风险出现前,且倾角 < 5° 的稳定窗口,比较左右关节的目标和实际摆幅。这里的摆幅取窗口内的 P95–P5,单位为 rad。

关节左目标右目标左实际右实际
hip-z0.0750.1110.0600.083
hip-x0.1640.1230.1650.119
thigh0.0810.1420.1030.112
shank0.2770.3270.1920.183
ankle0.1130.1120.0970.103

这个窗口里,luwu_walker 右侧 hip-z、thigh 和 shank 的目标摆幅更大,右 hip-z 的实际摆幅比左侧高约 38%。hip-x 则是左侧摆幅更大,左右 shank 的实际摆幅接近,而且都低于目标。各关节表现并不相同,单用“左腿整体不动”概括会漏掉这些区别。同一稳定窗口里,左右腿的 sum(abs(torque_feedback)) 分别约为 2.23 Nm 和 2.25 Nm。这里统计的是电机反馈力矩之和;luwu_walker 没有足底力传感器,足底地面反力还无法直接测量。

同一轮日志里,右 shank 主频约为 5.85 Hz,P95 目标误差约为 0.235 rad;左 shank 主频约为 5.56 Hz,P95 误差约为 0.191 rad。高频目标和跟踪误差都能在实测数据里看到。目前的推测是,它们可能在闭环里进一步放大问题。不过误差和姿态风险谁先出现、最初由什么触发,还得按每条运行的时间顺序继续确认。

下图展示 085029 稳定窗口中的左右关节目标与实际摆幅,对应上面的表格。看图时仍要记得,082451 和 085029 的运行配置不同,两次结果还无法直接作对照。

图 3|实机稳定窗口:左右目标摆幅与实际摆幅

remote_run_20260824_085029 · 首个运动段 · 倾角 < 5° 的稳定窗口 · P95–P5

0.000.100.200.300.35 hip-zhip-xthighshankankle 关节组角度摆幅(rad)
左目标右目标 左实际右实际

此图展示稳定窗口中的摆幅差,不表示每个关节的整段运行趋势。hip-x 左侧更大;右 hip-z、thigh、shank 目标更大;左右 shank 实际摆幅接近且均小于目标。

4.5 直线微调当前的结果

在我的2026-08-26 Straight HIM 训练目录里,保存了 model_6997.pt、policy.onnx、env.yaml、agent.yaml 和 TensorBoard 数据。任务名为 WalkerV2Canonical-Walk-PhaseAssist-RealSysId-HIM-Straight,新增 1000 次迭代,最后 100 次迭代的平均回报约为 132.88,平均 episode length 约为 938.9 步,估计器损失约为 0.194。luwu_walker 的这次直线约束微调已经完成仿真训练。目前保存的实机遥测到 8 月 24 日为止,还没找到 8 月 26 日之后使用这个哈希的实机运行记录,Straight 上机后能走成什么样还需要验证。

5. 这段时间做了哪些修改

时间修改 / 实验看到的现象进展和待做的事
7 月 20–28 日早期 sim-to-sim,调整奖励和步态策略(按原报告时间线)目前源码里有多代任务配置,但早期奖励修改没有全部留下对应的实验记录具体版本和指标还需要结合个人实验记录补齐
7 月 30 日–8 月 6 日早期 sim-to-real 可行性验证(按原报告时间线)开始做硬件映射、标定和运行条件检查每次的模型哈希和参数没有记全,目前只能描述这一阶段做了什么,还没法量化比较效果
8 月 18 日默认姿态 chirp,检查振动和高频响应;试过统一的 1.5 rad/s 目标变化率限制限速后 shank 目标峰峰值从约 0.736/0.703 rad 降到约 0.375/0.303 rad,但运动段中 45.8% 的采样至少有一个关节触发限速,luwu_walker 难以正常抬脚统一限速过强会压缩步态幅度,这个值还不适合直接作为最终滤波参数
8 月 21 日十关节扫频、低频三角波辨识,整理 empirical profile各关节的增益、相位、阻尼、摩擦、延迟和偏差都有区别参数已用于 RealSysId 仿真,从 CSV 拟合到 profile 的完整步骤还没整理好
8 月 24 日RealSysId HIM 迁移训练得到 model_5998.pt 和对应 ONNX;同日记录了多条实机遥测后面分析时发现左右目标有差别,也有高频跟踪误差实机日志的配置哈希还不全,暂时无法严格判断差异由哪个改动造成
8 月 25 日针对走圈和左右不对称,分别统计策略目标、实际响应和力矩反馈右 hip-z、thigh、shank 目标更大,hip-x 则相反;目前看是多个因素共同影响,“单腿全部失效”解释不了这些现象最初引起失衡的因素还没分离出来
8 月 26 日从 RealSysId checkpoint 新建 Straight HIM 微调任务加入 heading hold 和 lateral drift 约束后,仿真训练曲线收敛还没找到这版 ONNX 后续的实机日志,上机效果待验证

6. 目前的结果和还没解决的问题

从已有日志里能看到什么

  • luwu_walker V2 的 PhaseAssist/HIM 都输出 12 个动作。HIM 输入五帧历史,每帧 43 维,导出的接口为 215 → 12。
  • RealSysId 把逐关节延迟、编码器偏差、阻尼和摩擦、IMU 动态噪声以及足底摩擦差异加进了仿真,迁移 checkpoint 和 ONNX 可以通过 SHA256 对应起来。
  • 默认姿态下,约 2 Hz 的 shank 摆动跟踪较好;left shank 到约 4.25–4.75 Hz 时,已经有明显的幅值衰减和相位滞后。
  • 8 月 24 日实机日志里,左右策略目标不完全对称,实际关节与目标之间存在跟踪误差,shank 目标中还能看到约 5–6 Hz 的成分。
  • 8 月 26 日的 Straight HIM 保存了仿真模型和 TensorBoard 指标,目前还没找到它通过实机短直行验证的记录。

还有那些需要确定的点

  • 高频目标、执行器相位滞后和姿态估计误差,可能在闭环里相互放大。它们是否先触发了跌倒、是否还有其他原因,目前还没有确认。
  • 实机遥测没有统一记全策略哈希、控制器参数、标定哈希、命令和操作条件。不同 run 里效果变好或变差,还没法归到某一个改动上。
  • luwu_walker 目前没有足底地面反力测量,也没有外部姿态真值。电机 torque_feedback 与足底载荷需要分开看,判断滤波器是否有故障,也还需要 IMU 创新角之外的依据。
  • 接触力来自仿真环境,用于 HIM 训练监督,实机上没有直接测量相同信号。
  • 7 月早期每版奖励权重、动作范围和 sim-to-sim 对比日志,在当前源码快照里保存得不全,缺少的实验数字暂时留空。

结语

当前的视频展示的部分其实是第一版本模型sim to real的效果,其实可以看到由于高频关节误差累计,是做不到长期稳定的行走的,尤其是前期的步态更类似的外八的步态.对于这个小腿机器人的性能来说并不理想,可以看到通过类型的机器人比如宇树Q MINI.miniduck等最终呈现出来的步态都是类似内八的形式,这样的行走在没有上半身的机器人来说才能更有利于进行平衡行走.后期的V2版本确实在训练的时候逐渐展露出来这种的步态,但是最后呈现的行走变成了低抬脚和低步幅的行走方式,后期确实做到了稳定行走,但是代价就是行走步态不是很理想.我个人认为这就是这个小腿机器人的极限