AY-Robots 训练矩阵,包含五行策略和四列机械臂,每个单元格链接到一个特定的模型和机械臂训练指南
ACTSO-100lerobot模仿学习策略训练

如何从零开始在 SO-100 上训练 ACT

AY-Robots ResearchAugust 23, 202616 分钟阅读

使用 lerobot 在 SO-100 上从零开始训练一个 Action Chunking Transformer:act 配置、chunk_size 和 n_action_steps、100000 步训练计划、20 毫秒推理。

ACT 在 SO-100 策略中是一个异类。GR00T N1.7 和 N1.5 源自 nvidia/GR00T-N1.7-3Bnvidia/GR00T-N1.5-3B,Pi0.5 源自 lerobot/pi05_base。ACT 从零开始:没有基础检查点,因为它不是一个基础模型。它是一个大约 8000 万参数的 Transformer,你需要针对一个任务、在你的机械臂上、在你的光照条件下从头开始训练。

这也是为什么它能在 20 ms 内运行一个控制步骤,而一个 30 亿参数的 VLA 需要 152 到 485 ms,并且每次运行成本为 1 到 3 USD,而不是 4 到 12。本指南将介绍在 lerobot 上使用 SO-100 的手动路线:记录,act 配置,chunk_sizen_action_steps 控制什么,100000 步的调度,以及 rollout。然后是在 AY-Robots 上执行相同的任务,包括平台无法提供帮助的地方。

你需要了解什么

  • ACT 从头开始训练:没有基础模型,没有预训练,没有语言输入。一个检查点,一个任务。
  • 论文:大约 8000 万参数,在 11 GB RTX 2080 Ti 上大约 5 小时,0.01 秒推理。
  • lerobot 默认值:chunk_size 100,n_action_steps 100,batch 8,lr 1e-5,100000 步,seed 1000。
  • 在 AY-Robots 上:每步 20 ms,是五种中最快的。最少 50 个 episode,LeRobot v3.0,24 GB 显卡,每次运行 1 到 3 USD。
  • 它在它见过的任务上表现出色,但当你需要语言条件时就会失效。
本教程描述的版本

于 2026 年 8 月 23 日对照 lerobot 0.6.x 进行了检查:main 分支上的 pyproject.toml 显示 version = "0.6.2",最新标签 v0.6.1,日期为 2026 年 8 月 3 日。以 python lerobot/scripts/train.py 开头的教程早于控制台入口点 lerobot-trainlerobot-recordlerobot-rollout

ACT 究竟是什么

Action Chunking with Transformers 源自 ALOHA 论文,使用低成本硬件学习精细双臂操作,作者是 Zhao、Kumar、Levine 和 Finn,发表于 arXiv,2023 年 4 月 23 日。该设备以 50 Hz 频率录制,四台网络摄像头以 30 fps 传输 480x640 视频:两台在夹持器上,一台顶部,一台正面。摘要声称六项技能的成功率达到 80% 到 90%,其中包括打开半透明调味杯和插入电池,这些技能来自 10 分钟的演示。

在规划录制会话时,正文内容更有用:每个任务 50 次演示,除了“穿过魔术贴”任务为 100 次,这相当于 10 到 20 分钟的数据和 30 到 60 分钟的实际运行时间(计入重置)。成功率也不尽相同:“穿过魔术贴”最终为 20%,“穿鞋”为 92%,“打开杯子”为 84%,“准备胶带”为 64%。

超参数ALOHA 论文,表 IIIlerobot 主分支
学习率1e-5optimizer_lr = 1e-5
批大小8batch_size = 8, in TrainPipelineConfig not ACTConfig
编码器 / 解码器层数4 / 7n_encoder_layers = 4 / n_decoder_layers = 1
块大小 k100chunk_size = 100
z 的潜在维度缺失;图 11 显示了 32 到 512 的投影latent_dim = 32
时间集成缺失;参考代码中的 --temporal_aggtemporal_ensemble_coeff = None
解码器层行不是笔误

论文列出了 7 个解码器层,LeRobot 故意只发布了 1 个。configuration_act.py 中的注释指出,原始实现存在一个 bug,意味着只使用了第一个层,并引用了 tonyzhaozh/act 中的 issue 25:动作头读取 hs[0],因此所有七个层都运行了,但只有第一个输出到达了预测。该问题自 2024 年 4 月 23 日以来一直未解决。LeRobot 匹配了产生已发布结果的行为,而不是打印的数字。增加 --policy.n_decoder_layers,你将训练一个论文从未评估过的模型。

动作分块是核心思想

普通的行为克隆将一个观察映射到一个动作,并且错误会累积:偏差使机械臂偏离分布,产生更差的动作,三十步后夹持器离物体还很远。 动作分块 一次预测 k 个动作并执行它们,将有效时间范围缩短 k 倍。它还处理了人类数据特有的一个问题:远程操作员会暂停,而单步马尔可夫式 策略 无法模拟依赖于之前情况的暂停。

论文通过消融实验而非断言来确定 k 值。在关闭时间集成的情况下,平均四种设置,成功率从 k = 1 时的 1% 上升到 k = 100 时的 44%,然后在 200 和 400 处趋于平稳,因为策略接近开环控制。这条曲线就是默认值设为 100 的原因。

  • chunk_size:解码器在每次前向传播中预测的未来动作数量。默认值 100。
  • n_action_steps:在再次查询之前执行的动作数量。默认值 100,因此 lerobot 以开环方式运行整个块。
  • lerobot 会验证 n_action_steps <= chunk_size,如果顺序颠倒,则会引发 ValueError

在操作上,重要的是 chunk_size 除以帧率。在 lerobot 的 SO-100 示例使用的 30 fps 下,一个 100 的块从一次观察中提交大约 3.3 秒。如果任务需要在该窗口内进行修正,请降低 n_action_steps,而不是 chunk_size:您保留长预测并更频繁地重新观察。

bash
# predict 100 actions, re-query after 25 of them (about 0.8 s at 30 fps)
lerobot-train \
  --dataset.repo_id=${HF_USER}/so100_cube \
  --policy.type=act \
  --policy.chunk_size=100 \
  --policy.n_action_steps=25 \
  --policy.device=cuda
缩短块的执行部分而不缩短预测。
时间集成陷阱

设置 --policy.temporal_ensemble_coeff 后,lerobot 要求 n_action_steps = 1,否则会引发 NotImplementedError。集成会在每个时间步查询策略,并使用权重 w_i = exp(-m * i) 混合该时间步的重叠预测,其中最旧的预测获得 w_0。论文指出 ACT 的这一比例为 3.3 percent:真实但适中,并且它将推理计数乘以块长度。在 20 ms 每步时是可承受的,但在 485 ms 时则不可承受。参见 推理延迟

当 ACT 优于基础模型时

五个可训练策略并排显示,附带 AY-Robots 测量并用于确定其租用 GPU 大小的数据。

策略系列参数每步GPU 等级最小剧集数数据集
ACT分块 Transformer,从零开始~80 M20 msRTX 4090 / 24 GB50LeRobot v3.0
SmolVLA紧凑型 VLA~450 M245 msRTX 4090 / 24 GB30LeRobot v3.0
GR00T N1.7VLA 基础,扩散头~3 B (~40 M trained)152 msA100 / H100 80 GB50LeRobot v2.0 or v2.1
GR00T N1.5VLA 基础,前身~3 B165 msA100 / H100 80 GB50LeRobot v2.0 or v2.1
Pi0.5流匹配 VLA,参见 流匹配~3 B, PaliGemma backbone485 msA100 / H100 80 GB50LeRobot v3.0
The AY-Robots policies page showing a comparison table of ACT, SmolVLA, GR00T N1.5, GR00T N1.7 and Pi0.5 with parameter counts, GPU requirements, inference latency and minimum episode counts
The /policies table: ACT has the smallest parameter count and the shortest step time.
从零开始训练 ACT
优点
  • 每个动作步骤 20 毫秒,五种方法中最快,在 24 GB 显卡而非 A100 上实现。
  • 每次运行成本 1 到 3 美元,而 3B 级别为 4 到 12 美元。
  • 在它接触过的富接触任务上表现精确:在 Slide Ziploc 和 Slot Battery 上分别达到 88% 和 96%,而先前的方法从未通过第一阶段。
权衡
  • 无语言条件:任务字符串被忽略,因此一个检查点对应一个任务。
  • 无语义先验:它所知道的一切都来自您的 50 个回合。
  • 泛化能力狭窄:移动摄像头就需要重新训练。
  • 静默失败:损失下降,机械臂无动作,日志无记录。
  • 速度优势仅在推理模块靠近伺服电机时才有效。

当任务和场景固定且运动必须快速精确时,选择 ACT。当一个检查点需要覆盖多条指令时,选择一个 。有两页内容直接比较了决策: 和 。对于已发布的基准测试, 将每个数字链接到其来源。

开始前您需要什么

一个跟随臂,一个用于的引导臂,至少一个摄像头,一个 24 GB GPU。ACT 只读取图像和关节位置。两个摄像头是最佳选择:一个固定前视图用于定位物体,一个腕部摄像头用于查看即将接触什么,就像 ALOHA 上那样。

机械臂舵机电压零件成本状态
SO-100Feetech STS32157.4 V~110 to 150 EUR完全支持,参考机械臂
SO-101Feetech STS32157.4 V~130 to 170 EUR完全支持
Koch v1.1Dynamixel XL330 / XL4305 V and 12 V rails~250 to 350 EUR兼容
LeKiwiFeetech STS3215 (arm)7.4 V arm, 12 V base~400 to 500 EUR兼容
7.4 V,而非 12 V

SO-100 和 SO-101 机械臂在 7.4 V 电压轨上运行 Feetech STS3215 舵机。向它们提供 12 V 电压会损坏它们,而且损坏过程非常安静,以至于人们首先会归咎于软件,并且 Koch 12 V 电源在物理上可以安装到 SO-100 主板上。请检查标签。症状:舵机无响应机械臂抽搐后下垂。另请参阅 SO-100 与 SO-101 对比

从裸机械臂到记录数据集

以下流程适用于 lerobot 0.6.x。如果您已有校准的机械臂和数据集,请跳过此部分。否则,SO-100 入门指南涵盖了组装,录制演练涵盖了捕获,而数据集文档涵盖了格式。

  1. 1
    安装带有正确附加组件的 lerobot

    录制需要 core_scripts,训练需要 training,飞特(Feetech)舵机需要 feetech。Python 3.12+。

    bash
    conda create -y -n lerobot python=3.12
    conda activate lerobot
    conda install ffmpeg -c conda-forge
    
    pip install 'lerobot[core_scripts,training,feetech]'
    lerobot-info
  2. 2
    查找每只机械臂的 USB 端口

    将两只机械臂都插上,在提示时拔掉其中一只。在 Linux 上,您可能需要打开节点权限。

    bash
    lerobot-find-port
    # on Linux, if the port exists but is unreadable:
    sudo chmod 666 /dev/ttyACM0
  3. 3
    设置电机 ID 和波特率

    在 SO-100 上,这需要在组装前完成:与 SO-101 不同,一旦组装完成,连接器就无法触及。脚本会从夹爪开始,一次一个电机地遍历总线,并将 ID 写入 EEPROM。

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  4. 4
    校准两只机械臂

    将每个关节设置到其范围的中间位置,按 Enter 键,然后让每个关节扫过其完整范围。校准允许在一个机械臂上训练的策略在另一个机械臂上运行。重复使用相同的 id

    bash
    lerobot-calibrate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_follower
    
    lerobot-calibrate \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_leader
  5. 5
    开启摄像头进行一次遥操作

    lerobot 的经验法则:您应该能够仅通过查看摄像头图像来完成任务。如果您不能,ACT 也不能。这比后期调试能发现更多糟糕的数据集。

    bash
    lerobot-teleoperate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_follower \
        --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_leader \
        --display_data=true
  6. 6
    录制 50 个 episode

    50 是 AY-Robots 的最低要求,也是 ALOHA 每个任务使用的数量。lerobot 建议每个物体位置 10 次,摄像头固定,抓取一致。n 结束一个 episode,r 重新录制,q 停止并编码。

    bash
    HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')
    
    lerobot-record \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_follower \
        --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_leader \
        --dataset.repo_id=${HF_USER}/so100_cube \
        --dataset.num_episodes=50 \
        --dataset.single_task="Grab the black cube and put it in the bin" \
        --display_data=true
AY-Robots 录制教程页面,解释如何从遥操作会话中捕获 LeRobot 格式的数据集
录制教程。桌面客户端写入的布局与 lerobot-record 相同。
耗时一天的陷阱:不一致的数据集

ACT 没有先验知识可以依赖,因此每一个不一致都会变成永久性的问题。三个代价最高的问题是:在 episode 20 和 21 之间摄像头被轻微移动,因为你在下午录制了一半数据集而导致光线变化,以及抓取动作以两种方式完成。每种情况都会产生看起来完美的损失曲线,但机械臂却会移动到错误的位置。请参阅损失下降,策略却无所作为策略仅在一种设置下有效收集高质量训练数据

在训练之前,至少回放五个 episode。存储每个的摄像头流、关节状态和动作,并且回放会将这些动作推回机械臂。如果回放未能完成任务,则数据中不包含该任务,训练也不会凭空创造它。

bash
lerobot-replay \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_follower \
    --dataset.repo_id=${HF_USER}/so100_cube \
    --dataset.episode=0
重放第0集。如果失败,请停止并重新录制。

训练ACT策略

这是完整的命令。所有ACT特有的内容都已是默认设置,这就是为什么lerobot ACT页面建议从它们开始。

bash
lerobot-train \
  --dataset.repo_id=${HF_USER}/so100_cube \
  --policy.type=act \
  --output_dir=outputs/train/act_so100_cube \
  --job_name=act_so100_cube \
  --policy.device=cuda \
  --wandb.enable=true \
  --policy.repo_id=${HF_USER}/act_so100_cube
来自lerobot 0.6.x文档的训练命令,用于SO-100数据集。

--policy.type=act 加载 ACTConfig,它会根据您的数据集记录的电机和摄像头的数量进行调整,因此您无需声明观测形状。 --wandb.enable=true 是可选但值得的:在 100000 步的运行中,损失曲线是唯一廉价的信号。调度来自 lerobot 的训练配置,而非 ACTConfig:100000 步,批次 8,种子 1000,每 20000 步一个,每 200 步记录一次。

一次完整的运行会留下五个检查点目录,从 020000 到 100000,以及一个 last 符号链接。请保留所有这些:最佳策略通常不是最后一个。

设置lerobot 默认值AY-Robots ACT 表单备注
批次大小88如果遇到 VRAM 限制,请首先降低此值。
学习率1e-51e-5与 ALOHA 论文相同。
最大步数100000100000大致是 50 集数据集停止改进的地方。
梯度累积11, does not apply请改为更改批次大小。
种子1000exposedGR00T 的 tyro 入口点没有种子;ACT 运行是可复现的。
chunk_size / n_action_steps100 / 100100 / 100, editable预测和执行范围。降低第二个值,而不是第一个。
检查点频率20000not exposedsaveSteps 在此处是 GR00T 的一个参数。
内存不足是批次大小问题,而非显卡问题

ACT 在批次大小为 8 且使用两个 640x480 摄像头时,可在 24 GB 内存上舒适运行。当人们为了提高速度而增加批次大小,或者输入 lerobot 录制示例中所示的 1920x1080 帧时,它将不再适用。两个 1080p 的 ResNet-18 主干网络会产生截然不同的内存占用情况。在租用更大的显卡之前,请将 --batch_size 降至 4。请参阅训练中内存不足

持续时间:论文中在11 GB RTX 2080 Ti上大约5小时,根据lerobot的ACT页面,10万步需要几小时,在AY-Robots 24 GB层级上需要2到5小时。不要缩短。参考仓库的README指出,一个不流畅或停顿的策略通常只需要更多的训练,因为在损失平台期之后,成功率和流畅度会持续提高:对于真实世界数据,它至少需要5000个epoch,或者在平台期之后再延长3到4倍的时间。

bash
lerobot-train \
  --config_path=outputs/train/act_so100_cube/checkpoints/last/pretrained_model/train_config.json \
  --resume=true
从上次检查点恢复中断的运行。

在机械臂上运行训练好的策略

部署使用lerobot-rollout。摄像头键必须与记录的键匹配:一个在frontwrist上训练的策略将不接受cam0cam1,并且rename_map没有帮助,因为它需要一个预训练的检查点。任务字符串可以省略;lerobot自己的示例将其标记为ACT可跳过。

bash
lerobot-rollout \
  --strategy.type=base \
  --policy.path=${HF_USER}/act_so100_cube \
  --robot.type=so100_follower \
  --robot.port=/dev/ttyACM0 \
  --robot.id=my_follower \
  --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 1, width: 640, height: 480, fps: 30} }" \
  --display_data=true \
  --duration=60
无记录的自主部署。使用 --strategy.type=sentry 来记录评估回合。
此命令最近已重命名,因此旧教程存在分歧

评估过去通过 lerobot-record --policy.path=... 运行。在 0.6.x 版本中,它是 lerobot-rollout,带有 --strategy.type 选择器:basesentry(带自动上传的记录)、highlight(通过按键保存的环形缓冲区)、dagger(人在回路中)和 episodic。截至 2026 年 8 月 23 日,ACT 文档页面在一个运行 lerobot-rollout 的代码块正上方仍然写着“使用 lerobot-record 命令”。请遵循命令,而不是句子。

要固定一个检查点而不是最终模型,请添加 --policy.pretrained_revision。这需要运行开始时带有 --save_checkpoint_to_hub=true,默认关闭:没有它,lerobot 只会推送最终模型。有了它,每个检查点都会用其零填充的步数进行标记,因此 --policy.pretrained_revision=060000 恢复 60000 步的检查点。在真实机械臂上将其与 100000 步的检查点进行比较是成本最低的实验。

通往同一检查点的两条路径

以上是手动路线,它有效。平台路线以放弃控制权为代价,换取无需拥有GPU或Python环境的便利。

  1. 安装 lerobot 0.6.x,包含 core_scriptstrainingfeetech 和 ffmpeg。
  2. 查找端口,设置电机ID,校准双臂,录制50个片段。
  3. 回放几个片段以确认数据包含该任务。
  4. 租用或拥有一个24 GB GPU,匹配CUDA和PyTorch,运行 lerobot-train --policy.type=act
  5. 等待几小时,然后在机械臂旁的机器上运行 lerobot-rollout
bash
# the two commands that matter, end to end
lerobot-record --robot.type=so100_follower --robot.port=/dev/ttyACM0 \
  --teleop.type=so100_leader --teleop.port=/dev/ttyACM1 \
  --dataset.repo_id=${HF_USER}/so100_cube --dataset.num_episodes=50 \
  --dataset.single_task="Grab the black cube"

lerobot-train --dataset.repo_id=${HF_USER}/so100_cube --policy.type=act \
  --output_dir=outputs/train/act_so100_cube --policy.device=cuda
此路线为您提供什么

完全控制:编辑 configuration_act.py,添加摄像头,分叉训练器。对于研究而非交付任务而言,平台是一种干扰。

The AY-Robots training matrix with five policy rows and four robot arm columns, where every cell links to the specific training guide for that model and arm combination
The matrix on /train. The ACT row against the SO-100 column is this article's guide.

究竟哪里出了问题

训练命令本身几乎没有痛苦。痛苦在于其周围的事物,按首次出现问题的频率排序。

症状常见原因页面
lerobot-find-port shows nothing驱动程序、线缆或节点权限问题机械臂未检测到
录制时摄像头缺失重启后索引改变,或一个USB控制器连接两个摄像头摄像头未检测到
训练拒绝数据集ACT needs v3.0, GR00T needs v2.1数据集被拒绝为 v3
CUDA 内存不足批处理大小增加,或使用 1080p 帧而非 480p 帧训练中内存不足
损失看起来很好,但机械臂没有动作数据缺少任务,或摄像头移动了损失下降,策略无动作
运动卡顿或剧集中间暂停训练不足、块边界停顿或推理调用超时策略在运动中冻结

有两行值得强调。ACT 在 LeRobot v3.0 上训练,而 GR00T 的加载器在此版本上会崩溃并需要 v2.1,因此用于训练 ACT 的数据集可能会导致 GR00T 运行失败。最后一行有两个修复方案:ACT 作者通过更多训练来解决卡顿运动,而当 n_action_steps 为 100 时,真正的停顿会发生在块边界,即每 3.3 秒在 30 fps 下出现一次可见的暂停。另外需要了解两点:单个失效关节通常是 从未写入的舵机ID,以及 一个接近但从不闭合的夹爪 意味着演示中夹爪范围太小。完整索引:故障模式页面

一次运行的成本

层级模型运行时间每小时价格每次运行成本
RTX 4090 / 24 GBACT, SmolVLA2 到 5 小时0.30 to 0.60 USD约 1 到 3 美元
A100 80 GB / H100GR00T N1.7, GR00T N1.5, Pi0.53 到 6 小时1.20 to 2.00 USD约 4 到 12 美元

这就是为什么即使你以后想要 VLA,也应该从 ACT 开始的原因。一次失败的 ACT 运行只花费一杯咖啡的钱,并在数小时内告诉你你的数据集是否包含该任务。一次失败的 GR00T 运行则需要四倍的成本才能获得相同的教训。之后升级到 GR00T N1.7SmolVLA 之后是形式上的改变,而非重建。背景信息:视觉-语言-动作模型SO-100 完整指南训练你的第一个策略模仿学习。没有机械臂?实时页面 无需注册即可驱动真实的 SO-100。

在你的 SO-100 上训练 ACT

此精确组合的指南:默认设置、GPU 层级以及每次运行的成本。选择数据集后,后端会租用显卡并写入检查点。

打开训练指南
是否有预训练的 ACT 模型可以用来微调?

没有。ACT 没有基础模型;它只在你训练后才存在。这不是工具链的缺陷,而是 ACT 的本质:该论文针对每个任务从头开始训练一个策略。如果需要供应商检查点,请使用 GR00T N1.7 或 Pi0.5。

我到底需要多少个片段?

50 个:ALOHA 每个任务记录的数量(Thread Velcro 是最难的,需要 100 个)以及 AY-Robots 的最低要求。lerobot 建议每个物体位置大约 10 个,摄像头固定,抓取一致。五十个干净的片段胜过一百个摄像头移动的片段。

我应该将 chunk_size 从 100 更改吗?

通常不需要。消融实验显示,从 k = 1 时的 1% 上升到 k = 100 时的 44% 后趋于平稳,因此 100 接近峰值。如果机械臂提交时间过长,可以降低 n_action_steps:在 30 fps 下,每 0.8 秒重新查询 25 次。

训练运行需要多长时间,可以提前停止吗?

在 24 GB 显卡上运行 100000 步需要两到五个小时。检查点每 20000 步生成一次,并且 --resume=true 可以恢复运行,因此提前停止是安全的。只是不要在第一个平稳期就停止:损失平台期后平滑度会提高。

损失下降了,但机械臂仍然失败。现在怎么办?

几乎总是数据集的问题。在机械臂上回放录制的片段:如果回放无法完成任务,则数据不包含该任务。然后检查是否有任何东西移动过,尤其是摄像头。ACT 没有先验知识,因此在第 21 个片段中的轻微触碰是永久性的。

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started