Saltar al contenido principal

Controlar reBot Arm B601 con NemoClaw en Nvidia Jetson Thor

1. Descripción general del proyecto

NVIDIA NemoClaw es una pila de referencia de código abierto que simplifica la ejecución de asistentes OpenClaw siempre activos de forma más segura. Este wiki explica cómo desplegar NemoClaw en Jetson Thor y conectar las capacidades de reBot Arm B601 al flujo de trabajo del agente NemoClaw, formando un bucle cerrado de: comprensión semántica + detección visual + ejecución robótica.

  • NemoClaw: Framework local de agente/control para orquestación de tareas y enrutamiento de comandos.
  • Nemotron3: Capacidad de modelo opcional para comprensión de intención y toma de decisiones de alto nivel.
  • Nvidia Jetson Thor: Plataforma de cómputo local para inferencia, servicios backend y controladores de dispositivos.
  • reBot Arm B601: brazo robótico para agarre y colocación.

2. Requisitos de hardware

reBot Arm B601 NVIDIA® Jetson AGX Thor™ Developer Kit

3. Conexión de hardware

  1. Ensambla y configura el brazo robótico.
  2. Conecta el adaptador USB-a-CAN, la cámara USB y el brazo robótico a los puertos USB Type-A de Jetson Thor.
info

Los dispositivos Jetson pueden proporcionar solo dos puertos USB Type-A. Usa un hub USB si necesitas más puertos.

Después de encender, verifica los dispositivos:

ls /dev/ttyACM*
ls /dev/video*

Si todo está conectado correctamente, deberías ver una salida similar a:

4. Configuración del sistema y dependencias

4.1 Instalar Ollama

Si se necesita capacidad LLM local (opcional):

curl -fsSL https://ollama.com/install.sh | sh
ollama pull nemotron3:33b

4.2 Instalar NemoClaw

Instala NemoClaw en Jetson:

curl -fsSL https://www.nvidia.com/nemoclaw.sh | bash

Luego ejecuta nemoclaw onboard para crear una nueva aplicación. Un registro de incorporación interactiva de ejemplo se muestra en:

registro de nemoclaw onboard
seeed@seeed:~$ nemoclaw onboard --no-gpu

NemoClaw Onboarding
===================

[1/8] Preflight checks
──────────────────────────────────────────────────
✓ Docker is running
✓ Container DNS resolution works
✓ Container runtime: docker
✓ Container runtime resources: 14 vCPU / 122.8 GiB
✓ openshell CLI: openshell 0.0.37
Cleaning up previous NemoClaw session...
! No active forward found for port 18789
✓ Previous session cleaned up
✓ Port 8080 available (OpenShell gateway)
✓ NVIDIA GPU detected (NVIDIA Thor, 125771 MB)
✓ Sandbox GPU: disabled by configuration
✓ Memory OK: 125771 MB RAM + 0 MB swap
NVIDIA GPU hardware detected but nvidia-smi is not available.
Install NVIDIA drivers and the Container Toolkit for default GPU passthrough.

[2/8] Starting OpenShell gateway
──────────────────────────────────────────────────
Starting OpenShell Docker-driver gateway...
Gateway log: /home/seeed/.local/state/nemoclaw/openshell-docker-gateway/openshell-gateway.log
✓ Docker-driver gateway is healthy

[3/8] Configuring inference (NIM)
──────────────────────────────────────────────────
Detected local inference option: Ollama


Inference options:
1) NVIDIA Endpoints
2) OpenAI
3) Other OpenAI-compatible endpoint
4) Anthropic
5) Other Anthropic-compatible endpoint
6) Google Gemini
7) Local Ollama (localhost:11434) — running (suggested)
8) Model Router (experimental)

Choose [1]: 7
✓ Using Ollama on localhost:11434 (proxy on :11435)

Ollama models:
1) nemotron3:33b
2) qwen3.5:0.8b
3) nemotron-3-nano:30b
4) Other...

Choose model [3]: 1
Loading Ollama model: nemotron3:33b
Chat Completions API available — OpenClaw will use openai-completions.
Sandbox name (lowercase, starts with a letter, letters/numbers/internal hyphens only, ends with letter/number) [my-assistant]:

──────────────────────────────────────────────────
Review configuration
──────────────────────────────────────────────────
Provider: ollama-local
Model: nemotron3:33b
API key: (not required for ollama-local)
Web search: disabled
Messaging: none
Sandbox name: my-assistant
Note: Sandbox build typically takes 3–8 minutes on this host.
──────────────────────────────────────────────────
Web search and messaging channels will be prompted next.
Apply this configuration? [Y/n]:

[4/8] Setting up inference provider
──────────────────────────────────────────────────
✓ Active gateway set to 'nemoclaw'
✓ Updated provider ollama-local
Gateway inference configured:

Route: inference.local
Provider: ollama-local
Model: nemotron3:33b
Version: 12
Timeout: 180s
Priming Ollama model: nemotron3:33b
✓ Inference route set: ollama-local / nemotron3:33b
Enable Brave Web Search? [y/N]:

[5/8] Messaging channels
──────────────────────────────────────────────────

Available messaging channels:
[1] ○ telegram — Telegram bot messaging
[2] ○ discord — Discord bot messaging
[3] ○ slack — Slack bot messaging

Press 1-3 to toggle, Enter when done:
Skipping messaging channels.

[6/8] Creating sandbox
──────────────────────────────────────────────────
Creating sandbox 'my-assistant' (this takes a few minutes on first run)...
Pinning base image to sha256:1fb69ddbe730...
Building sandbox image...
Building image openshell/sandbox-from:1778663150 from /tmp/nemoclaw-bu...
Step 1/63 : ARG BASE_IMAGE=ghcr.io/nvidia/nemoclaw/sandbox-base@sha256...
Step 2/63 : FROM node:22-trixie-slim@sha256:2d9f5c76c8f4dd36e8f253bee5...
Step 3/63 : ENV NPM_CONFIG_AUDIT=false NPM_CONFIG_FUND=false N...
Step 4/63 : COPY nemoclaw/package.json nemoclaw/package-lock.json nemo...
Step 5/63 : COPY nemoclaw/src/ /opt/nemoclaw/src/
Step 6/63 : WORKDIR /opt/nemoclaw
Step 7/63 : RUN npm ci && npm run build
Step 8/63 : FROM ${BASE_IMAGE}
Step 9/63 : RUN set -eu; apt-mark manual procps e2fsprogs 2>/dev/n...
Step 10/63 : COPY --from=builder /opt/nemoclaw/dist/ /opt/nemoclaw/dist/
Step 11/63 : COPY nemoclaw/openclaw.plugin.json /opt/nemoclaw/
Step 12/63 : COPY nemoclaw/package.json nemoclaw/package-lock.json /op...
Step 13/63 : COPY nemoclaw-blueprint/ /opt/nemoclaw-blueprint/
Step 14/63 : WORKDIR /opt/nemoclaw
Step 15/63 : RUN npm ci --omit=dev
Step 16/63 : RUN set -eu; MIN_VER=$(grep -m 1 'min_openclaw_versio...
Step 17/63 : COPY scripts/rcf_patch.py /usr/local/lib/nemoclaw/rcf_pat...
Step 18/63 : RUN set -eu; OC_DIST=/usr/local/lib/node_modules/open...
Step 19/63 : RUN mkdir -p /sandbox/.nemoclaw/blueprints/0.1.0 && c...
Step 20/63 : COPY scripts/lib/sandbox-init.sh /usr/local/lib/nemoclaw/...
Step 21/63 : COPY scripts/nemoclaw-start.sh /usr/local/bin/nemoclaw-start
Step 22/63 : COPY nemoclaw-blueprint/scripts/*.js /usr/local/lib/nemoc...
Step 23/63 : COPY scripts/codex-acp-wrapper.sh /usr/local/bin/nemoclaw...
Step 24/63 : COPY scripts/generate-openclaw-config.py /usr/local/lib/n...
Step 25/63 : COPY nemoclaw-blueprint/openclaw-plugins/ /usr/local/shar...
Step 26/63 : RUN chmod 755 /usr/local/bin/nemoclaw-start /usr/local/bi...
Step 27/63 : ARG NEMOCLAW_MODEL=nemotron3:33b
Step 28/63 : ARG NEMOCLAW_PROVIDER_KEY=inference
Step 29/63 : ARG NEMOCLAW_PRIMARY_MODEL_REF=inference/nemotron3:33b
Step 30/63 : ARG CHAT_UI_URL=http://127.0.0.1:18789
Step 31/63 : ARG NEMOCLAW_INFERENCE_BASE_URL=https://inference.local/v1
Step 32/63 : ARG NEMOCLAW_INFERENCE_API=openai-completions
Step 33/63 : ARG NEMOCLAW_CONTEXT_WINDOW=131072
Step 34/63 : ARG NEMOCLAW_MAX_TOKENS=4096
Step 35/63 : ARG NEMOCLAW_REASONING=false
Step 36/63 : ARG NEMOCLAW_INFERENCE_INPUTS=text
Step 37/63 : ARG NEMOCLAW_AGENT_TIMEOUT=600
Step 38/63 : ARG NEMOCLAW_AGENT_HEARTBEAT_EVERY=
Step 39/63 : ARG NEMOCLAW_INFERENCE_COMPAT_B64=e30=
Step 40/63 : ARG NEMOCLAW_MESSAGING_CHANNELS_B64=W10=
Step 41/63 : ARG NEMOCLAW_MESSAGING_ALLOWED_IDS_B64=e30=
Step 42/63 : ARG NEMOCLAW_DISCORD_GUILDS_B64=e30=
Step 43/63 : ARG NEMOCLAW_TELEGRAM_CONFIG_B64=e30=
Step 44/63 : ARG NEMOCLAW_DISABLE_DEVICE_AUTH=1
Step 45/63 : ARG NEMOCLAW_BUILD_ID=1778663150303
Step 46/63 : ARG NEMOCLAW_PROXY_HOST=10.200.0.1
Step 47/63 : ARG NEMOCLAW_PROXY_PORT=3128
Step 48/63 : ARG NEMOCLAW_WEB_SEARCH_ENABLED=0
Step 49/63 : ENV NEMOCLAW_MODEL=${NEMOCLAW_MODEL} NEMOCLAW_PROVIDE...
Step 50/63 : WORKDIR /sandbox
Step 51/63 : USER sandbox
Step 52/63 : RUN python3 /usr/local/lib/nemoclaw/generate-openclaw-con...
Step 53/63 : RUN (openclaw doctor --fix > /dev/null 2>&1 || true) ...
Still building sandbox image... (20s elapsed)
Still building sandbox image... (30s elapsed)
Still building sandbox image... (45s elapsed)
Still building sandbox image... (60s elapsed)
Still building sandbox image... (75s elapsed)
Still building sandbox image... (90s elapsed)
Still building sandbox image... (105s elapsed)
Still building sandbox image... (120s elapsed)
Still building sandbox image... (135s elapsed)
Step 54/63 : RUN python3 -c "import json, os; path = os.path.expanduse...
Step 55/63 : USER root
Step 56/63 : RUN set -eu; config_dir=/sandbox/.openclaw; data_...
Step 57/63 : RUN if id gateway >/dev/null 2>&1 && id sandbox >/dev/nul...
Step 58/63 : RUN chown -R sandbox:sandbox /sandbox/.openclaw && ch...
Still building sandbox image... (175s elapsed)
Step 59/63 : RUN if ! grep -q "/tmp/nemoclaw-proxy-env.sh" /etc/profil...
Step 60/63 : RUN sha256sum /sandbox/.openclaw/openclaw.json > /sandbox...
Step 61/63 : RUN chown root:root /sandbox/.nemoclaw && chmod 1755 ...
Step 62/63 : ENTRYPOINT ["/usr/local/bin/nemoclaw-start"]
Step 63/63 : CMD ["/bin/bash"]
Built image openshell/sandbox-from:1778663150
Waiting for sandbox to become ready...
Sandbox reported Ready before create stream exited; continuing.
Waiting for sandbox to become ready...
Waiting for NemoClaw dashboard to become ready...
✓ Dashboard is live
! No active forward found for port 18789
✓ Sandbox 'my-assistant' created

[7/8] Setting up OpenClaw inside sandbox
──────────────────────────────────────────────────
✓ OpenClaw gateway launched inside sandbox

[8/8] Policy presets
──────────────────────────────────────────────────

Policy tier — controls which network presets are enabled:
[ ] Restricted
[ ] Balanced
> [] Open

↑/↓ j/k move Space select Enter confirm


Presets (Open defaults):
> [] [rw] npm
[] [rw] pypi
[] [rw] huggingface
[] [rw] brew
[] [rw] brave
[] [rw] slack
[] [rw] discord
[] [rw] telegram
[] [rw] jira
[] [rw] outlook
[ ] github
[] [rw] local-inference

↑/↓ j/k move Space include r toggle rw Enter confirm

Widening sandbox egress — adding: registry.npmjs.org, registry.yarnpkg.com
✓ Policy version 3 submitted (hash: 77d8e31dfb8c)
✓ Policy version 3 loaded (active version: 3)
Applied preset: npm
Widening sandbox egress — adding: pypi.org, files.pythonhosted.org
✓ Policy version 4 submitted (hash: 6637ad37a7b2)
✓ Policy version 4 loaded (active version: 4)
Applied preset: pypi
Widening sandbox egress — adding: huggingface.co, cdn-lfs.huggingface.co, router.huggingface.co
✓ Policy version 5 submitted (hash: e81bc64dabe1)
✓ Policy version 5 loaded (active version: 5)
Applied preset: huggingface
Widening sandbox egress — adding: formulae.brew.sh, github.com, ghcr.io, pkg-containers.githubusercontent.com, objects.githubusercontent.com, raw.githubusercontent.com
✓ Policy version 6 submitted (hash: d96caba06e19)
✓ Policy version 6 loaded (active version: 6)
Applied preset: brew
Widening sandbox egress — adding: api.search.brave.com
✓ Policy version 7 submitted (hash: be83e02b9a1c)
✓ Policy version 7 loaded (active version: 7)
Applied preset: brave
Widening sandbox egress — adding: slack.com, api.slack.com, hooks.slack.com, wss-primary.slack.com, wss-backup.slack.com
✓ Policy version 8 submitted (hash: 2b5d1cafea38)
✓ Policy version 8 loaded (active version: 8)
Applied preset: slack
Widening sandbox egress — adding: discord.com, gateway.discord.gg, cdn.discordapp.com, media.discordapp.net
✓ Policy version 9 submitted (hash: c4b43ab2846f)
✓ Policy version 9 loaded (active version: 9)
Applied preset: discord
Widening sandbox egress — adding: api.telegram.org
✓ Policy version 10 submitted (hash: 0bd5f6fdf97c)
✓ Policy version 10 loaded (active version: 10)
Applied preset: telegram
Widening sandbox egress — adding: *.atlassian.net, auth.atlassian.com, api.atlassian.com
✓ Policy version 11 submitted (hash: 3b7cf306a733)
✓ Policy version 11 loaded (active version: 11)
Applied preset: jira
Widening sandbox egress — adding: graph.microsoft.com, login.microsoftonline.com, outlook.office365.com, outlook.office.com
✓ Policy version 12 submitted (hash: 48737772cbc4)
✓ Policy version 12 loaded (active version: 12)
Applied preset: outlook
Widening sandbox egress — adding: host.openshell.internal, host.openshell.internal, host.openshell.internal
✓ Policy version 13 submitted (hash: a176881916b5)
✓ Policy version 13 loaded (active version: 13)
Applied preset: local-inference
✓ Deployment verified — gateway and dashboard are healthy.
OpenClaw version: 2026.4.24

──────────────────────────────────────────────────
Sandbox my-assistant (Landlock + seccomp + netns)
Model nemotron3:33b (Local Ollama)
──────────────────────────────────────────────────
Run: nemoclaw my-assistant connect
Status: nemoclaw my-assistant status
Logs: nemoclaw my-assistant logs --follow

OpenClaw UI (auth token redacted from displayed URLs)
Port 18789 must be forwarded before opening these URLs.
Dashboard: http://127.0.0.1:18789/
Token: nemoclaw my-assistant gateway-token --quiet
append #token=<token> locally if the browser asks for auth.
──────────────────────────────────────────────────

To change settings later:
Model: nemoclaw inference set --model <model> --provider <provider> --sandbox my-assistant
Policies: nemoclaw my-assistant policy-add
Credentials: nemoclaw credentials reset <KEY> then nemoclaw onboard

seeed@seeed:~$

Teniendo en cuenta que en el futuro podríamos necesitar acceder a servicios desplegados en la máquina host desde dentro del contenedor NeMoClaw, ejecuta el siguiente comando para configurar el acceso de red para esta aplicación.

nemoclaw my-assistant policy-add --from-file ~/rebot_arm_service/host-camera.yaml --yes

Si la incorporación se realiza correctamente, ejecuta:

nemoclaw my-assistant connect

Deberías entrar en un entorno de aplicación OpenClaw funcional:

4.3 Instalar el servicio del brazo robótico

Ejecutar en Jetson:

git clone https://github.com/yuyoujiang/rebot_arm_service.git ~
cd ~/rebot_arm_service
uv sync
# Configure GPU PyTorch runtime libraries
export LD_LIBRARY_PATH=/home/seeed/rebot_arm_service/.venv/lib/python3.12/site-packages/nvpl/lib:/usr/local/lib/ollama/cuda_v12:$LD_LIBRARY_PATH
python -c "import torch; print(torch.cuda.is_available())"

5. Configuración de permisos del dispositivo

Hay dos formas de configurar el permiso del dispositivo.

  1. Permiso temporal (se pierde después de reiniciar):
sudo chmod 666 /dev/ttyACM0
  1. Regla udev persistente (recomendado):
echo 'SUBSYSTEM=="tty", KERNEL=="ttyACM0", MODE:="0666", GROUP:="dialout"' | sudo tee /etc/udev/rules.d/99-rebot-arm.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

6. Iniciar servicios

6.1 Iniciar el backend del brazo robótico

cd ~/rebot_arm_service
export REBOT_CAMERA_DEVICE_INDEX=0
uv run rebot-arm-service

Acceso:

  • WebUI: http://127.0.0.1:8000/webui
  • Comprobación de estado: http://127.0.0.1:8000/healthz

6.2 Iniciar el listener de teclado (opcional)

Para activar rápidamente la detección/sujeción (sin esperar un razonamiento largo del agente), utiliza el listener de la tecla rápida F1.
Cuando se pulsa F1, solicita automáticamente el endpoint de la misión de sujeción.

Ejecutar directamente:

cd ~/rebot_arm_service
sudo ./.venv/bin/python scripts/space_mission_listener_evdev.py

O mediante script:

cd ~/rebot_arm_service
./scripts/start_space_listener_evdev.sh

6.3 Habilitar inicio automático al arrancar (opcional)

Configura dos servicios systemd:

  • rebot-arm.service: servicio backend
/etc/systemd/system/rebot-arm.service
[Unit]
Description=reBot Arm Backend Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=seeed
WorkingDirectory=/home/seeed/rebot_arm_service
Environment=PYTHONUNBUFFERED=1
Environment=LD_LIBRARY_PATH=/home/seeed/rebot_arm_service/.venv/lib/python3.12/site-packages/nvpl/lib:/usr/local/lib/ollama/cuda_v12
ExecStart=/home/seeed/rebot_arm_service/.venv/bin/rebot-arm-service
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target
  • rebot-f1-listener.service: disparador de tecla rápida F1
/etc/systemd/system/rebot-f1-listener.service
[Unit]
Description=reBot F1 Keyboard Listener
After=network-online.target rebot-arm.service
Wants=network-online.target
Requires=rebot-arm.service

[Service]
Type=simple
User=root
WorkingDirectory=/home/seeed/rebot_arm_service
Environment=PYTHONUNBUFFERED=1
Environment=MISSION_BASE_URL=http://127.0.0.1:8000
ExecStart=/home/seeed/rebot_arm_service/.venv/bin/python /home/seeed/rebot_arm_service/scripts/space_mission_listener_evdev.py
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target
peligro

Modifica la ruta en el archivo de configuración antes de iniciar el servicio.

Comandos de gestión:

sudo systemctl daemon-reload
sudo systemctl enable --now rebot-arm.service rebot-f1-listener.service
systemctl status rebot-arm.service
sudo systemctl status rebot-f1-listener.service

Registros:

journalctl -u rebot-arm.service -f
sudo journalctl -u rebot-f1-listener.service -f

7. Demostración de funciones

8. Solución de problemas

  1. Puerto serie ocupado (Device or resource busy)
    Detén los procesos obsoletos y vuelve a conectar. Asegúrate de que solo un proceso de control esté usando el brazo.

  2. Escena WebUI vacía
    Comprueba que las solicitudes de URDF y mallas devuelvan 200, especialmente /assets/urdf/....

  3. La detección no responde
    Comprueba que camera/status sea running=true, luego comprueba el endpoint de estado de la misión.

  4. Fallo al importar Torch por bibliotecas faltantes
    Asegúrate de que LD_LIBRARY_PATH incluya las rutas tanto de nvpl como de cuda_v12.

  5. La tecla rápida F1 no tiene efecto
    Comprueba los registros de rebot-f1-listener.service y confirma que escucha el dispositivo de teclado correcto.

  6. Otras teclas del teclado dejan de funcionar después de iniciar el listener
    Asegúrate de que el script no use dev.grab() (la captura exclusiva del teclado debe eliminarse).

  7. Fallo en la conexión de un segundo brazo
    Asegúrate de que la conexión anterior esté completamente liberada; llama a disconnect antes de volver a conectar.

9. Referencias

10. Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.

Loading Comments...