一、引言

第三周我们让 Jetson 学会了"听说读写"——部署了本地 LLM/VLM,搭起了 ASR + LLM + TTS 离线语音助手,AI 第一次在我的桌面硬件上"开口说话"。

但 Week4 要回答一个更本质的问题:AI 能不能不只在对话框里,而是真正伸出"手"去改变物理世界?

这正是本周主题——具身智能(Embodied AI)。本周我完成了从理论学习到真机部署的完整闭环:在 Jetson Orin Nano Super 上配置 LeRobot 环境,连接 SO-ARM101 主从机械臂,通过遥操作采集示范数据,训练 ACT 策略,最后让从臂根据画面自主完成方块的抓取与放置

本文实践目标:

  • ✅ 理解具身智能核心概念与 ACT 算法原理
  • ✅ 在 Jetson 上配置 LeRobot 环境,完成主从臂校准与相机接入
  • ✅ 通过遥操作采集示范数据(≥50 条)
  • ✅ 在 GPU 上训练 ACT 策略并部署回 Jetson
  • ✅ 验证从臂自主完成接近、抓取、放置的本地闭环

💡 一句话概括本周收获:让 Jetson 从"看见"到"做到",打通了 感知 → 决策 → 执行 的完整链路。

二、硬件与系统环境

2.1 硬件清单

硬件型号/说明作用
边缘计算平台NVIDIA Jetson Orin Nano Super 8GB大脑:采集数据、运行 ACT 推理、下发控制指令
机械臂SO-ARM101 主臂 + 从臂(飞特舵机)身体:主臂人工示教,从臂执行动作
相机USB 相机 ×2(全局视角 front + 侧面视角 side)眼睛:为策略提供视觉输入
显示器/键鼠HDMI 显示器 + USB 键鼠人机交互与调试
电源从臂 12V / 主臂 5V(按版本区分)供电

2.2 软件环境

软件版本/说明
JetPack6.0+(L4T 对应版本)
Python3.10(conda 独立环境)
LeRobotSeeed-Projects/lerobot(教程验证稳定版)
PyTorchGPU 版(torch.cuda.is_available() 必须为 True)
OpenCV4.10.0.84
ffmpeg7.1.1(conda-forge)
numpy1.26.0

三、理论学习:具身智能与 ACT

3.1 具身智能:把 AI 延伸到物理世界

课程一开始就抛出一个观点:AI 不只在对话框里,它能感知、决策,并真正行动。 一个完整的具身智能系统由四部分组成:

模块组件职责
🦾 身体SO-ARM101主从臂完成抓取与放置
👁️ 眼睛Camera全局/侧面视角提供观察
🧠 大脑Jetson本地看、想、发控制指令
🎯 方法ACT模仿示范,再自主执行

💡 具身智能由此形成:智能不是孤立的计算,而是在身体与环境的互动中完成。

3.2 具身智能的三大理论支柱

  • ① 控制论:机器通过感知结果与环境反馈,不断修正自己的行为。
  • ② 具身认知:思考和决策并不只发生在大脑中,身体与环境也参与认知。
  • ③ 行为式机器人:机器人不再只执行预设程序,而是让感知直接连接行动。

3.3 机器人控制演进:从执行命令到学习任务

课程用一个演进图讲清了机器人技术的主线——逐步减少对固定程序的依赖

预设程序(固定场景重复执行)
    ↓
传感闭环(依据位置、力觉和视觉反馈修正动作)
    ↓
示范学习(从人的操作记录中提取动作规律)
    ↓
多模态模型(把语言、视觉和动作放进同一任务)

今天的研究重点,已经从"如何写出每一步",转向"如何让机器人学会完成任务"。

3.4 ACT 算法原理:让机器人学会"做动作"

本周的核心算法是 ACT(Action Chunking with Transformers),一类面向机器人模仿学习的动作生成模型。

ACT 是一种端到端的模仿学习方法:用一个 Transformer 把多路摄像头画面和机器人关节状态编码后,直接输出关节动作。关键机制有两个:

  • 风格变量 z:训练时先从数据集中学到"风格" z,防止人操作时数据速度不均匀导致训练困难;推理时设置 z=0,机械臂按所有数据的"数学期望风格"运行,输出均匀流畅的动作。
  • 动作分块(Action Chunking):核心是预测一段连续动作序列,而非单个动作——这大幅提升了执行稳定性。

💡 宏观理解:训练阶段让 ACT 学会"怎么做",部署阶段让 Jetson 负责"实时地做出来"。

3.5 本周学习闭环:示范 → 模仿 → 部署

① 遥操作(主臂控制从臂)
    ↓
② 采集(视频画面 + 电机输出)
    ↓
③ 训练 ACT(基于数据集模仿学习)
    ↓
④ Jetson 评估(基于具身智能完成抓取)

⚠️ 感知、决策、控制都交给 Jetson——不再是设定好的一串代码。

四、环境配置与硬件联调

4.1 Jetson 环境检查(四要素)

动手前先做环境体检,课程总结了四个关键点,缺一个后面都会踩坑:

检查项要求说明
仓库Seeed-Projects/lerobot使用教程指定的稳定版本,别用官方主分支
GPUtorch.cuda.is_available() → True避免误装为 CPU 版 PyTorch
串口/dev/ttyACM* + chmod 666无法识别端口时,校准与遥操作无法进行
依赖版本OpenCV / ffmpeg / numpy严格按文档核对版本

4.2 安装 LeRobot 环境

# 创建 conda 环境
conda create -y -n lerobot python=3.10 && conda activate lerobot

# 安装 ffmpeg(报错时显式装 7.1.1)
conda install ffmpeg=7.1.1 -c conda-forge

# 克隆 Seeed 验证稳定版仓库
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
cd ~/lerobot && pip install -e ".[feetech]"

Jetson(JetPack 6.0+)需要额外处理依赖,避免装成 CPU 版:

conda install -y -c conda-forge "opencv>=4.10.0.84"
conda remove opencv
pip3 install opencv-python==4.10.0.84
conda uninstall numpy
pip3 install numpy==1.26.0
# 验证 GPU 可用
import torch
print(torch.cuda.is_available())  # 必须为 True

⚠️ 我前几周就在这栽过:Jetson 上 pip 装 PyTorch 很容易静默装成 CPU 版,模型能跑但慢到怀疑人生。装完第一时间验证 torch.cuda.is_available()

4.3 端口查找与权限

# 分别插拔主臂/从臂各执行一次,确定两个 USB 端口
lerobot-find-port

# 赋予端口权限
sudo chmod 666 /dev/ttyACM*

4.4 舵机配置与主从臂校准

先设置电机 ID(主臂、从臂各一次,按提示依次只连接一个舵机):

# 从臂
lerobot-setup-motors \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0

# 主臂
lerobot-setup-motors \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1

再进行全行程校准——将主从臂置于行程中位,完成全行程标定

# 从臂校准
lerobot-calibrate \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_awesome_follower_arm

# 主臂校准
lerobot-calibrate \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_awesome_leader_arm

⚠️ 标定结果与设备 id 绑定,采集与评估需保持一致;更换或维修舵机后,必须删除原标定文件(~/.cache/huggingface/lerobot/calibration/ 下对应 json)重新校准。

4.5 相机接入

lerobot-find-cameras opencv   # 确认相机编号

建议相机直接连接 Jetson,并采用 MJPG 压缩格式(支持 3 路 1080P@30FPS):

--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: \"MJPG\"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: \"MJPG\"}}"

⚠️ 不推荐两路相机接同一个 USB HUB;重启后相机编号可能变化,需重新确认。

4.6 遥操作联调

先完成无相机联调,主臂运动时从臂应实时跟随,确认控制链路正常:

sudo chmod 666 /dev/ttyACM*
lerobot-teleoperate \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_awesome_follower_arm \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_awesome_leader_arm

💡 当主臂动、从臂跟着动的那一刻,真的有种"手把手教学"的感觉——这就是遥操作。

五、数据采集:喂给机械臂的"学习素材"

5.1 采集四要点

要点说明
① 明确任务描述例如 “Grab the black cube / 放到盒子里”,评估时需使用相同描述
② 保证数据规模流程验证可用少量样本,正式训练建议不少于 50 条
③ 保持采集条件稳定目标物体需保持可见,减少背景变化
④ 连续完成采集统计量在全部采集结束后生成

5.2 采集命令

lerobot-record \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_awesome_follower_arm \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: \"MJPG\"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: \"MJPG\"}}" \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_awesome_leader_arm \
    --display_data=true \
    --dataset.repo_id=seeedstudio123/arm-test \
    --dataset.num_episodes=50 \
    --dataset.single_task="Grab the black cube" \
    --dataset.push_to_hub=false \
    --dataset.episode_time_s=30 \
    --dataset.reset_time_s=30

关键参数说明:

  • --dataset.push_to_hub=false数据本地保存,不推 Hub(数据保存在本地缓存目录 ~/.cache/huggingface/lerobot/ 下)
  • --dataset.num_episodes:采集条数(默认 50)
  • --dataset.single_task:任务描述,评估需使用相同任务描述
  • 键盘控制: 下一集, 重录,ESC 停止上传

💡 采集是最"费手"的环节:50 条示范意味着 50 次把方块放回原位、重新摆好、再抓取。但数据质量直接决定策略上限,宁慢勿快、条件一致

六、ACT 策略训练

6.1 训练与部署分工

Jetson 端训练端
完成相机接入与数据采集可在独立 GPU 设备上完成训练
完成串口联调与遥操作验证约 50 条数据通常需要数小时
加载权重并执行策略评估pretrained_model 部署回 Jetson

💡 这是典型的边缘-服务器协同模式:Jetson 负责采数据、跑推理,耗时的训练交给 GPU 完成,最后把权重拿回来。

6.2 训练命令

lerobot-train \
    --config_path=outputs/train/act_so101_test/checkpoints/last/pretrained_model/train_config.json \
    --resume=true

训练完成后,权重保存在 outputs/train/act_so101_test/checkpoints

6.3 训练耗时参考

设备耗时(约 50 条数据)
RTX 3060 8G约 6 小时
RTX 4090 / A100约 2~3 小时

⚠️ 训练完务必确认 pretrained_model 目录完整,别只拷了 last 权重——评估时要加载的是完整模型包。

七、策略部署与评估:让从臂"自己干活"

7.1 评估四步

步骤要点
① 加载训练权重评估流程与采集相近,改为指定 --policy.path
② 相机标识保持一致front / side 需与采集阶段完全一致,否则无法正确加载统计量
③ 单独保存评估数据repo_ideval_ 开头,避免覆盖原示范数据
④ 确认自主执行结果从臂完成接近、抓取与放置,即完成本地闭环

7.2 评估命令

lerobot-eval \
    --policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model \
    --robot.type=so101_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_awesome_follower_arm \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: \"MJPG\"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: \"MJPG\"}}" \
    --dataset.repo_id=eval_arm-test \
    --dataset.single_task="Grab the black cube"

📝 lerobot-eval 是 LeRobot 框架的标准评估命令,--policy.path 指定训练好的模型权重目录。

7.3 验证结果

📷 配图 3:从臂自主接近方块(front 视角截图)

📷 配图 4:从臂抓取方块瞬间(side 视角截图)

📷 配图 5:从臂完成放置、任务闭环(终端日志截图)

部署回 Jetson 后,从臂不再需要主臂"牵着走":它自己观察画面、推理动作、执行抓取——接近 → 抓取 → 放置,本地闭环跑通。

💡 看着机械臂在没有人工干预的情况下自己把方块放进盒子,真的会起鸡皮疙瘩——这就是具身智能的魅力。

八、常见问题与排查

8.1 课程总结的六大常见问题

类别现象解决办法
🔌 串口无法连接 /dev/ttyACM0先检查串口权限(chmod 666
🖥️ CUDA安装后 PyTorch 变为 CPU 版本重新安装 GPU 版本并验证 cuda.is_available()
📷 相机识别不到 / 编号错乱USB 相机应直连设备;重启后需重新确认编号
🔧 校准动作异常更换或维修舵机后,删除原标定文件并重新校准
📊 评估报错 File exists: '.../eval_xxxx'重复评估前先删除旧的 eval_ 目录,并核对相机标识
🗂️ 数据训练效果差机位变动、中途中断或背景变化会影响数据一致性

8.2 实机常见报错速查

报错处理
Motor 'gripper' was not found检查线缆/电源
Could not connect on portsudo chmod 666 /dev/ttyACM*
No valid streamconda install ffmpeg=7.1.1
Failed to sync read检查电源/总线是否松动
Magnitude exceeds 2047断电重上电或重新校准

⚠️ 经验:报错别慌,顺着日志倒推——LeRobot 的报错信息基本都指向真实原因,串口权限和依赖版本占了 80% 的问题。

九、总结与展望

9.1 本周目标达成情况

  • ✅ 理解具身智能核心概念,知道智能如何在身体与环境的互动中完成
  • ✅ 掌握 ACT 算法原理,理解 Transformer 如何将视觉输入转化为连续关节动作
  • ✅ 使用 LeRobot 框架完成主从臂校准、相机配置和遥操作
  • ✅ 采集 50 条示范数据并在 GPU 上训练 ACT 策略
  • ✅ 将训练好的策略部署回 Jetson,完成从感知到决策到执行的本地闭环

9.2 四周学习路径回顾

从第一次点亮 Jetson 到现在,四周走了整整一条 AI 落地链路:

Week1 环境搭建(JetPack / SSH / CUDA / TensorRT)
   ↓
Week2 计算机视觉(OpenCV / 目标检测 / 模型部署)
   ↓
Week3 生成式 AI(Ollama / VLM / reSpeaker / 离线语音助手)
   ↓
Week4 具身智能(LeRobot / SO-ARM101 / ACT / 自主抓取放置)

从"跑通环境"到"看见世界",再到"开口说话",最后"动手做事"——Jetson 从一块开发板,变成了一个能感知、能决策、能行动的具身智能体。

9.3 后续可以玩的方向

  • 🦾 双臂 SO-ARM 系统(更复杂的双主双从配置)
  • 🎯 泛化测试:不同颜色/位置/光照下的抓取效果
  • ⚡ TensorRT 加速 ACT 推理,降低时延
  • 🧪 Isaac Lab / sim-to-real:先在仿真里训练,再迁移到真机

致谢

感谢 Seeed Studio 的课程组织与工程师答疑,感谢 NVIDIA Jetson 平台,也感谢训练营群里一起踩坑的同学们。

参考资料

  • Seeed 课程资源:https://sensecraft.seeed.cc/ai-lab/zh/tutorials/j/robotics/overview
  • Seeed LeRobot Wiki:https://wiki.seeedstudio.com/cn/lerobot_so100m/
  • Seeed-Projects/lerobot 仓库:https://github.com/Seeed-Projects/lerobot
  • Hugging Face LeRobot 官方框架:https://github.com/huggingface/lerobot
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐