Jetson Orin Nano Super 8GB 具身智能实战全记录:LeRobot + SO-ARM101 机械臂 + ACT 策略,从遥操作采集到自主抓取放置
一、引言
第三周我们让 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 软件环境
| 软件 | 版本/说明 |
|---|---|
| JetPack | 6.0+(L4T 对应版本) |
| Python | 3.10(conda 独立环境) |
| LeRobot | Seeed-Projects/lerobot(教程验证稳定版) |
| PyTorch | GPU 版(torch.cuda.is_available() 必须为 True) |
| OpenCV | 4.10.0.84 |
| ffmpeg | 7.1.1(conda-forge) |
| numpy | 1.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 | 使用教程指定的稳定版本,别用官方主分支 |
| GPU | torch.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_id 以 eval_ 开头,避免覆盖原示范数据 |
| ④ 确认自主执行结果 | 从臂完成接近、抓取与放置,即完成本地闭环 |
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 port | sudo chmod 666 /dev/ttyACM* |
No valid stream | conda 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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)