FTH 4 · Operar un humanoide real|INEMA.CLUB-PRO

Clase 4 · 20 min

Comandar a bajo nivel sin romper nada

Mandar un objetivo a 29 motores es fácil; lo difícil es lo que pasa cuando el objetivo está lejos, fuera del límite o deja de llegar. En esta lección comandas el G1 suspendido con tres protecciones (límite del MJCF, rampa y watchdog) y ves, en el mismo script, cómo el escalón pide más torque del que tiene el motor.

Empezar la clase
Rodilla y pierna de un robot humanoide suspendido en un pórtico, con un cable hasta una placa de driver de motor en el banco de trabajo.

En esta clase vas a

  1. 1Qué va en un MotorCmd_: mode, q, dq, tau, kp, kd
  2. 2Rampa × escalón: el torque que pide cada uno
  3. 3Watchdog: un comando viejo se vuelve amortiguación
  4. 4CRC y mode_machine, que el robot real exige

Objetivo: comandar las 29 articulaciones del G1 con límite, rampa y watchdog, y ver cómo el comando en escalón pide torque por encima del límite.

01Tres protecciones entre la policy y el motor

Haz clic en cada bloque.

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

El watchdog del kit es tuyo, en tu controlador. Lo que el firmware del robot hace sin comando no está documentado en el SDK: no cuentes con eso. Y corre en el mismo proceso del envío: si el proceso muere, lo que sostiene al robot es la parada de emergencia física y el pórtico.

02Qué lleva un comando

Haz clic en cada parte.

1. MotorCmd_

mode (1 habilita, 0 deshabilita), q (objetivo), dq (velocidad objetivo), tau (torque sumado), kp y kd. No hay Ki ni un modo global de "posición" o "torque".

Rígido = kp alto; solo torque = kp y kd en cero y tau completado; amortiguación = kp en cero y kd pequeño.

Ganancias del ejemplo oficialPiernas 60/60/60/100/40/40, cintura 60/40/40, brazos 40; kd 1 (rodilla 2). Punto de partida del ejemplo, no "estándar del robot".

03Rampa, límites y watchdog en el G1 suspendido

6 s de comando: rampa de 3 s hasta la pose de trabajo (rodillas y codos doblados), se mantiene, y en t = 4,5 s la "política" se traba a propósito.

Terminal · simulador + rampa
F=${FTH:-$HOME/fth}; cd $F/operar && . $F/.venv/bin/activate
python3 kit/sim.py --s 9 --suspenso &
python3 kit/rampa.py; echo "saída: $?"
wait
Fragmento · kit/rampa.py
    idade = t_ciclo - comp["carimbo"]
    if not amortecendo and idade > IDADE_MAX:
        amortecendo = True
        print(f"política sem resposta desde t = {a.trava_em:.1f} s")
        print(f"watchdog: comando velho há mais de {IDADE_MAX * 1000:.0f} ms → amortecimento ativado (kp=0, kd={KD_AMORTECER:g})")
    cmd.mode_pr, cmd.mode_machine = 0, modo
    for i in range(op.N):
        m_ = cmd.motor_cmd[i]
        m_.mode, m_.dq, m_.tau = 1, 0.0, 0.0
        if amortecendo:
            m_.q, m_.kp, m_.kd = 0.0, 0.0, KD_AMORTECER
        else:
            m_.q, m_.kp, m_.kd = comp["alvo"][i], op.KP[i], op.KD[i]
Terminal · el error común: escalón
F=${FTH:-$HOME/fth}; cd $F/operar && . $F/.venv/bin/activate
python3 kit/sim.py --s 9 --suspenso &
python3 kit/rampa.py --sem-rampa; echo "saída: $?"
wait
Ejemplo del repositorio
simulador: G1 29 motores · DDS domínio 1 em lo · 9 s · suspenso: sim
estado recebido: 29 juntas · pose inicial lida · mode_machine = 0
limites: 29/29 alvos já dentro da faixa do MJCF (margem 0.05 rad), 0 recortados
política sem resposta desde t = 4.5 s
watchdog: comando velho há mais de 100 ms → amortecimento ativado (kp=0, kd=2)
rampa de 3 s · todas as juntas pediram menos de 50 % do torque máximo
juntas que pediram acima do limite: 0
ciclo de envio: 2 ms · watchdog: amortecimento ativado
saída: 0
simulador: fim em t = 9.0 s · robô suspenso (pés fora do chão)

Con rampa, todas las articulaciones quedan por debajo de la mitad del tope. La política se traba, el watchdog ve envejecer el comando y amortigua.

04Práctica

Las tres protecciones, medidas.

E1 · Rampa con watchdog

5 min

Ejecuta el bloque de la rampa y ubica en la salida el momento en que actúa el watchdog.

Listo cuando: python3 kit/rampa.py; echo "saída: $?" → juntas que pediram acima do limite: 0, watchdog: amortecimento ativado y saída: 0.

E2 · Ver cómo falla el escalón

5 min

Ejecuta el bloque del error común y di qué articulación pasó más el límite y por qué justo esa.

Listo cuando: python3 kit/rampa.py --sem-rampa; echo "saída: $?" → juntas que pediram acima do limite: 4 y saída: 1.

E3 · Leer el límite en el MJCF

5 min

Encuentra en el MJCF del simulador el tope de torque de la muñeca que se pasó en el escalón.

Listo cuando: grep -c 'ctrlrange="-5 5"' ~/fth/unitree_mujoco/unitree_robots/g1/g1_29dof.xml → 4 (pitch y yaw de las dos muñecas, tope de 5 N·m).

05Prueba de la clase

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

Pregunta 1 de 4

¿Qué campo NO existe en un MotorCmd_ del G1?competencia

06En tres frases

LímiteObjetivo recortado al rango del MJCF; torque con tope en el ctrlrange.
RampaDel punto actual al objetivo en segundos, nunca de golpe.
WatchdogUn comando viejo se convierte en amortiguación y no se reactiva solo.

Para ir más allá

Clase anteriorSiguiente clase