E1 · Ensaio gravado
5 minInstale o toolbox e rode o ensaio de bancada.
Pronto quando: python3 kit/coletar.py --saida ~/fth/log.npz termina em gravado: ~/fth/log.npz, com enc_left_knee … 50.0°.
Aula 3 · 17 min
Randomizar cobre o que você não sabe; identificar diminui o que você não sabe. Nesta aula você pendura o "robô real" no pórtico, faz a perna balançar numa varredura de frequência, grava os encoders e usa o toolbox de identificação de sistema do próprio MuJoCo para descobrir o kp e o kd que o motor entrega de verdade.
Começar a aula
Objetivo: identificar o kp e o kd do atuador num ensaio de bancada com o toolbox mujoco.sysid e conferir contra o valor escondido.
Clique em cada bloco.
Cada ensaio identifica o que ele excita. A perna no ar não diz nada sobre o atrito do pé.
mujoco.sysid chegou no MuJoCo 3.5.0 (12/02/2026); aqui, 3.16.0 com o extra [sysid]. Clique em cada etapa.
Cada parâmetro tem valor nominal, faixa e uma função que escreve o valor no MjSpec (o modelo editável). No kit: kp e kd multiplicam os ganhos do deploy.yaml nas quatro juntas ensaiadas.
Junta o spec, o estado inicial, o comando (TimeSeries.from_control_names) e os sensores medidos (TimeSeries.from_names).
Armadilha real: os sensores do modelo têm de ser exatamente os do log. O G1 do Menagerie traz uma IMU; a bancada a remove.
Recompila o modelo a cada tentativa, roda o rollout e minimiza a diferença. Em CPU, alguns segundos a um minuto para dois parâmetros.
No robô de verdade não existe valor escondido para conferir. Aqui existe: --revelar abre o real.json e diz se você chegou a ±10 %.
A conferência honesta no robô é outro ensaio, que o ajuste não viu.
O extra [sysid] traz scipy, matplotlib e plotly. O coletar.py grava o ensaio do "robô real" pendurado.
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
Quatro juntas, 4 s, 1.999 amostras. O joelho oscila 50° de ponta a ponta.
mujoco.sysid ok: optimize Parameter
Sem o extra, mujoco.sysid existe mas não tem optimize: o módulo esconde o que depende do scipy.
Parte do modelo nominal (kp = kd = 1,0 × o do deploy.yaml) e ajusta os dois.
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
O kp volta perto de 0,6 (o motor entrega 60 % do ganho mandado) e o kd fica perto de 1,0, porque o "real" não mexeu no kd. O erro das posições cai para menos da metade.
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
Com um parâmetro só, o otimizador põe no kp tudo o que o modelo não explica, inclusive o atraso de 20 ms que a aula 4 mede. Parâmetro que falta no modelo vaza para os outros: dê ao ajuste os graus de liberdade que o ensaio 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
No mundo sem diferença escondida, o ajuste não tem o que corrigir: kp e kd ficam em 1,00 e o erro que sobra, 0,11°, é o ruído do encoder (0,002 rad).
Medir o atuador do "robô real".
Instale o toolbox e rode o ensaio de bancada.
Pronto quando: python3 kit/coletar.py --saida ~/fth/log.npz termina em gravado: ~/fth/log.npz, com enc_left_knee … 50.0°.
Rode a identificação e confira contra o valor escondido.
Pronto quando: python3 kit/sysid.py ~/fth/log.npz --revelar; echo "saída: $?" → a linha do kp termina em dentro de ±10 %: sim (escondido 0.60) e saída: 0.
Rode o mesmo ensaio no mundo "sim" e identifique (último bloco). Depois explique em duas linhas por que só o kp, no log do "real", sai do ±10 %.
Pronto quando: no bloco do sim, a linha do kp termina em identificado 1.00; você escreveu que o atraso ausente no modelo foi parar no kp.
A explicação aparece depois da sua resposta.
Pergunta 1 de 3
Por que o ensaio é feito com o robô pendurado no pórtico?competência
Pergunta 2 de 3
Identificando só o kp, ele sai 0,52; com kp e kd juntos, perto de 0,6. O que aconteceu?
Pergunta 3 de 3
No robô real, como conferir um parâmetro identificado?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.