Simulando o reBotArm com o Isaacsim
Introdução
reBot-Isaacsim é um projeto de simulação NVIDIA Isaac Sim projetado especificamente para o reBotArm. Ele aproveita o mecanismo de física de alta fidelidade do Isaac Sim para replicar com precisão as características cinemáticas e a lógica de coordenação da garra do braço robótico em um ambiente virtual, fornecendo um ambiente independente apenas de simulação para desenvolvimento de algoritmos de controle, verificação de planejamento de trajetória e teste de protocolos de comunicação.

Requisitos de ambiente
- Sistema operacional: Ubuntu 22.04 LTS / 24.04 LTS (recomendado) ou Windows 11 (requer WSL2)
- GPU: placa de vídeo NVIDIA série RTX (recomendado RTX 3070 ou superior), VRAM ≥ 8GB
- Driver: driver oficial NVIDIA ≥ 535.x, com suporte a CUDA 12.x
- Memória: ≥ 32GB de RAM (cenas do Isaac Sim e simulações físicas usam muita memória)
- Armazenamento: ≥ 100GB de espaço livre em SSD (para instalação do Isaac Sim, cache e assets USD)
Os computadores usados neste wiki estão equipados com GPUs NVIDIA RTX 4080 e executam o sistema operacional Ubuntu 22.04 LTS.
Instalar o Isaacsim
Links e recursos oficiais:
https://docs.isaacsim.omniverse.nvidia.com/6.0.0/installation/quick-install.html
https://docs.isaacsim.omniverse.nvidia.com/6.0.0/installation/download.html#isaac-sim-latest-release
🔧 Método 1: Instalação por binário pré-compilado
💡 Adequado para a maioria dos usuários, não é necessário compilar, pronto para uso imediato.
Download e descompactação
Baixe isaac-sim-standalone-6.0.0-linux-x86_64.zip do site oficial da NVIDIA.
mkdir -p ~/isaacsim
cd ~/Downloads
unzip isaac-sim-standalone-6.0.0-linux-x86_64.zip -d ~/isaacsim
cd ~/isaacsim
./post_install.sh
Configurar variáveis de ambiente
Adicione o seguinte a ~/.bashrc ou ~/.zshrc:
export ISAACSIM_PATH="${HOME}/isaacsim"
export ISAACSIM_PYTHON_EXE="${ISAACSIM_PATH}/python.sh"
export ISAACSIM_ROOT="${HOME}/isaacsim"
Em seguida, execute source ~/.bashrc para que tenha efeito.
Verificação de inicialização
${ISAACSIM_PATH}/isaac-sim.sh
Na primeira inicialização, os shaders serão armazenados em cache, o que pode levar de 5 a 10 minutos, portanto, aguarde pacientemente até que a interface gráfica apareça.
⚙️ Método 2: Compilar a partir do código-fonte (recomendado)
💡 Bom para desenvolvedores que precisam ajustar o código subjacente ou depurar recursos centrais.
Instalar dependências
sudo apt update
sudo apt install cmake build-essential git python3-pip
Certifique-se de que CUDA e cuDNN estejam instalados corretamente e correspondam ao driver da sua GPU.
Clonar e compilar
git clone https://github.com/NVIDIA-Omniverse/IsaacSim.git
cd IsaacSim
./build.sh release
O processo de compilação pode levar de 30 a 60 minutos, dependendo do seu hardware.
Executar teste
_build/linux-x86_64/release/isaac-sim.sh
Após uma compilação a partir do código-fonte, aponte ISAACSIM_ROOT para esse diretório de execução para que run_isaacsim_receiver.sh encontre o Isaac Sim:
export ISAACSIM_ROOT="$PWD/_build/linux-x86_64/release"
Baixar o projeto
Este repositório referencia a biblioteca de controle upstream reBotArm_control_py como git submodule. Clone com os submódulos:
git clone --recurse-submodules https://github.com/Seeed-Projects/reBot-Isaacsim.git
Se você já clonou o repositório e third_party/reBotArm_control_py estiver vazio:
git submodule update --init --recursive
Instale as dependências do sender na raiz do repositório (run_sender.sh e uv run usam o workspace uv da raiz):
cd reBot-Isaacsim
uv sync
Alternar a configuração de hardware para RS
O asset do Isaac Sim deste repositório é RS (usd/RS-rebot-dev-arm). O rebotarm.yaml upstream usa DM por padrão. Tanto RebotArm() quanto load_robot_model() leem este arquivo, então compensação de gravidade, mapeamento somente leitura, IK e Traj precisam de RS primeiro; se ficar em DM, o protocolo dos motores não coincidirá e o Pinocchio carregará o URDF de DM. Isso apenas suja o working tree do submodule — não faça commit:
cd reBotArm_Isaacsim
python set_hw_rs.py
Em caso de sucesso, imprime .../config/rebotarm.yaml -> rebotarm_rs.yaml.
Visão geral dos componentes funcionais
Este projeto fornece vários senders para atender a diferentes cenários de uso:
| Componente | Descrição |
|---|---|
gravity_joint_sender | Modo de compensação de gravidade + alça: para braços modificados (garra removida, alça acoplada); a compensação vem do GravityCompensation upstream e este repositório apenas espelha os ângulos das juntas no Isaac Sim |
isaacsim_ik_sender | Modo de cinemática inversa (IK): insira a pose do efetuador final, use o solucionador de IK para obter os ângulos das juntas e envie-os para o Isaac Sim |
isaacsim_traj_sender | Modo de planejamento de trajetória (Traj): adiciona planejamento de trajetória no espaço de juntas (perfil de tempo MIN_JERK) sobre o IK para obter controle de movimento suave |
isaacsim_joint_test_sender | Modo de teste de juntas: envia trajetórias de ângulos de juntas predefinidas sem um robô real para verificar se o receptor e a comunicação do Isaac Sim estão funcionando corretamente |
joint_reader_sender | Modo de mapeamento Real-para-Sim: apenas leitura dos ângulos das juntas e mapeamento para o Isaac Sim, ideal para uso com outros projetos de controle (por exemplo, sincronizar no Isaac Sim o robô real executando outras tarefas para visualização) |
Estrutura de diretórios
reBot-Isaacsim/
├── pyproject.toml # Configuração do workspace uv
├── README.md
├── README_EN.md
├── README_ES.md
├── reBotArm_Isaacsim/ # Diretório principal de exemplos
│ ├── gravity_joint_sender.py # Modo alça (GravityCompensation upstream + UDP)
│ ├── isaacsim_ik_sender.py # Modo de cinemática inversa (controle IK)
│ ├── isaacsim_traj_sender.py # Modo de planejamento de trajetória (IK + trajetória no espaço de juntas)
│ ├── isaacsim_joint_test_sender.py # Modo de teste de juntas (trajetória predefinida, sem hardware)
│ ├── joint_reader_sender.py # Modo de mapeamento Real-to-Sim (somente leitura, visualização sincronizada)
│ ├── isaacsim_joint_receiver.py # Receptor do Isaac Sim (sincronização de ângulos das juntas)
│ ├── live_sync.py # Script auxiliar com instruções de inicialização
│ ├── set_hw_rs.py # Aponta o YAML de hardware do submodule para RS (local; não fazer commit)
│ ├── run_sender.sh # Inicia o sender
│ └── run_isaacsim_receiver.sh # Inicia o receptor do Isaac Sim
├── .gitmodules
├── third_party/
│ └── reBotArm_control_py/ # git submodule: biblioteca de controle upstream
└── usd/
└── RS-rebot-dev-arm/
└── RS-rebot-dev-arm.usda # Asset do robô para Isaac Sim
Inicialização (modo de dois terminais)
São necessários dois terminais separados. O Terminal 1 executa o receptor do Isaac Sim, enquanto o Terminal 2 executa o sender apropriado, dependendo da funcionalidade desejada.
Terminal 1 — Iniciar o receptor do Isaac Sim (compartilhado por todos os modos)
cd reBotArm_Isaacsim
./run_isaacsim_receiver.sh
Comportamento esperado:
- Iniciar a interface gráfica do Isaac Sim
- Carregar o plano de chão e os assets USD do braço robótico
- Escutar pacotes UDP em
127.0.0.1:5005 - Aguardar a conexão de um sender
Terminal 2 — Iniciar o sender apropriado
Sempre inicie primeiro o receptor e depois o sender.
Alguns modos exigem um braço robótico físico. Configure o adaptador USB-para-CAN conforme mostrado abaixo.

# Check the CAN interface status
ip link show can0
# Bring up the CAN interface with a bitrate of 1000000
sudo ip link set can0 up type can bitrate 1000000 restart-ms 100
① Modo de teste de juntas (isaacsim_joint_test_sender)
Nenhum hardware físico é necessário. Uma trajetória de juntas predefinida é enviada continuamente para verificar a comunicação com o receptor do Isaac Sim.
cd reBotArm_Isaacsim
uv run python isaacsim_joint_test_sender.py
O sender interpola continuamente entre várias configurações de juntas predefinidas e as transmite para o Isaac Sim. Não lê o YAML de hardware, então nem set_hw_rs.py nem CAN são necessários.
② Modo de cinemática inversa (isaacsim_ik_sender)
Insira uma pose do efetuador final (posição/orientação). O solucionador de IK calcula a configuração das juntas e move o braço robótico no Isaac Sim. load_robot_model() lê o rebotarm.yaml do submodule, então mude para RS primeiro:
cd reBotArm_Isaacsim
python set_hw_rs.py
uv run python isaacsim_ik_sender.py
Formato de entrada (um comando por linha):
x y z # Position (meters), keep current orientation
x y z r p y # Position + orientation (meters/degrees)
q j1 j2 j3 j4 j5 j6 # Send joint angles directly (degrees)
gripper <0~1> # Update gripper only
③ Modo de planejamento de trajetória (isaacsim_traj_sender)
Adiciona planejamento de trajetória no espaço de juntas (MIN_JERK) sobre o IK para um movimento suave do robô. Também usa load_robot_model() contra esse YAML, então mude para RS primeiro:
cd reBotArm_Isaacsim
python set_hw_rs.py
uv run python isaacsim_traj_sender.py
Formato de entrada (um comando por linha):
x y z # Position (meters)
x y z r p y # Position + orientation (meters/degrees)
q j1 j2 j3 j4 j5 j6 # Send joint angles directly (degrees)
gripper <0~1> # Update gripper only
speed <scale> # Adjust trajectory duration scaling
resync # Re-read the current joint state from Isaac Sim
④ Modo de manuseio com compensação de gravidade (gravity_joint_sender)
Projetado para braços robóticos modificados (garra removida e alça instalada). O robô pode ser guiado manualmente enquanto o Isaac Sim segue o movimento.
cd reBotArm_Isaacsim
python set_hw_rs.py
./run_sender.sh
Comportamento esperado:
set_hw_rs.pyaponta orebotarm.yamldo submodule pararebotarm_rs.yamlpara que motores e o modelo de gravidade usem o mesmo YAML (alteração local; não fazer commit)- O braço físico conecta e inicia o
GravityCompensationupstream (mesmo MIT + feed-forwardg(q)que oexample/9) - O braço pode ser movido livremente à mão
- Este script apenas encaminha os ângulos das juntas para o Isaac Sim via UDP a 60 Hz
- Não execute também o
example/9upstream ao mesmo tempo; os dois processos disputariam o CAN
⑤ Modo de mapeamento Real-para-Sim (joint_reader_sender)
Lê apenas os ângulos das juntas e espelha o estado do robô físico no Isaac Sim. Este modo é destinado à visualização enquanto o robô real é controlado por outra aplicação. RebotArm() lê o rebotarm.yaml do submodule, então mude para RS primeiro:
cd reBotArm_Isaacsim
python set_hw_rs.py
uv run python joint_reader_sender.py
Comportamento esperado:
set_hw_rs.pyaltera a configuração dos motores para RS (alteração local; não fazer commit)- Ler apenas os ângulos das juntas (modo de feedback passivo), sem enviar nenhum comando de controle
- Transmitir continuamente os ângulos das juntas via UDP a 60 Hz
- Visualizar o robô físico no Isaac Sim enquanto ele é controlado por outro projeto
Protocolo de comunicação
UDP JSON na porta 127.0.0.1:5005.
Payload do sender (por frame):
{
"sequence": 123,
"timestamp": 1718000000.123,
"joint_positions": [0.0, 0.1, 0.2, -0.1, 0.0, -0.02],
"gripper_position": 0.05
}
| Campo | Tipo | Descrição |
|---|---|---|
sequence | int | Número de sequência de quadro incremental |
timestamp | float | Timestamp Unix (segundos) |
joint_positions | float[6] | Primeiras seis posições de juntas (rad) |
gripper_position | float | Alvo de posição dos dedos da garra (m); cada sender calcula com o próprio mapeamento (veja abaixo) |
Pipeline de controle do gripper:
O receptor aplica o gripper_position recebido diretamente como alvo de posição das duas juntas prismáticas dos dedos, recortado por dedo para [0, limite superior] (limites superiores do USD: 0,05 m em ambos os dedos; os dedos são acionados 1:1 por um único motor através de um pinhão). Não há escala extra no lado do receptor. Os senders convertem a entrada para gripper_position da seguinte forma:
| Sender | Conversão para gripper_position (m) |
|---|---|
gravity_joint_sender | gripper_q × 0.03 (GRIPPER_POSITION_SCALE = 0.03) |
joint_reader_sender | gripper_q × 0.007 (GRIPPER_POSITION_SCALE = 0.007) |
isaacsim_traj_sender | ratio × 0.045 (entrada gripper <0~1>, recortado para 0,045 m) |
isaacsim_ik_sender | ratio ∈ [0, 1] bruto enviado como metros, de modo que qualquer ratio ≥ o limite superior de um dedo abre esse dedo por completo |
Parâmetros de Configuração
Remetente (gravity_joint_sender.py)
| Parâmetro | Padrão | Descrição |
|---|---|---|
| YAML de hardware | set_hw_rs.py → rebotarm_rs.yaml | RebotArm() lê config/rebotarm.yaml do submodule; motores e Pinocchio compartilham |
ARM_JOINT_COUNT | 6 | Número de juntas do braço |
DEFAULT_PORT | 5005 | Porta UDP |
DEFAULT_SEND_HZ | 60.0 | Frequência de transmissão (Hz) |
GRIPPER_POSITION_SCALE | 0.03 | Fator de conversão do ângulo do gripper para posição |
position_alpha | 0.2 | Coeficiente do filtro passa-baixa |
Receptor (isaacsim_joint_receiver.py)
| Parâmetro | Padrão | Descrição |
|---|---|---|
ARM_JOINT_COUNT | 6 | Número de juntas do braço |
DEFAULT_PORT | 5005 | Porta UDP |
DEFAULT_RENDER_HZ | 120.0 | Frequência de renderização da simulação (Hz) |
ROBOT_PRIM_PATH | /World/reBotArm | Caminho do Prim do robô no Isaac Sim |
ASSET_RELATIVE_PATH | usd/RS-rebot-dev-arm/RS-rebot-dev-arm.usda | Caminho relativo para o asset USD |
Solução de Problemas
OSError: [Errno 98] Address already in use
A porta 5005 já está ocupada. Encontre e finalize o processo que está usando a porta:
# Find the process using port 5005
sudo lsof -i :5005
# Terminate the process (replace PID with the actual process ID)
kill <PID>
Asset do Isaac Sim Não Encontrado
Verifique se o asset USD existe e se REPO_ROOT está configurado corretamente:
ls usd/RS-rebot-dev-arm/RS-rebot-dev-arm.usda
Barramento CAN Não Pronto
Certifique-se de que a interface CAN está ativa e configurada com o bitrate correto:
can_restart can0
# Verify the bitrate
ip -details link show can0 | grep bitrate
Ângulos das Juntas Não Sincronizam
- Verifique se tanto o remetente quanto o receptor estão usando a porta
5005. - Verifique se o log do remetente exibe continuamente
[send]. - Verifique se o log do receptor exibe continuamente
[recv]. - Tente
isaacsim_joint_test_sender.pypara descartar problemas relacionados ao hardware.
Componentes e Ambientes Python
| Componente | Ambiente Python | Script de Inicialização |
|---|---|---|
| Remetente (Robô Físico) | Ambiente uv reBotArm_control_py | run_sender.sh |
| Remetente (Modo de Teste) | Ambiente uv reBotArm_control_py | isaacsim_joint_test_sender.py |
| Receptor | Python oficial do Isaac Sim (python.sh) | run_isaacsim_receiver.sh |
Suporte Técnico e Discussão de Produto
Obrigado por escolher nossos produtos! Estamos aqui para oferecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.