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

Aula 6 · 18 min

Sim2sim como portão antes do robô

Antes de qualquer robô, a política tem de passar num segundo simulador e no mesmo caminho de mensagens que o robô usa. É o fluxo oficial do unitree_rl_lab: treinar no Isaac Lab, validar no unitree_mujoco, só então o G1. Nesta aula você monta esse portão em três etapas, com DDS de verdade, e vê o erro que mais derruba políticas nessa travessia.

Começar a aula
Dois monitores lado a lado com o mesmo robô humanoide simulado andando e um switch de rede entre eles.

Nesta aula você vai

  1. 1As três etapas do portão e o critério de cada uma
  2. 2unitree_mujoco + unitree_sdk2_python + CycloneDDS: rt/lowcmd e rt/lowstate
  3. 3O erro número 1: a ordem das juntas (joint_ids_map)
  4. 4Aviso que é do simulador, não da política

Objetivo: passar a política por um portão de três etapas: outro modelo do robô e o caminho DDS de mensagens do fabricante.

01O portão em três etapas

Clique em cada bloco. Reprovou numa etapa, não sobe.

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

Um estudo de 2026 com o G1 em ações de canteiro de obras avaliou cada ação em dois motores de física antes do robô, e só as que passaram foram ao G1 físico (arXiv 2608.01600, segundo o robotica-real2sim, conferido em 14/10/2026).

02O que a travessia costuma quebrar

Achados reais da montagem deste portão (19/10/2026). Clique em cada um.

1. Ordem das juntas

O Isaac Lab ordena as juntas de um jeito; o SDK do robô, de outro. O deploy.yaml traz o mapa (joint_ids_map), e cada lista vem numa ordem: kp e kd na ordem do robô, pose padrão e ações na ordem do Isaac Lab.

Errar isso derruba o robô em 1 s, nos dois simuladores (erro comum abaixo).

03Preparar o caminho do fabricante (uma vez)

CycloneDDS 0.10.2, unitree_sdk2_python e unitree_mujoco, fixados nos commits testados. Precisa de cmake e de um compilador C se o pip não achar wheel.

Terminal · DDS + SDK + simulador da Unitree
F=${FTH:-$HOME/fth}; cd $F && . .venv/bin/activate
pip install -q cyclonedds==0.10.2 2>/dev/null || {
  [ -d cyclonedds ] || git clone -q --filter=blob:none -b releases/0.10.x https://github.com/eclipse-cyclonedds/cyclonedds
  git -C cyclonedds checkout -q 5041f35
  cmake -S cyclonedds -B cyclonedds/build -DCMAKE_INSTALL_PREFIX=$F/cyclonedds/install -DBUILD_EXAMPLES=OFF > /dev/null
  cmake --build cyclonedds/build --target install -j 4 > /dev/null 2>&1
  export CYCLONEDDS_HOME=$F/cyclonedds/install && pip install -q cyclonedds==0.10.2; }
git -C cyclonedds log -1 --format="cyclonedds (C) %H (%ad)" --date=short 2>/dev/null | sed -E 's/([0-9a-f]{7})[0-9a-f]{33}/\1/'
[ -d unitree_sdk2_python ] || git clone -q https://github.com/unitreerobotics/unitree_sdk2_python
git -C unitree_sdk2_python checkout -q 814556d && pip install -q -e unitree_sdk2_python pygame
[ -d unitree_mujoco ] || git clone -q https://github.com/unitreerobotics/unitree_mujoco
git -C unitree_mujoco checkout -q 1eb6642 && git -C unitree_mujoco log -1 --format='unitree_mujoco %h (%ad)' --date=short
python3 -c "import importlib.metadata as m, unitree_sdk2py; print('cyclonedds', m.version('cyclonedds'), '· unitree_sdk2py ok')"
Exemplo do repositório
cyclonedds (C) 5041f35 (2026-03-22)
unitree_mujoco 1eb6642 (2026-09-07)
cyclonedds 0.10.2 · unitree_sdk2py ok

Três linhas. Na primeira vez nesta máquina (aarch64), a compilação do CycloneDDS levou 1 a 2 minutos.

04Rodar o portão

Sem --dds, as etapas 1 e 2 (determinísticas, ~1 min). Com --dds, a etapa 3 em tempo real. --passo muda o passo do unitree_mujoco.

Terminal · etapas 1 e 2 (passo de 5 ms do unitree_mujoco)
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py; echo "saída: $?"
Terminal · as três etapas, com DDS
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py --passo 0.001 --dds 2>/dev/null; echo "saída: $?"
Terminal · o erro comum: ordem das juntas
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py --ordem sdk; echo "saída: $?"
Exemplo do repositório
política: unitree_rl_lab velocity v0 · ordem das juntas: isaac · 0.5 m/s por 10 s
1 Menagerie (MuJoCo, PD no MJCF)     passou · andou 4.7 m
2 unitree_mujoco (passo 5 ms)        passou · andou 4.8 m
                                     aviso: braços no limite de torque em 99% do tempo
PORTÃO: passou (2 de 2 etapas)
saída: 0

Passou, com o aviso dos braços no passo de 5 ms.

05Prática

Nada vai ao robô sem passar aqui.

E1 · Caminho do fabricante pronto

10 min

Rode a preparação do DDS, do SDK e do unitree_mujoco.

Pronto quando: o bloco termina em cyclonedds 0.10.2 · unitree_sdk2py ok.

E2 · Portão com DDS

3 min

Rode as três etapas com passo de 1 ms.

Pronto quando: python3 kit/portao_sim2sim.py --passo 0.001 --dds 2>/dev/null; echo "saída: $?" → PORTÃO: passou (3 de 3 etapas) e saída: 0.

E3 · O portão pega o erro

3 min

Rode com a ordem das juntas errada e anote em que etapa e em quanto tempo ele reprova.

Pronto quando: python3 kit/portao_sim2sim.py --ordem sdk; echo "saída: $?" → PORTÃO: reprovou — caiu em t = 1.0 s e saída: 1.

06Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 4

Por que a etapa 3 roda o robô num processo separado e conversa por DDS?competência

07Em três frases

PortãoMenagerie, unitree_mujoco e DDS em tempo real: três etapas, mesmos critérios.
Erro nº 1Ordem das juntas errada derruba em 1 s; confira o joint_ids_map.
AvisoSepare o que é do simulador (passo, integrador) do que é da política.

Para ir além

Aula anteriorPróxima aula