解读 57 · 辨识结果如何进入仿真
解读对象:
microduck-replica/docs/换舵机重训全流程.md§3,交叉引用upstream/microduck_rl/src/mjlab_microduck/robot/microduck_constants.py的_BAM_ACTUATOR_KWARGS
需要的前置:解读 56(m6.json 从哪来)
台架辨识的产出是一份 JSON。它怎么变成仿真里"那颗舵机"?这篇讲从文件到训练环境的完整路径,以及哪些数字不该照抄。
第一站:执行器配置字典
训练侧加载点在 microduck_constants.py(真实代码):
_BAM_ACTUATOR_KWARGS = dict(
motor_name="xl330",
model="m6",
target_names_expr=(r"^(?!passive_).*",), # 排除被动关节
kp_fw=200.0, # 固件位置环刚度(microban 用 125)
vin_range=(6.5, 8.2), # 每个环境启动时采样的电池电压
vin_drop_gain_range=(0.0, 0.2), # 负载压降 V_drop = gain * sum(|tau|)
vin_min=6.0,
delay_min_lag=3, delay_max_lag=6, # 指令延迟(控制步)
)
motor_name="xl330", model="m6" 就是去加载 bam/params/xl330/m6.json。换 HL-1910 时,训练参数调整指南 §11.5 给出概念上的改法:json_path="/绝对路径/params/hl1910/m6.json",与 motor_name + model 二选一,不能同填。其余几项全部按新舵机实测重定:kp_fw 是新舵机真实运行增益;vin_range 按新舵机额定改——官方 6.5–8.2 是超压特例,勿照抄(§3 原文警告);delay_min/max_lag 用实测端到端延迟。
第二站:回差与域随机化范围
| 改什么 | 文件 | 依据 |
|---|---|---|
| 回差建模 | tasks/backlash.py(框架现成) |
填实测回差角;模型侧每个舵机串一个 passive_<joint>_backlash 被动铰链(±1.0°,XL330 建模值) |
| 域随机化范围 | tasks/microduck_velocity_env_cfg.py L28–53 |
范围 = 你的台架实测离散度:出厂差异大就放大,个体一致可收窄 |
| 几何 | robot/microduck/assets/ 网格 |
仅外形变了才动,质量惯量随新网格重算 |
| 不动的 | obs 61 维 / action 14 维 / reward / 课程表 | 接口规格不变,运行时省大改 |
改完的验收(§3 末):跑 5 迭代冒烟,确认 obs/action 维度不变、无 NaN、reward 量级正常——再进训练。
备用路线:MuJoCo 原生 PD
不想用 BAM,可以直接抄 joints_properties.xml 里 5 组实测标定过的 PD 参数。当前默认 chosen_actuator(注释标 "marc"):damping=0.053、frictionloss=0.0048、armature=0.0018、kp=0.55、forcerange=±0.96。注意 perfect_actuator(damping 0.15 / kp 10.0 / ±20.0)是理想电机,只用于对照,不要拿它训练要上真机的策略(执行器选型.md)。
一条铁律
辨识值进仿真后,仿真才配叫"这台机器的仿真"。随机化范围若沿用官方数,"白随机"(§7 坑 2)——它描述的是 XL330 的出厂离散,不是你手里那批 HL-1910 的。
你带走的收获
- 参数写回仿真的路径只有两级:JSON 进执行器配置(
json_path/motor_name+model),随机化范围进任务配置——没有第三处魔法。 - vin_range 是最容易被照抄的一项:6.5–8.2 V 是"XL330 被超压"这个历史包袱,新舵机按自己的额定写。
- 回差不是配置项而是模型结构:
passive_*_backlash被动铰链 + 固件环透过回差读数(BacklashEncoderBamActuator)。 - 改仿真先立"不动的清单":61/14 接口、reward、课程表不动,改动面才可控。
- 每次改动用 5 迭代冒烟验证维度与数值健康,别把 bug 带进数小时的 GPU 训练。