E1 · Ensayo grabado
5 minInstala el toolbox y corre el ensayo de banco.
Listo cuando: python3 kit/coletar.py --saida ~/fth/log.npz termina en gravado: ~/fth/log.npz, con enc_left_knee … 50.0°.
Clase 3 · 17 min
Randomizar cubre lo que no sabes; identificar reduce lo que no sabes. En esta clase cuelgas el "robot real" del pórtico, haces que la pierna se balancee en un barrido de frecuencia, grabas los encoders y usas el toolbox de identificación de sistemas del propio MuJoCo para descubrir el kp y el kd que el motor entrega de verdad.
Empezar la clase
Objetivo: identificar el kp y el kd del actuador en un ensayo de banco con el toolbox mujoco.sysid y compararlos con el valor oculto.
Haz clic en cada bloque.
Cada ensayo identifica lo que excita. La pierna en el aire no dice nada sobre la fricción del pie.
mujoco.sysid llegó en MuJoCo 3.5.0 (12/02/2026); aquí, 3.16.0 con el extra [sysid]. Haz clic en cada etapa.
Cada parámetro tiene valor nominal, rango y una función que escribe el valor en el MjSpec (el modelo editable). En el kit: kp y kd multiplican las ganancias del deploy.yaml en las cuatro articulaciones ensayadas.
Junta el spec, el estado inicial, el comando (TimeSeries.from_control_names) y los sensores medidos (TimeSeries.from_names).
Trampa real: los sensores del modelo tienen que ser exactamente los del log. El G1 de Menagerie trae una IMU; el banco la quita.
Recompila el modelo en cada intento, ejecuta el rollout y minimiza la diferencia. En CPU, de unos segundos a un minuto para dos parámetros.
En el robot de verdad no existe un valor oculto para comparar. Aquí sí existe: --revelar abre el real.json y te dice si llegaste a ±10 %.
La verificación honesta en el robot es otro ensayo, que el ajuste no vio.
El extra [sysid] trae scipy, matplotlib y plotly. El coletar.py graba el ensayo del "robot real" colgado.
F=${FTH:-$HOME/fth}; cd $F && . .venv/bin/activate
pip install -q "mujoco[sysid]==3.16.0"
python3 -c "from mujoco import sysid; print('mujoco.sysid ok:', sysid.optimize.__name__, sysid.Parameter.__name__)"F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/coletar.py --saida $F/log.npzensaio de bancada no mundo 'real': 1999 amostras em 4.0 s · 4 encoders + velocidades enc_left_hip_pitch amplitude medida 18.6° enc_left_hip_roll amplitude medida 29.6° enc_left_knee amplitude medida 50.0° enc_left_ankle_pitch amplitude medida 19.3° gravado: ~/fth/log.npz
Cuatro articulaciones, 4 s, 1.999 muestras. La rodilla oscila 50° de punta a punta.
mujoco.sysid ok: optimize Parameter
Sin el extra, mujoco.sysid existe pero no tiene optimize: el módulo oculta lo que depende de scipy.
Parte del modelo nominal (kp = kd = 1,0 × el del deploy.yaml) y ajusta los dos.
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/sysid.py $F/log.npz --revelar; echo "saída: $?"F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/sysid.py $F/log.npz --parametros kp --revelar | tail -4; echo "saída: ${PIPESTATUS[0]}"F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/coletar.py --mundo sim --saida $F/log-sim.npz | tail -1
python3 kit/sysid.py $F/log-sim.npz | tail -4log: ~/fth/log.npz · 1999 amostras · sinais: 8 (posição e velocidade de 4 juntas) resíduo, modelo nominal: 0.034 resíduo, modelo identificado: 0.014 erro das posições na bancada, modelo nominal: 8.16° (RMS) erro das posições na bancada, modelo identificado: 3.14° (RMS) kp nominal 1.00 → identificado 0.57 kd nominal 1.00 → identificado 1.08 kp escondido 0.60 · dentro de ±10 %: sim kd escondido 1.00 · dentro de ±10 %: sim saída: 0
El kp vuelve cerca de 0,6 (el motor entrega el 60 % de la ganancia enviada) y el kd queda cerca de 1,0, porque el "real" no tocó el kd. El error de las posiciones cae a menos de la mitad.
erro das posições na bancada, modelo nominal: 8.16° (RMS) erro das posições na bancada, modelo identificado: 3.55° (RMS) kp nominal 1.00 → identificado 0.52 kp escondido 0.60 · dentro de ±10 %: não saída: 1
Con un solo parámetro, el optimizador pone en el kp todo lo que el modelo no explica, incluido el retardo de 20 ms que la clase 4 mide. El parámetro que falta en el modelo se filtra a los otros: dale al ajuste los grados de libertad que el ensayo excita.
gravado: ~/fth/log-sim.npz erro das posições na bancada, modelo nominal: 0.11° (RMS) erro das posições na bancada, modelo identificado: 0.11° (RMS) kp nominal 1.00 → identificado 1.00 kd nominal 1.00 → identificado 1.00
En el mundo sin diferencia oculta, el ajuste no tiene nada que corregir: kp y kd se quedan en 1,00 y el error que sobra, 0,11°, es el ruido del encoder (0,002 rad).
Medir el actuador del "robot real".
Instala el toolbox y corre el ensayo de banco.
Listo cuando: python3 kit/coletar.py --saida ~/fth/log.npz termina en gravado: ~/fth/log.npz, con enc_left_knee … 50.0°.
Corre la identificación y compárala con el valor oculto.
Listo cuando: python3 kit/sysid.py ~/fth/log.npz --revelar; echo "saída: $?" → la línea del kp termina en dentro de ±10 %: sim (oculto 0.60) y saída: 0.
Corre el mismo ensayo en el mundo "sim" e identifica (último bloque). Después explica en dos líneas por qué solo el kp, en el log del "real", sale del ±10 %.
Listo cuando: en el bloque del sim, la línea del kp termina en identificado 1.00; escribiste que el retardo ausente en el modelo fue a parar al kp.
La explicación aparece después de tu respuesta.
Pregunta 1 de 3
¿Por qué el ensayo se hace con el robot colgado del pórtico?competencia
Pregunta 2 de 3
Al identificar solo el kp, sale 0,52; con kp y kd juntos, cerca de 0,6. ¿Qué pasó?
Pregunta 3 de 3
En el robot real, ¿cómo comprobar un parámetro identificado?
Elige una alternativa. La explicación aparece después de tu intento.