E1 · Caminho do fabricante pronto
10 minRode a preparação do DDS, do SDK e do unitree_mujoco.
Pronto quando: o bloco termina em cyclonedds 0.10.2 · unitree_sdk2py ok.
Aula 6 · 18 min
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
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.
Clique em cada bloco. Reprovou numa etapa, não sobe.
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).
Achados reais da montagem deste portão (19/10/2026). Clique em cada um.
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).
O unitree_mujoco vem com passo de 5 ms e integrador de Euler. Com o kd = 10 do punho (limite de 5 N·m no pitch e no yaw), o PD oscila e o braço fica no limite de torque o tempo todo. A marcha não sofre; o portão dá aviso, não reprova.
Com 1–2 ms, o aviso some. É do simulador, não da política: confira antes de mexer no treino.
A interface lo não faz multicast, e sem multicast dois processos DDS não se acham. O kit acrescenta à configuração da Unitree um par fixo em 127.0.0.1 (s2r.iniciar_dds) só quando a interface é lo.
No robô, a interface é a placa de rede ligada a ele; o domínio e os tópicos são os mesmos.
O SDK pede o pacote Python cyclonedds==0.10.2. Em aarch64 não há wheel: o pip falha sem a biblioteca C. O bloco compila a branch releases/0.10.x (5041f35) com cmake, em 1–2 min.
A tag 0.10.2 do C abortou aqui com "buffer overflow detected". Em x86_64 o pip costuma achar a wheel (relatado, não testado aqui).
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.
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')"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.
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.
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py; echo "saída: $?"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: $?"F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py --ordem sdk; echo "saída: $?"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: 0Passou, com o aviso dos braços no passo de 5 ms.
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 1 ms) passou · andou 4.7 m 3 unitree_mujoco + DDS (tempo real) passou · andou 5.3 m · política a 50 Hz PORTÃO: passou (3 de 3 etapas) saída: 0
A etapa 3 roda em tempo real: a distância e o aviso dos braços mudam um pouco de uma rodada para outra. O que vale é a última linha.
política: unitree_rl_lab velocity v0 · ordem das juntas: sdk · 0.5 m/s por 10 s
1 Menagerie (MuJoCo, PD no MJCF) reprovou · andou -0.1 m e caiu · caiu em t = 1.0 s; pernas/cintura no limite de torque em 3% do tempo (máx. 1 %)
aviso: braços no limite de torque em 6% do tempo
2 unitree_mujoco (passo 5 ms) reprovou · andou -0.3 m e caiu · caiu em t = 1.0 s; pernas/cintura no limite de torque em 6% do tempo (máx. 1 %)
aviso: braços no limite de torque em 98% do tempo
PORTÃO: reprovou — caiu em t = 1.0 s
saída: 1Com --ordem sdk, o kit usa a pose padrão e as ações como se já estivessem na ordem do robô. O G1 cai em 1 s nos dois modelos. Se a sua política cai assim que começa, confira o mapa antes de qualquer outra coisa.
Nada vai ao robô sem passar aqui.
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.
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.
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.
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
Pergunta 2 de 4
A política cai em 1 s nos dois modelos, logo no começo. Qual a primeira suspeita?
Pergunta 3 de 4
Na etapa 2 com passo de 5 ms, os braços ficam no limite de torque, mas a marcha passa. O que fazer?
Pergunta 4 de 4
Por que a interface lo precisou de um par fixo em 127.0.0.1?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.