项目背景
luwu_walker 是本猫在陆吾智能实习时接手的第一个项目。它是一个十自由度、高度约 50 cm 的小型双足机器人,对标宇树科技的 Q MINI。这次做的是强化学习行走的前期可行性验证,还没有进入产品化验证。
前期的时间大致是:7 月 20–28 日做 sim-to-sim,7 月 30 日–8 月 6 日做 sim-to-real。
下面从奖励函数设计开始,记录 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 输入 → 输出 | 控制含义 | 对应阶段 |
|---|---|---|---|
| 早期 V1 | 41 → 10 | 直接输出十关节动作,属于旧 walker_mujoco / Android UDP 链路 | 早期仿真阶段,指标与 V2 分开记录 |
| V2 PhaseAssist | 43 → 12 | 43 维单帧观测;12 个动作包括步频、相位修正和十关节位置目标 | 加入显式步态时钟和足部奖励 |
| V2 HIM / RealSysId HIM | 215 → 12 | 五帧历史按观测项展开;10 个关节动作含义仍与 PhaseAssist 一致 | 后续迁移训练和实机推理使用的版本 |
| V2 RealSysId HIM Straight | 215 → 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-Critic | Actor 接收当前帧 43 维观测;Critic 接收训练用的独立 critic 观测,其中可包含额外仿真状态。两者分别使用全连接 MLP,隐藏层为 512/256/128,激活函数为 ELU,并启用观测归一化。Actor 使用连续高斯分布。 | Actor 输出 12 维动作:步频、相位修正及十个关节目标;Critic 输出价值估计。 |
| V2 HIM Actor-Critic | Actor 输入为 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 日的实机日志没有保存完整启动参数,那几次各用了哪个融合器,目前还无法确定。
| 运行模式 | 检查条件 | 用途 |
|---|---|---|
| strict | IMU age 15 ms、关节 age 15 ms、时间戳 skew 10 ms;位置误差 0.08 rad、速度误差 0.1 rad/s;重力模长 0.9–1.1 g、倾角 10° | 用于严格检查时序、反馈与姿态条件 |
| fully-open evaluation | IMU age 100 ms、关节 age 250 ms;关闭 skew 限制,位置/速度误差门放宽到 10 rad / 33 rad/s,安全目标范围放宽 | 诊断模式,放宽反馈拒绝条件;热保护、驱动故障、看门狗和摔倒阻尼仍保留 |
记录 luwu_walker 的上机结果时,要把运行模式一起写上。fully-open-evaluation 放宽了检查条件,这个模式下能跑起来,说明的是放宽配置下的运行情况;strict 的检查门槛和安全裕度需要另外评估。
3.3 上机时按什么顺序检查
结合 luwu_walker 现有的工具和调试中遇到的问题,上机时可以按下面的顺序来:
- 先上电检查:核对十关节映射、编码器方向和零位,再看温度、驱动故障和关节反馈时序。
- 回到默认姿态:先用风险较低的目标让 luwu_walker 进入默认姿态,核对目标、实际角度、速度和力矩反馈是否一致。
- 跑 shadow:指定要用的 ONNX,检查输入维度、归一化、五帧历史顺序、推理频率和 p95 延迟。这一步记录的是推理结果,运动效果留到实际控制时再看。
- 测单关节响应:固定姿态和增益,做低幅度扫频,记录目标与实际角度,再拟合增益、相位滞后和等效延迟。
- 低速走一小段:记下 strict / fully-open 模式、IMU 来源、模型哈希、标定哈希和命令,同时记录十关节目标、实际值、误差、倾角和安全事件。
- 分段看日志:把站立、每段运动、开始出现风险、失衡和恢复分开统计,先看清楚跟踪误差和姿态风险谁先出现,哪些误差是在摔倒之后才出现的。
- 带回仿真再试:把实测 profile 或这次改动的单个变量带回训练和回放,用同版本策略重新评估。要判断某个改动有没有用,还需要控制其他条件;不同条件下的日志只能分别说明各自的情况。
4. 关节拟合、实验对比与关键日志
4.1 十关节扫频拟合:6 Hz 附近的幅值和相位
2026-08-21 的 actuator_identification_20260821_032034 对 luwu_walker 的十个关节逐一做了 5–7 Hz 扫频。下面取各关节最接近 6.00 Hz 的拟合点,列出增益、相位滞后和等效延迟。增益就是实际摆动幅值除以目标幅值,相位滞后和延迟则描述动作跟慢了多少。这些值对应本轮测试的姿态,换个姿态还需要重新测量。
| 关节 | 频率 | 增益 | 相位滞后 | 等效延迟 |
|---|---|---|---|---|
| 左 hip-z | 6.00 Hz | 0.442 | 102.7° | 47.6 ms |
| 左 hip-x | 6.00 Hz | 0.213 | 133.7° | 61.9 ms |
| 左 thigh | 6.00 Hz | 0.436 | 91.4° | 42.3 ms |
| 左 shank | 6.00 Hz | 0.716 | 94.2° | 43.6 ms |
| 左 ankle | 6.00 Hz | 0.654 | 93.6° | 43.3 ms |
| 右 hip-z | 6.00 Hz | 0.530 | 84.7° | 39.2 ms |
| 右 hip-x | 6.00 Hz | 0.207 | 142.3° | 65.9 ms |
| 右 thigh | 6.00 Hz | 0.548 | 105.7° | 48.9 ms |
| 右 shank | 6.00 Hz | 0.506 | 98.8° | 45.8 ms |
| 右 ankle | 6.00 Hz | 0.652 | 88.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 · 增益 = 实际响应幅值 / 目标幅值
读图提示:这四个关节在扫频中均显示频率相关的幅值变化;拟合曲线对应该轮的姿态和控制器增益,不代表所有负载与姿态下的固定传递函数。
4.2 默认姿态下,低频和高频能跟上多少
2026-08-18 的默认姿态 chirp,先让 luwu_walker 回到标定的默认关节姿态,再让指定的 shank 运动。约 2 Hz 时,两侧 shank 的幅值增益接近 1;到约 4.25–4.75 Hz,left shank 就出现了明显的衰减和滞后。
| 关节 / 测试频点 | 增益 | 相位滞后 | 说明 |
|---|---|---|---|
| 左 shank,1.76 Hz | 0.917 | 23.6° | 低频默认姿态 chirp |
| 右 shank,1.76 Hz | 0.944 | 21.1° | 低频默认姿态 chirp |
| 左 shank,2.00 Hz | 0.963 | 24.5° | 低频默认姿态 chirp |
| 右 shank,2.00 Hz | 0.974 | 22.2° | 低频默认姿态 chirp |
| 左 shank,4.25 Hz | 0.338 | 57.9° | 高频默认姿态 chirp |
| 左 shank,4.50 Hz | 0.553 | 65.5° | 高频默认姿态 chirp |
| 左 shank,4.75 Hz | 0.361 | 63.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 分开测试
两组频段来自独立测试窗口。低频曲线显示约 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 damping | 0.645 | 0.373 | 三角波拟合中心值 |
| hip-x damping | 1.084 | 0.225 | 三角波拟合中心值 |
| shank delay | 9 步(左) | 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_082451 | 236.6 s | 26.1 Hz | 7 | 111.1 s | 29.2° |
remote_run_20260824_085029 | 138.5 s | 45.9 Hz | 5 | 74.5 s | 41.1° |
第二条采样率更高,比较方便看高频关节波动。这次记录更短、运动时间更少,最大倾角也更大。不过模型版本和运行参数没有记全,目前还判断不了两次稳定性差别来自哪里,也无法判断哪一版模型更稳;采样率和稳定性的因果关系同样需要另做对照。
再看 085029 的第一个运动段。取运动开始 0.5 s 后、首次风险出现前,且倾角 < 5° 的稳定窗口,比较左右关节的目标和实际摆幅。这里的摆幅取窗口内的 P95–P5,单位为 rad。
| 关节 | 左目标 | 右目标 | 左实际 | 右实际 |
|---|---|---|---|---|
| hip-z | 0.075 | 0.111 | 0.060 | 0.083 |
| hip-x | 0.164 | 0.123 | 0.165 | 0.119 |
| thigh | 0.081 | 0.142 | 0.103 | 0.112 |
| shank | 0.277 | 0.327 | 0.192 | 0.183 |
| ankle | 0.113 | 0.112 | 0.097 | 0.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
此图展示稳定窗口中的摆幅差,不表示每个关节的整段运行趋势。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版本确实在训练的时候逐渐展露出来这种的步态,但是最后呈现的行走变成了低抬脚和低步幅的行走方式,后期确实做到了稳定行走,但是代价就是行走步态不是很理想.我个人认为这就是这个小腿机器人的极限