FTH 0 · O corpo do humanoide|INEMA.CLUB-PRO

Aula 5 · 15 min

Sentir o próprio corpo: IMU, encoders, força e tato

Um humanoide em pé está sempre caindo um pouco e se corrigindo. Para isso ele precisa saber como está inclinado, onde está cada junta e quanto peso há em cada pé. Nesta aula você lê os sensores que o MJCF do G1 declara, acrescenta os que faltam sem editar o arquivo e confere a leitura contra o peso do robô.

Começar a aula
Pé de robô humanoide apoiado numa placa de força de metal no chão do laboratório, com cabos finos saindo da placa.

Nesta aula você vai

  1. 1Propriocepção × percepção: o que cada sensor responde
  2. 2Por que o acelerômetro parado mostra 9,8
  3. 3Acrescentar sensor com MjSpec, sem mexer no arquivo do Menagerie
  4. 4Força no tornozelo × força no chão: a diferença é o pé

Objetivo: ler a IMU e a força em cada pé do G1 parado e conferir que a soma dos contatos com o chão bate com o peso do robô.

01O que o humanoide sente

Os quatro primeiros respondem "como está o meu corpo"; o último, "o que há em volta". Clique em cada um.

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

Sensores que o MJCF não declara não existem na simulação até você acrescentar.

02Quatro leituras para não errar

Clique em cada uma.

1. 9,8 parado

O acelerômetro mede a força que segura o sensor, não o movimento: parado no chão, ele lê 9,8 m/s² para cima. Em queda livre, leria zero.

É assim que a IMU sabe onde é "para baixo" e, daí, a inclinação.

03Ler e acrescentar sensores

O trecho mostra como o script acrescenta os três sensores; o bloco roda 1 s com o G1 parado.

Trecho de kit/sensores.py
spec = mujoco.MjSpec.from_file(str(fth.caminho(MODELO)))
spec.add_sensor(name="orientacao_pelve", type=mujoco.mjtSensor.mjSENS_FRAMEQUAT,
                objtype=mujoco.mjtObj.mjOBJ_SITE, objname="imu_in_pelvis")
for lado, sitio in (("esq", "left_foot"), ("dir", "right_foot")):
    spec.add_sensor(name=f"forca_pe_{lado}", type=mujoco.mjtSensor.mjSENS_FORCE,
                    objtype=mujoco.mjtObj.mjOBJ_SITE, objname=sitio)
m = spec.compile()
Terminal · G1 parado 1 s
F=${FTH:-$HOME/fth}; cd $F/anatomia && . $F/.venv/bin/activate
python3 kit/sensores.py --segundos 1
Exemplo do repositório
G1 parado 1 s · 7 sensores (4 do arquivo + 3 acrescentados)
  imu-torso-angular-velocity         [0. 0. 0.]
  imu-torso-linear-acceleration      [0.  0.  9.8]
  imu-pelvis-angular-velocity        [0. 0. 0.]
  imu-pelvis-linear-acceleration     [0.  0.  9.8]
IMU (pelve): inclinação lateral 0.0° · frente/trás -0.1°
sensor de força no tornozelo: pé esquerdo 158 N · pé direito 157 N
contatos com o chão:          pé esquerdo 164 N · pé direito 163 N
soma dos contatos / peso do robô (327 N): 1.00

Giroscópios em zero, acelerômetros em 9,8 para cima, inclinação perto de zero e o peso dividido entre os dois pés.

04Prática

Ler, conferir e acrescentar um sensor seu.

E1 · O G1 parado

3 min

Rode o bloco e confira as três linhas finais.

Pronto quando: python3 kit/sensores.py termina em soma dos contatos / peso do robô (327 N): 1.00.

E2 · Mais tempo parado

3 min

Rode com --segundos 3. Se o robô estivesse escorregando ou afundando, a razão mudaria.

Pronto quando: python3 kit/sensores.py --segundos 3 | tail -1 → soma dos contatos / peso do robô (327 N): 1.00.

E3 · Um sensor seu

10 min

Copie kit/sensores.py para kit/meus_sensores.py (na mesma pasta, porque ele importa o fth.py) e acrescente um framequat no sítio imu_in_torso, com o venv ativo.

Pronto quando: cd ~/fth/anatomia && python3 kit/meus_sensores.py | head -1 → G1 parado 1 s · 8 sensores (4 do arquivo + 4 acrescentados).

05Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 3

O acelerômetro da pelve do G1 parado lê [0, 0, 9.8]. O que isso significa?competência

06Em três frases

CorpoIMU, encoders e força dizem como o corpo está; câmera e LiDAR dizem o que há em volta.
APISensor que falta entra pela MjSpec, sem editar o Menagerie.
ConferênciaParado, a soma dos contatos é o peso: 327 N no G1.

Para ir além

Aula anteriorPróxima aula