FTH 2 · Do simulador ao chão|INEMA.CLUB-PRO

Aula 3 · 17 min

Identificação de sistema: medir para modelar

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
Robô humanoide suspenso por cintas num pórtico de aço, pés fora do chão, com cabos ligando a perna a um equipamento de medição.

Nesta aula você vai

  1. 1O ensaio de bancada: robô pendurado, perna em varredura de 0,5 a 3 Hz
  2. 2O toolbox mujoco.sysid (MuJoCo 3.5+): Parameter, ModelSequences, optimize
  3. 3Erro do modelo caindo de 8,16° para menos de 4° nas posições
  4. 4Por que identificar só o kp dá errado quando falta algo no modelo

Objetivo: identificar o kp e o kd do atuador num ensaio de bancada com o toolbox mujoco.sysid e conferir contra o valor escondido.

01Do ensaio ao parâmetro

Clique em cada bloco.

Clique em cada bloco do diagrama para ver o que ele faz.

Cada ensaio identifica o que ele excita. A perna no ar não diz nada sobre o atrito do pé.

02O que o toolbox faz por você

mujoco.sysid chegou no MuJoCo 3.5.0 (12/02/2026); aqui, 3.16.0 com o extra [sysid]. Clique em cada etapa.

1. Parameter

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.

03Instalar o toolbox e coletar o ensaio

O extra [sysid] traz scipy, matplotlib e plotly. O coletar.py grava o ensaio do "robô real" pendurado.

Terminal · mujoco[sysid]
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__)"
Terminal · ensaio de bancada
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/coletar.py --saida $F/log.npz
Exemplo do repositório
ensaio 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.

04Identificar kp e kd

Parte do modelo nominal (kp = kd = 1,0 × o do deploy.yaml) e ajusta os dois.

Terminal · sysid
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/sysid.py $F/log.npz --revelar; echo "saída: $?"
Terminal · só o kp (o erro comum)
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]}"
Terminal · o mesmo ensaio no mundo "sim" (E3)
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 -4
Exemplo do repositório
log: ~/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.

05Prática

Medir o atuador do "robô real".

E1 · Ensaio gravado

5 min

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°.

E2 · kp e kd identificados

5 min

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.

E3 · O ensaio que mente

10 min

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.

06Teste da aula

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

07Em três frases

EnsaioRobô pendurado, varredura de 0,5 a 3 Hz, encoders com ruído: 1.999 amostras em 4 s.
Toolboxmujoco.sysid ajusta kp e kd e traz o kp de volta a ±10 % do escondido.
CuidadoO que falta no modelo vaza para os parâmetros que você deixou livres.

Para ir além

Aula anteriorPróxima aula