FTH 0 · El cuerpo del humanoide|INEMA.CLUB-PRO

Clase 5 · 15 min

Sentir el propio cuerpo: IMU, encoders, fuerza y tacto

Un humanoide de pie siempre está cayendo un poco y corrigiéndose. Para eso necesita saber cuánto está inclinado, dónde está cada articulación y cuánto peso hay en cada pie. En esta clase lees los sensores que el MJCF del G1 declara, agregas los que faltan sin editar el archivo y comparas la lectura con el peso del robot.

Comenzar la lección
Pie de robot humanoide apoyado en una placa de fuerza de metal en el suelo del laboratorio, con cables finos que salen de la placa.

En esta lección vas a

  1. 1Propiocepción × percepción: qué responde cada sensor
  2. 2Por qué el acelerómetro en reposo marca 9,8
  3. 3Agregar un sensor con MjSpec, sin tocar el archivo de Menagerie
  4. 4Fuerza en el tobillo × fuerza en el suelo: la diferencia es el pie

Objetivo: leer la IMU y la fuerza en cada pie del G1 parado y comprobar que la suma de los contactos con el suelo coincide con el peso del robot.

01Lo que siente el humanoide

Los cuatro primeros responden "cómo está mi cuerpo"; el último, "qué hay alrededor". Haz clic en cada uno.

Haz clic en cada bloque del diagrama para ver qué hace.

Los sensores que el MJCF no declara no existen en la simulación hasta que los agregues.

02Cuatro lecturas para no equivocarte

Haz clic en cada una.

1. 9,8 parado

El acelerómetro mide la fuerza que sostiene al sensor, no el movimiento: parado en el suelo, lee 9,8 m/s² hacia arriba. En caída libre, leería cero.

Así es como la IMU sabe dónde queda "abajo" y, de ahí, la inclinación.

03Leer y agregar sensores

El fragmento muestra cómo el script agrega los tres sensores; el bloque corre 1 s con el G1 parado.

Fragmento 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
Ejemplo del repositorio
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

Giroscopios en cero, acelerómetros en 9,8 hacia arriba, inclinación cercana a cero y el peso repartido entre los dos pies.

04Práctica

Lee, comprueba y agrega un sensor tuyo.

E1 · El G1 parado

3 min

Corre el bloque y comprueba las tres líneas finales.

Listo cuando: python3 kit/sensores.py termina en soma dos contatos / peso do robô (327 N): 1.00.

E2 · Más tiempo parado

3 min

Corre con --segundos 3. Si el robot se estuviera deslizando o hundiendo, la razón cambiaría.

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

E3 · Un sensor tuyo

10 min

Copia kit/sensores.py a kit/meus_sensores.py (en la misma carpeta, porque importa el fth.py) y agrega un framequat en el sitio imu_in_torso, con el venv activo.

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

05Prueba de la clase

La explicación aparece después de tu respuesta.

Pregunta 1 de 3

El acelerómetro de la pelvis del G1 parado lee [0, 0, 9.8]. ¿Qué significa eso?competencia

06En tres frases

CuerpoIMU, encoders y fuerza dicen cómo está el cuerpo; cámara y LiDAR dicen qué hay alrededor.
APIEl sensor que falta entra con MjSpec, sin editar Menagerie.
VerificaciónEn reposo, la suma de los contactos es el peso: 327 N en el G1.

Para ir más allá

Clase anteriorSiguiente clase