1. 项目概述:为你的LeRobot So-Arm Max注入灵魂
如果你已经完成了LeRobot So-Arm Max机械臂的主体组装,那么恭喜你,你的机器人已经拥有了健壮的“骨骼”和“肌肉”。但要让这台机械臂真正活过来,成为一个能够感知、学习并执行任务的智能体,我们还需要为它安装“眼睛”和“大脑”,并教会它如何与世界互动。这正是“[LeRobot So-Arm Max] 03. 추가부품 조립 가이드 [하루만에 따라하는 Physical AI]”这一部分要解决的核心问题。
简单来说,这篇指南将带领你完成从“裸机”机械臂到“智能体”的最后一步。这不仅仅是拧几个螺丝、接几根线那么简单,它涉及的是整个Physical AI(物理人工智能)工作流的搭建。你需要为机械臂安装视觉传感器(通常是摄像头),配置好与计算机(或Jetson等边缘计算设备)的通信,并搭建起LeRobot框架所需的全套软件环境。最终目标,是让你的So-Arm Max能够通过摄像头“看到”物体,通过你手把手地“教导”(遥操作)学习动作,并最终自主地完成如抓取、放置等任务。
这个过程听起来复杂,但官方和社区已经做了大量工作来降低门槛。本指南将基于Seeed Studio的官方Wiki、社区实践经验以及我自己的踩坑记录,为你梳理出一条清晰、可操作的路径。无论你是机器人爱好者、AI学习者,还是希望快速验证想法的开发者,只要跟着步骤走,完全有可能在一天内搭建起一个可运行、可学习的Physical AI原型系统。
2. 核心组件与准备工作:兵马未动,粮草先行
在开始动手之前,我们必须明确需要哪些“附加部件”,以及为什么需要它们。这能帮你避免在组装过程中因缺少零件而中断,也能让你理解每个部件在系统中的作用。
2.1 视觉感知模块:机械臂的“眼睛”
这是最重要的附加组件。没有视觉,机械臂就是一个盲人,只能在预设的坐标下工作,无法应对真实世界中物体位置、姿态的变化。
1. 摄像头选型与考量LeRobot框架支持多种摄像头,你需要根据需求、预算和开发平台选择:
- 普通USB网络摄像头:最常见、成本最低的选择。支持OpenCV驱动,分辨率可达1080p。适合光线稳定、任务简单的场景(如抓取颜色鲜艳、背景单一的物体)。注意:务必选择支持MJPG等硬件压缩格式的摄像头,以减轻USB带宽和CPU解码压力,保证图像传输的实时性(30FPS)。
- Intel RealSense深度摄像头:提供RGB彩色图像和深度信息。深度信息对于精确判断物体距离、避免碰撞至关重要,尤其在抓取堆叠物体或需要避障的场景下优势明显。但RealSense在部分Linux系统(尤其是某些内核版本)上驱动稳定性可能是个挑战。
- Orbbec Gemini2等第三方深度相机:如官方Wiki中提到的,需要通过克隆特定SDK并修改LeRobot源代码来集成。这提供了更多硬件选择,但属于进阶操作,对开发者的环境配置和排错能力要求较高。
实操心得:对于初次尝试者,我强烈建议从一款支持MJPG编码的普通USB摄像头开始。它的驱动最简单,兼容性最好,能让你快速跑通整个流程,建立信心。深度相机可以留作后续功能升级。
2. 安装与固定你需要将摄像头牢固地安装在机械臂工作空间的上方或侧方,确保其视野能完整覆盖机械臂末端执行器(夹爪)的活动范围以及目标物体区域。可以使用万向支架、小型三脚架,甚至3D打印一个专用的安装架。关键点:安装后,摄像头的位置和角度在数据采集和部署阶段必须保持绝对固定,任何微小的变动都会导致训练好的模型失效。
2.2 计算与控制核心:机械臂的“大脑”
机械臂本体的控制板(Motor Control Board)负责驱动舵机,但它不具备AI计算能力。因此,我们需要一个更强大的“大脑”来运行LeRobot框架、处理图像、进行推理决策。
1. 主机选择
- 带有NVIDIA GPU的台式机/笔记本电脑:这是最强大的选择。CUDA加速能大幅缩短模型训练时间(从数十小时缩短到数小时)。适合进行模型训练和算法开发。
- NVIDIA Jetson系列开发板(如Jetson Orin NX/Nano):这是部署端的理想选择。Jetson板卡功耗低、体积小,可以集成到机器人本体上,实现真正的嵌入式AI。官方推荐使用reComputer J4012等载板。
- 没有独立GPU的电脑:也可以运行,但仅限于数据采集和模型推理(如果模型较小)。训练过程将异常缓慢,甚至无法进行,不推荐。
2. 系统与环境准备这是软件部分的重中之重,也是新手最容易卡住的地方。请严格按照以下步骤操作:
- 操作系统:Ubuntu 22.04 LTS是官方支持和社区验证最多的系统,能最大程度避免依赖库冲突。
- 安装Miniconda:Python环境管理神器,可以创建独立的虚拟环境,避免污染系统Python。
# 对于x86_64架构的电脑 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 echo 'export PATH="$HOME/miniconda3/bin:$PATH"' >> ~/.bashrc source ~/.bashrc - 创建并激活LeRobot专用环境:
conda create -n lerobot python=3.10 -y conda activate lerobot - 安装PyTorch与CUDA:这是深度学习的基础。务必前往PyTorch官网,根据你的CUDA版本选择正确的安装命令。例如,对于CUDA 12.1:
安装后,在Python中运行pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121import torch; print(torch.cuda.is_available())验证是否返回True。 - 克隆并安装LeRobot:
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot cd ~/lerobot # 安装基础依赖和舵机控制支持 pip install -e ".[feetech]" - 安装FFmpeg:用于处理视频数据。
conda install ffmpeg -c conda-forge
注意事项:网络环境可能导致
pip install缓慢或失败。建议配置国内镜像源(如清华、阿里云)。对于Jetson设备,安装过程更为复杂,需要安装JetPack SDK后,再安装针对ARM架构预编译的PyTorch wheel包,请务必参考NVIDIA官方论坛或Seeed的Jetson专用教程。
2.3 线缆与电源:确保稳定通信与供电
- USB数据线:用于连接机械臂控制板和电脑。准备两根质量好、屏蔽性能佳的USB-A to USB-C线。劣质线缆可能导致通信断续,引发诡异的“舵机失联”错误。
- 电源:这是安全红线!
- 标准版(Arm Kit):两个机械臂都使用5V 4A电源。
- 专业版(Arm Kit Pro):Leader Arm(主控臂)使用5V电源,Follower Arm(跟随臂)使用12V电源。绝对不要接反!接反电压会瞬间烧毁舵机。建议用标签明确区分两个电源适配器。
- 舵机总线:用于串联6个舵机的三芯线。组装时确保每个接口插到底,锁紧卡扣。松动的连接是后期调试中最令人头疼的间歇性故障来源。
3. 软件环境深度配置与舵机校准
环境搭建好后,第一件硬件相关的事就是让电脑“认识”你的机械臂,并告诉它每个关节的“零位”和运动范围。这就是舵机配置与校准。
3.1 识别硬件端口
将两个机械臂的控制板分别通过USB连接到电脑,并接通对应电压的电源(先别急着组装,此步骤在舵机散装时进行更方便)。
- 打开终端,进入
lerobot环境,运行端口查找工具:lerobot-find-port - 程序会列出类似
['/dev/ttyACM0', '/dev/ttyACM1']的端口。它会提示你拔掉一个机械臂的USB线,按回车,然后告诉你哪个端口消失了。通过这个方法,分别确定Leader Arm和Follower Arm对应的端口号(例如/dev/ttyACM0是Follower,/dev/ttyACM1是Leader)。记下这两个端口号,后续所有命令都会用到。 - 授予串口权限(每次重新插拔后可能需要重新执行):
sudo chmod 666 /dev/ttyACM*
3.2 关键步骤:舵机ID配置与校准
这是整个硬件准备中最精细的一步。SO-ARM101的Leader Arm前三个关节使用了不同减速比的舵机,必须正确对应。
区分舵机型号:根据你的套件版本,核对舵机型号。
- Follower Arm (F1-F6):所有6个关节均为ST-3215-C001 (7.4V)或C018/C047 (12V),减速比1:345。
- Leader Arm (L1-L6):
- L1, L3:ST-3215-C044 (7.4V), 减速比1:191
- L2:ST-3215-C001 (7.4V), 减速比1:345
- L4, L5, L6 (夹爪):ST-3215-C046 (7.4V), 减速比1:147
为舵机写入ID:LeRobot要求每个机械臂的6个舵机具有唯一的ID(1-6)。使用
lerobot-setup-motors脚本。务必一个关节一个关节地操作。- 校准Follower Arm:
脚本会从夹爪(ID 6)开始,依次提示你“仅连接夹爪舵机并按回车”。你需按照提示,每次只将一个舵机连接到控制板,按回车,等待脚本为其设置ID和波特率。完成后,再按提示连接下一个(腕部旋转,ID 5),直至肩部平移(ID 1)。全部完成后,再将所有舵机用三芯线串联起来,第一个舵机(ID 1)连接控制板。lerobot-setup-motors \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 # 替换为你的Follower端口 - 校准Leader Arm:过程类似,但指定
--teleop.type=so101_leader。lerobot-setup-motors \ --teleop.type=so101_leader \ --teleop.port=/dev/ttyACM1 # 替换为你的Leader端口
- 校准Follower Arm:
避坑指南:
- 顺序是关键:脚本提示的顺序(6->5->4->3->2->1)就是机械臂从末端到基座的物理关节顺序。严格按照这个顺序操作和后期组装。
- 电源确认:在给舵机上电前,再次确认电源电压与舵机型号匹配。烧舵机就在一瞬间。
- 连接稳固:每次连接单个舵机时,确保三芯线插紧。可轻微晃动线缆,观察舵机指示灯是否闪烁,以判断接触是否良好。
- 标签标记:在舵机上用标签纸写上其ID(如F1, L2),后续组装和排查问题时一目了然。
4. 机械臂本体与附加组件的最终组装
完成舵机校准后,就可以参考官方提供的3D打印文件和图解步骤,将舵机安装到打印好的结构件中,组装成完整的Leader Arm和Follower Arm。这部分是纯机械操作,需要的是耐心和细心。
组装核心注意事项:
- 螺丝紧固:使用合适的螺丝刀,确保所有螺丝紧固到位,但切忌用力过猛导致塑料件滑丝。可以分两次拧紧,先预紧所有螺丝,再逐一最终紧固。
- 线缆管理:SO-ARM101设计了线缆卡扣。组装时,将舵机线缆顺势放入卡槽内,避免线缆被关节活动部位挤压或缠绕。整洁的走线不仅是美观,更是为了长期运行的可靠性。
- 关节顺滑度:在紧固舵机与结构件之前,可以手动旋转舵机输出轴,确保其能自由转动而无卡滞。安装后,通电让每个关节缓慢运行一遍全行程,听是否有异响,观察运动是否平稳。
- 末端执行器:Follower Arm末端是夹爪,Leader Arm末端是一个手柄(用于人手抓持进行遥操作)。确保夹爪的开合动作顺畅,无摩擦。
5. 系统集成与软硬件联调
组装好的机械臂、安装好的摄像头、配置好环境的电脑——现在要把它们全部连接起来,进行第一次“全身检查”。
5.1 双臂与摄像头连接
- 连接机械臂:将组装好的Follower Arm和Leader Arm分别通过USB连接到电脑的指定端口(即之前校准使用的端口),并接通正确的电源。
- 连接摄像头:将USB摄像头插入电脑的USB 3.0端口(蓝色接口)。如果使用多个摄像头,尽量避免使用同一个USB HUB,以防带宽不足导致图像卡顿或丢失。
- 查找摄像头索引:
命令会输出所有检测到的OpenCV摄像头信息,记下你所用摄像头的python -m lerobot.find_cameras opencvId(通常是0, 2, 4等数字)。
5.2 首次遥操作测试
这是激动人心的时刻,你将首次通过手动操控Leader Arm来驱动Follower Arm。
运行以下命令(请替换为你实际的端口号和摄像头ID):
sudo chmod 666 /dev/ttyACM* # 确保权限 lerobot-teleoperate \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower \ # 给你的Follower起个名字 --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \ --teleop.type=so101_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_leader \ # 给你的Leader起个名字 --display_data=true如果一切顺利,你应该看到:
- 一个GUI窗口弹出,显示摄像头拍摄的实时画面。
- 你可以用手握住Leader Arm的手柄,移动它。Follower Arm会以较低的刚度跟随你的动作。
- 在终端中,会滚动显示实时控制频率等数据。
常见问题与排查:
- Follower Arm不动:检查USB连接、电源、端口号是否正确。在终端中查看是否有权限错误或连接超时的报错。运行
ls /dev/ttyACM*确认设备存在。- 摄像头无画面:检查
index_or_path参数是否正确。尝试更换USB接口。对于某些摄像头,可能需要指定不同的fourcc格式,如YUYV,但MJPG的兼容性通常最好。- 运动卡顿或不跟手:这可能是控制循环频率不足。确保你的电脑性能足够,并且没有其他大型程序占用CPU/GPU。可以尝试降低摄像头分辨率(如320x240)或帧率(如15fps)进行测试。
- 报错
AttributeError: module 'rerun' has no attribute 'scalar':这是一个已知的依赖冲突。降级rerun-sdk版本即可解决:pip install rerun-sdk==0.23
5.3 双摄像头与深度相机集成
单摄像头提供了二维视角,但增加一个侧视摄像头能提供立体视觉信息,有助于模型理解深度。如果使用深度相机(如Orbbec),则能直接获得距离信息。
添加第二个摄像头: 只需在--robot.cameras参数中添加另一个配置即可,例如:
--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'}}"集成Orbbec深度相机(进阶): 如官方Wiki所述,需要额外步骤:
- 克隆并安装
pyorbbecsdk。 - 下载对应的Python wheel包并安装。
- 克隆特定的Orbbec相机驱动到LeRobot的摄像头目录。
- 修改LeRobot源代码中的
utils.py和__init__.py文件,注册新的相机类型。 - 在命令中使用
type: orbbec并设置focus_area参数来限定有效的深度范围。
这个过程涉及修改源码,建议在完全熟悉基础流程后再尝试。首次搭建务必以快速跑通标准流程为目标。
6. 数据采集、训练与评估全流程实操
软硬件联调成功后,你的Physical AI系统就具备了“学习”的能力。接下来就是教它完成任务的核心循环:演示(数据采集)-> 学习(模型训练)-> 执行(策略评估)。
6.1 数据采集:录制演示数据
你需要通过遥操作,手动控制机械臂完成你想要它学习的任务(比如“抓取积木块放入盒子”),同时系统会录制关节角度、电机状态和摄像头图像。
运行数据采集命令(以本地保存为例):
lerobot-record \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower \ --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \ --teleop.type=so101_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_leader \ --display_data=true \ --dataset.repo_id=my_first_dataset \ # 数据集名称 --dataset.num_episodes=10 \ # 录制10条演示 --dataset.single_task="Pick the red block and place it in the bin." \ # 任务描述 --dataset.push_to_hub=false \ # 先保存在本地 --dataset.episode_time_s=20 \ # 每条演示最长20秒 --dataset.reset_time_s=10 # 每次重置间隔10秒采集数据时的黄金法则:
- 一致性:摄像头位置、光照环境、背景物体尽量保持不变。变化的背景会被模型当作噪声学习。
- 多样性:在任务成功的前提下,引入合理的多样性。例如,抓取物体时,可以从稍微不同的角度、位置接近;放置时,可以放在盒子的不同角落。
- 质量高于数量:10条干净、成功的演示,远胜于100条包含失败或混乱操作的演示。录制时,如果某次操作失误,可以按键盘左箭头取消当前回合并重录。
- 键盘控制:
- 右箭头:提前结束当前回合(如果觉得已经演示完了)并开始下一回合。
- 左箭头:取消当前回合,重新录制。
- ESC:终止整个采集会话。
6.2 模型训练:让AI从数据中学习
数据采集完成后,就可以用LeRobot内置的算法进行训练。这里以最常用的ACT(Action Chunking Transformer)算法为例。
lerobot-train \ --dataset.repo_id=my_first_dataset \ # 使用刚才采集的数据集 --policy.type=act \ # 使用ACT算法 --output_dir=outputs/train/act_model \ # 模型输出目录 --job_name=my_first_training \ # 训练任务名 --policy.device=cuda \ # 使用GPU训练 --wandb.enable=false \ # 关闭wandb日志(首次可关) --steps=50000 # 训练步数,可根据任务复杂度调整训练参数解读与调优:
--steps:训练总步数。简单任务(如单一位置抓取)可能2-3万步就收敛;复杂任务可能需要10万步以上。观察训练日志中的损失(loss)值,当其下降并趋于平稳时,说明模型可能已经学好了。--policy.device:根据硬件选择cuda(NVIDIA GPU),mps(Apple Silicon), 或cpu(不推荐训练,极慢)。--wandb.enable=true:如果开启,需要先注册Weights & Biases账号并登录 (wandb login)。它能提供非常美观的训练曲线和监控面板。- 训练时间:在RTX 3060 8GB笔记本上,训练5万步大约需要3-6小时。在RTX 4090或A100上会快很多。
6.3 策略评估:检验学习成果
训练完成后,模型权重会保存在output_dir指定的目录下(例如outputs/train/act_model/checkpoints/last/pretrained_model)。现在,断开Leader Arm,让Follower Arm自己动起来!
lerobot-record \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_follower \ --robot.cameras="{front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: 'MJPG'}}" \ --display_data=false \ # 评估时可以不显示图像以节省资源 --dataset.repo_id=my_evaluation \ # 评估数据保存名 --dataset.single_task="Pick the red block and place it in the bin." \ # 必须与训练时一致! --policy.path=outputs/train/act_model/checkpoints/last/pretrained_model # 加载训练好的模型评估阶段的关键点:
--dataset.single_task:此处的任务描述字符串必须与训练数据采集时使用的完全一致。因为ACT等模型会将此文本编码作为条件之一。--robot.cameras:摄像头的配置(类型、索引、分辨率、键名如front)也必须与训练时完全一致。任何不一致都会导致模型因输入分布不同而失效。- 观察与迭代:模型不会第一次就完美成功。观察它的失败模式:是找不到物体?是抓取位置不对?还是抓取后掉落?根据失败原因,你可能需要:1) 补充更多针对性的演示数据;2) 调整训练步数;3) 尝试不同的算法(如Diffusion Policy, PI0)。
7. 进阶技巧与深度问题排查
当你完成了第一个“抓取-放置”的闭环,可能会遇到更具体的问题,或者希望提升性能。这里分享一些进阶经验。
7.1 提升模型性能的实用技巧
- 数据增强:虽然LeRobot当前版本的数据加载器可能未内置强数据增强,但你可以在图像预处理阶段尝试模拟光照变化、颜色抖动等,以提升模型的鲁棒性。这需要修改源代码中的数据集加载部分。
- 多任务学习:在一个数据集中包含多个相关任务(如“抓取红方块”、“抓取蓝方块”、“将方块放入左边盒子”、“放入右边盒子”),并用不同的
single_task描述区分。模型可能会学到更通用的表征。 - 使用预训练模型:LeRobot提供了如
smolvla_base等预训练模型。你可以在此基础上用自己少量的数据进行微调(Fine-tuning),这通常比从头训练收敛更快、效果更好,尤其在小数据集上。lerobot-train \ --policy.path=lerobot/smolvla_base \ # 加载预训练模型 --dataset.repo_id=my_small_dataset \ ... # 其他参数 - 仿真验证:在将策略部署到真实机器人前,可以利用LeRobot支持的仿真环境(如LIBERO基准测试套件)进行快速、安全的算法验证和超参数调优。
7.2 深度问题排查清单
即使按照指南操作,也可能会遇到“玄学”问题。以下是一个系统性的排查清单:
问题:机械臂突然不动,终端报错
ConnectionError: Failed to sync read 'Present_Position'- 排查:这是典型的通信中断。第一,检查所有舵机三芯线的串联接口是否松动,特别是经常活动的关节处。第二,检查USB线是否被意外拉扯。第三,尝试重新给机械臂断电再上电。第四,重新执行
sudo chmod 666 /dev/ttyACM*。
- 排查:这是典型的通信中断。第一,检查所有舵机三芯线的串联接口是否松动,特别是经常活动的关节处。第二,检查USB线是否被意外拉扯。第三,尝试重新给机械臂断电再上电。第四,重新执行
问题:训练时损失(loss)不下降,或评估时机械臂动作混乱
- 排查:
- 数据一致性:确保评估时的摄像头画面与训练数据在亮度、颜色、视角上无明显差异。晚上训练的数据,白天评估可能失效。
- 任务描述:百分百确认训练和评估时的
--dataset.single_task字符串完全一致,包括标点符号。 - 摄像头键名:确认
--robot.cameras字典中的键(如front)在训练和评估命令中一致。 - 数据质量:回放采集的数据集 (
lerobot-dataset-viz),检查是否有无效的、失败的演示片段混入其中。 - 训练是否充分:增加
--steps参数,继续训练。观察loss曲线,看是否还有下降空间。
- 排查:
问题:评估时提示
File exists: '.../eval_...'- 解决:这是因为之前评估生成的数据集文件夹已存在。直接删除该文件夹即可:
rm -rf ~/.cache/huggingface/lerobot/.../eval_*。
- 解决:这是因为之前评估生成的数据集文件夹已存在。直接删除该文件夹即可:
问题:更换或维修了某个舵机后,机械臂运动异常
- 解决:必须重新校准该机械臂。删除对应的校准缓存文件:
rm -rf ~/.cache/huggingface/lerobot/calibration/robots/YOUR_ROBOT_ID.json(或teleoperators/下的对应文件),然后重新运行lerobot-calibrate命令。
- 解决:必须重新校准该机械臂。删除对应的校准缓存文件:
问题:使用深度相机时,程序崩溃或找不到设备
- 排查:深度相机(如RealSense, Orbbec)对USB带宽和驱动要求极高。首先确保相机连接到电脑的USB 3.0或以上端口。其次,在Linux上,可能需要将用户加入
video和plugdev组,并配置udev规则。Orbbec相机的集成需要严格按照官方Wiki的步骤,任何一步的疏漏都可能导致失败。
- 排查:深度相机(如RealSense, Orbbec)对USB带宽和驱动要求极高。首先确保相机连接到电脑的USB 3.0或以上端口。其次,在Linux上,可能需要将用户加入
将LeRobot So-Arm Max从一堆零件变成能通过观察学习任务的智能机器人,这个过程本身就是对Physical AI最生动的实践。它融合了机械装配、嵌入式系统、计算机视觉和深度学习。最重要的不是一次成功,而是在遇到每一个报错、每一次失败时,学会如何利用终端日志、社区资源和系统性思维去排查问题。当你看到机械臂第一次依靠自己“学会”的动作完成任务时,那种成就感是无与伦比的。现在,你的机器人已经准备好了,接下来就是发挥你的创意,用更多的任务和场景去训练它,探索物理智能的边界。