|
| 1 | +--- |
| 2 | +description: This wiki shows how to control SO-Arm on Jetson Thor with OpenClaw and LeRobot. |
| 3 | +title: Control SO-Arm by OpenClaw on Jetson Thor |
| 4 | +image: https://files.seeedstudio.com/wiki/reComputer-Jetson/openclaw/soarm_claw.webp |
| 5 | +slug: /ai_robotics_control_soarm_by_openclaw_on_jetson_thor |
| 6 | +sku: 100060965 | 100046482 |
| 7 | +last_update: |
| 8 | + date: 03/09/2026 |
| 9 | + author: youjiang |
| 10 | +--- |
| 11 | + |
| 12 | +# Control SO-Arm by OpenClaw on Jetson Thor |
| 13 | + |
| 14 | +## Introduction |
| 15 | + |
| 16 | +This wiki explains how to combine OpenClaw and LeRobot on Jetson Thor to control a SO-Arm with a local AI agent. |
| 17 | + |
| 18 | +**NVIDIA Jetson AGX Thor** is a high-performance edge AI platform designed for robotics and physical AI workloads, providing strong on-device compute for perception, planning, and control. |
| 19 | + |
| 20 | +**SO-Arm** is an open-source low-cost robotic arm platform (SO-ARM100/SO-ARM101) that is widely used for embodied AI experiments, teleoperation, and manipulation task development. |
| 21 | + |
| 22 | +**OpenClaw** is an AI agent framework that can orchestrate local tools and models. In this project, OpenClaw is used as the high-level control interface, while LeRobot provides the low-level motor communication and calibration utilities for SO-Arm. |
| 23 | + |
| 24 | +<div align="center"> |
| 25 | + <img width={900} |
| 26 | + src="https://files.seeedstudio.com/wiki/reComputer-Jetson/openclaw/soarm_claw.png" /> |
| 27 | +</div> |
| 28 | + |
| 29 | +:::note |
| 30 | +In this guide, OpenClaw handles agent planning and task orchestration, while SO-Arm motion execution is handled by LeRobot. |
| 31 | +::: |
| 32 | + |
| 33 | +## Table of Contents |
| 34 | + |
| 35 | +1. [Hardware Preparation](#hardware-preparation) |
| 36 | +2. [System Setup on Jetson Thor](#system-setup-on-jetson-thor) |
| 37 | +3. [Install Ollama and Run a Local LLM](#install-ollama-and-run-a-local-llm) |
| 38 | +4. [Install OpenClaw on Jetson Thor](#install-openclaw-on-jetson-thor) |
| 39 | +5. [Connect and Calibrate SO-Arm](#connect-and-calibrate-so-arm) |
| 40 | +6. [Run Control Demo](#run-control-demo) |
| 41 | +7. [References](#references) |
| 42 | + |
| 43 | +## Hardware Preparation |
| 44 | + |
| 45 | +### Device List |
| 46 | + |
| 47 | +- 1x NVIDIA® Jetson AGX Thor™ Developer Kit |
| 48 | +- 1x SO-ARM101 Low-Cost AI Arm |
| 49 | + |
| 50 | +<div class="table-center"> |
| 51 | +<table style={{ textAlign: 'center' }}> |
| 52 | + <tr> |
| 53 | + <th> NVIDIA® Jetson AGX Thor™ Developer Kit </th> |
| 54 | + <th> SO-ARM101 Low-Cost AI Arm </th> |
| 55 | + </tr> |
| 56 | + <tr> |
| 57 | + <td> |
| 58 | + <div style={{textAlign:'center'}}> |
| 59 | + <img src="https://media-cdn.seeedstudio.com/media/catalog/product/cache/bb49d3ec4ee05b6f018e93f896b8a25d/i/m/image-kit-3.png" style={{width:400, height:'auto'}}/> |
| 60 | + </div> |
| 61 | + </td> |
| 62 | + <td> |
| 63 | + <div style={{textAlign:'center'}}> |
| 64 | + <img src="https://media-cdn.seeedstudio.com/media/catalog/product/cache/bb49d3ec4ee05b6f018e93f896b8a25d/1/-/1-100046482-so-arm-101-assembled-kit-pro.jpg" style={{width:400, height:'auto'}}/> |
| 65 | + </div> |
| 66 | + </td> |
| 67 | + </tr> |
| 68 | + <tr> |
| 69 | + <td> |
| 70 | + <div class="get_one_now_container" style={{textAlign: 'center'}}> |
| 71 | + <a class="get_one_now_item" href="https://www.seeedstudio.com/NVIDIA-Jetson-AGX-Thor-Developer-Kit-p-9965.html"> |
| 72 | + <strong><span><font color={'FFFFFF'} size={"4"}> Get One Now 🖱️</font></span></strong> |
| 73 | + </a> |
| 74 | + </div> |
| 75 | + </td> |
| 76 | + <td> |
| 77 | + <div class="get_one_now_container" style={{textAlign: 'center'}}> |
| 78 | + <a class="get_one_now_item" href="https://www.seeedstudio.com/SO-ARM-101-Assembled-Kit-Pro-p-6691.html"> |
| 79 | + <strong><span><font color={'FFFFFF'} size={"4"}> Get One Now 🖱️</font></span></strong> |
| 80 | + </a> |
| 81 | + </div> |
| 82 | + </td> |
| 83 | + </tr> |
| 84 | +</table> |
| 85 | +</div> |
| 86 | + |
| 87 | +### Wiring and Connection |
| 88 | + |
| 89 | +- Connect the SO-Arm controller board to Thor through USB. |
| 90 | +- Connect the matching DC power adapter to the SO-Arm controller board. |
| 91 | +- Power on Thor, then power on the arm controller board. |
| 92 | + |
| 93 | +### Power-On Checklist |
| 94 | + |
| 95 | +- Thor boots normally and network is available. |
| 96 | +- SO-Arm controller board LEDs are on. |
| 97 | +- Serial device appears after USB connection. |
| 98 | + |
| 99 | +```bash |
| 100 | +ls /dev/ttyACM* |
| 101 | +``` |
| 102 | + |
| 103 | +If a serial node is detected in terminal output, the hardware connection is correct. |
| 104 | + |
| 105 | +<div align="center"> |
| 106 | + <img width={900} |
| 107 | + src="https://files.seeedstudio.com/wiki/reComputer-Jetson/openclaw/check_serial.png" /> |
| 108 | +</div> |
| 109 | + |
| 110 | +## System Setup on Jetson Thor |
| 111 | + |
| 112 | +### Update System Packages |
| 113 | + |
| 114 | +```bash |
| 115 | +sudo apt update |
| 116 | +sudo apt install -y nvidia-jetpack git curl ffmpeg python3-pip |
| 117 | +python3 -m pip install -U pip |
| 118 | +``` |
| 119 | + |
| 120 | +### Install Core Dependencies |
| 121 | + |
| 122 | +Install Miniconda (recommended): |
| 123 | + |
| 124 | +```bash |
| 125 | +wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh |
| 126 | +chmod +x Miniconda3-latest-Linux-aarch64.sh |
| 127 | +./Miniconda3-latest-Linux-aarch64.sh |
| 128 | +source ~/.bashrc |
| 129 | +``` |
| 130 | + |
| 131 | +<div align="center"> |
| 132 | + <img width={900} |
| 133 | + src="https://files.seeedstudio.com/wiki/reComputer-Jetson/openclaw/conda.png" /> |
| 134 | +</div> |
| 135 | + |
| 136 | +Create LeRobot environment: |
| 137 | + |
| 138 | +```bash |
| 139 | +conda create -y -n lerobot python=3.12 |
| 140 | +conda activate lerobot |
| 141 | +git clone https://github.com/huggingface/lerobot.git ~/lerobot |
| 142 | +cd ~/lerobot |
| 143 | +pip install -e . |
| 144 | +pip uninstall torch torchvision |
| 145 | +pip install torch torchvision --index-url https://pypi.jetson-ai-lab.io |
| 146 | +``` |
| 147 | + |
| 148 | +Install Pinocchio in the LeRobot environment: |
| 149 | + |
| 150 | +```bash |
| 151 | +conda install pinocchio -c conda-forge |
| 152 | +``` |
| 153 | + |
| 154 | +### Verify CUDA and Peripheral Devices |
| 155 | + |
| 156 | +```bash |
| 157 | +python -c "import torch; print(torch.cuda.is_available())" |
| 158 | +lerobot-find-port |
| 159 | +``` |
| 160 | + |
| 161 | +Expected result: |
| 162 | + |
| 163 | +- `torch.cuda.is_available()` prints `True` |
| 164 | +- arm serial ports are detected (for example `/dev/ttyACM0`) |
| 165 | + |
| 166 | +## Install Ollama and Run a Local LLM |
| 167 | + |
| 168 | +Install Ollama: |
| 169 | + |
| 170 | +```bash |
| 171 | +curl -fsSL https://ollama.com/install.sh | sh |
| 172 | +``` |
| 173 | + |
| 174 | +Pull a model: |
| 175 | + |
| 176 | +```bash |
| 177 | +ollama pull qwen3-vl:9b |
| 178 | +``` |
| 179 | + |
| 180 | +:::info |
| 181 | +This guide uses `qwen3-vl:9b` as an example. You can replace it with another Ollama model based on your performance and memory constraints. |
| 182 | +::: |
| 183 | + |
| 184 | +## Install OpenClaw on Jetson Thor |
| 185 | + |
| 186 | +### Install OpenClaw |
| 187 | + |
| 188 | +```bash |
| 189 | +curl -fsSL https://openclaw.ai/install.sh | bash |
| 190 | +``` |
| 191 | + |
| 192 | +### Configure Runtime Parameters |
| 193 | + |
| 194 | +Edit `~/.openclaw/openclaw.json` and set Ollama as the default model provider: |
| 195 | + |
| 196 | +```json |
| 197 | +{ |
| 198 | + "agents": { |
| 199 | + "defaults": { |
| 200 | + "models": { |
| 201 | + "ollama": {} |
| 202 | + }, |
| 203 | + "model": { |
| 204 | + "primary": "ollama/qwen3-vl:9b" |
| 205 | + } |
| 206 | + } |
| 207 | + }, |
| 208 | + "models": { |
| 209 | + "providers": { |
| 210 | + "ollama": { |
| 211 | + "baseUrl": "http://127.0.0.1:11434/v1", |
| 212 | + "apiKey": "ollama-local", |
| 213 | + "api": "openai-completions", |
| 214 | + "models": [ |
| 215 | + { |
| 216 | + "id": "qwen3-vl:9b", |
| 217 | + "name": "Qwen3 VL 9B", |
| 218 | + "reasoning": false, |
| 219 | + "input": [ |
| 220 | + "text" |
| 221 | + ], |
| 222 | + "cost": { |
| 223 | + "input": 0, |
| 224 | + "output": 0, |
| 225 | + "cacheRead": 0, |
| 226 | + "cacheWrite": 0 |
| 227 | + }, |
| 228 | + "contextWindow": 128000, |
| 229 | + "maxTokens": 8192 |
| 230 | + } |
| 231 | + ] |
| 232 | + } |
| 233 | + } |
| 234 | + } |
| 235 | +} |
| 236 | +``` |
| 237 | + |
| 238 | +:::note |
| 239 | +Optional: you can also directly use the script provided by Ollama to quickly set up the OpenClaw configuration file. |
| 240 | + |
| 241 | +`ollama launch openclaw --model qwen3.5` |
| 242 | +::: |
| 243 | + |
| 244 | +### More Configure |
| 245 | + |
| 246 | +Install the SO-Arm control skill: |
| 247 | + |
| 248 | +- Download [soarm-control Skill](https://clawhub.ai/yuyoujiang/soarm-control) |
| 249 | +- Extract it to `~/.openclaw/workspace/skills` |
| 250 | + |
| 251 | +Prepare robot description file: |
| 252 | + |
| 253 | +- Download [SO-ARM101 URDF](https://github.com/TheRobotStudio/SO-ARM100/blob/main/Simulation/SO101/so101_new_calib.urdf) |
| 254 | +- Move it to `~/.openclaw/workspace/skills/soarm-control/references` |
| 255 | + |
| 256 | +Restart OpenClaw gateway: |
| 257 | + |
| 258 | +```bash |
| 259 | +openclaw gateway restart |
| 260 | +``` |
| 261 | + |
| 262 | +Open WebUI: |
| 263 | + |
| 264 | +```text |
| 265 | +http://127.0.0.1:18789/ |
| 266 | +``` |
| 267 | + |
| 268 | +## Connect and Calibrate SO-Arm |
| 269 | + |
| 270 | +### Serial Port Permission and Detection |
| 271 | + |
| 272 | +```bash |
| 273 | +conda activate lerobot |
| 274 | +lerobot-find-port |
| 275 | +sudo chmod 666 /dev/ttyACM* |
| 276 | +``` |
| 277 | + |
| 278 | +### Initial Calibration |
| 279 | + |
| 280 | +Calibrate follower arm: |
| 281 | + |
| 282 | +```bash |
| 283 | +lerobot-calibrate \ |
| 284 | + --robot.type=so101_follower \ |
| 285 | + --robot.port=/dev/ttyACM0 \ |
| 286 | + --robot.id=openclaw_soarm |
| 287 | +``` |
| 288 | + |
| 289 | +Calibration files are saved under: |
| 290 | + |
| 291 | +`~/.cache/huggingface/lerobot/calibration/` |
| 292 | + |
| 293 | +:::note |
| 294 | +For a full calibration walkthrough, refer to: |
| 295 | +[SO-Arm in LeRobot - Calibrate](https://wiki.seeedstudio.com/lerobot_so100m_new/#calibrate) |
| 296 | +::: |
| 297 | + |
| 298 | +## Run Control Demo |
| 299 | + |
| 300 | +### Launch OpenClaw Service |
| 301 | + |
| 302 | +Ensure OpenClaw and LeRobot environments are ready: |
| 303 | + |
| 304 | +```bash |
| 305 | +openclaw gateway restart |
| 306 | +conda activate lerobot |
| 307 | +``` |
| 308 | + |
| 309 | +### Execute Basic Motion Task |
| 310 | + |
| 311 | +In OpenClaw WebUI, enter robot control instructions. OpenClaw will parse your prompt and call the installed `soarm-control` skill to drive the arm to the target position. |
| 312 | + |
| 313 | +The video demonstrates three commands: |
| 314 | + |
| 315 | +1. Move the robotic arm’s end effector upward by 20 cm. |
| 316 | +2. Then move forward by 20 cm, keeping the height unchanged. |
| 317 | +3. Return to the initial position. |
| 318 | + |
| 319 | +OpenClaw’s responses to these three commands all match the expected behavior. |
| 320 | + |
| 321 | +<div class="video-container"> |
| 322 | + <iframe width="800" height="450" src="https://www.youtube.com/embed/5fPBpAno2wc" title="Using OpenClaw to Control the SOARM 101 Robot Arm | Robotics Demo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> |
| 323 | +</div> |
| 324 | + |
| 325 | +## References |
| 326 | + |
| 327 | +- https://docs.openclaw.ai/ |
| 328 | +- https://wiki.seeedstudio.com/local_openclaw_on_recomputer_jetson/ |
| 329 | +- https://unstabledemos.com/tutorials/openclaw-orin-nano/ |
| 330 | +- https://wiki.seeedstudio.com/lerobot_so100m_new/ |
| 331 | +- https://github.com/huggingface/lerobot |
| 332 | +- https://github.com/TheRobotStudio/SO-ARM100 |
| 333 | + |
| 334 | +## Tech Support & Product Discussion |
| 335 | + |
| 336 | +Thank you for choosing our products! We are here to provide you with different support to ensure that your experience with our products is as smooth as possible. We offer several communication channels to cater to different preferences and needs. |
| 337 | + |
| 338 | +<div class="button_tech_support_container"> |
| 339 | +<a href="https://forum.seeedstudio.com/" class="button_forum"></a> |
| 340 | +<a href="https://www.seeedstudio.com/contacts" class="button_email"></a> |
| 341 | +</div> |
| 342 | + |
| 343 | +<div class="button_tech_support_container"> |
| 344 | +<a href="https://discord.gg/eWkprNDMU7" class="button_discord"></a> |
| 345 | +<a href="https://github.com/Seeed-Studio/wiki-documents/discussions/69" class="button_discussion"></a> |
| 346 | +</div> |
0 commit comments