从臂装在底座上(连小推车),吃 12V 大幅供电,是端到端链路里"动手"的那一只。
| 接口 | USB 串口 · /dev/arm_slave_left / arm_slave_right |
|---|---|
| 关节 | SO100 六关节(Joint1~5 + 夹爪) |
| 供电 | 12V 8A(重载,举东西用) |
| 序列号 | 5B79019324(左) / 5B79018452(右) |
这是整门课的"通电第一课"。你在一台 Ubuntu 22.04 主机上依次装好 NVIDIA 驱动、Miniconda、LeRobot 0.4.1,写入机械臂与相机的 udev 别名规则,再对照第 01 章认识从臂、主臂、摄像头三大件。做完本实验,ls /dev/arm_* 和 ls /dev/cam_* 应能列出全部 7 个设备名——这是后续三个实验一切操作的地基。
本实验按五星学习法组织:先用一个真实故障聚焦问题,再激活旧知(Linux 设备文件),接着示证新知(硬件三大件 + 连接拓扑),然后动手应用新知完成十一步部署,最后借排障与拓展融会贯通。全程切成 8 段微课、每段不超过 15 分钟,段间停顿 1~2 分钟消化;纯讲授合计约 100 分钟,其余课时用于动手实操与个别辅导。
| 课段 | 五星阶段 | 时长 | 对应章节 | 本段任务 |
|---|---|---|---|---|
| 课段 1 | 聚焦问题 | 12 min | §01 + §02 前半 | 抛出现场故障"设备名变了",明确本课要解决的目标 |
| 课段 2 | 激活旧知 | 8 min | §02 后半 | 用 /dev、tty、USB 枚举三条旧知解释故障成因 |
| 课段 3 | 示证新知 | 15 min | §03 | 对照实物认识从臂、主臂、摄像头及关键参数 |
| 课段 4 | 示证新知 | 12 min | §06(回看 §02 流程) | 看懂"感知→决策→执行"拓扑与 udev"贴标签"原理 |
| 课段 5 | 应用新知 | 15 min | §04 阶段 A·B + §05 ①②③ | 完成驱动、Miniconda、LeRobot 安装(边讲边演) |
| 课段 6 | 应用新知 | 15 min | §04 阶段 C·D + §05 ④⑤⑥ | 写好 7 条 udev 规则并三重验收——课段 1 的故障就此根除 |
| 课段 7 | 应用新知 | 10 min | §07 | udev 别名配对自测,全对方可进入下一实验 |
| 课段 8 | 融会贯通 | 13 min | §08~§10 | 排障口诀收口,挑战题与思考题拔高迁移 |
讲课提示:课段 1/2 以讲授 + 提问为主;课段 3~6 边讲边演(实物 / 动画 / 命令行);课段 7 学员独立完成;课段 8 答疑拔高。段与段之间停顿 1~2 分钟,确认学员跟上再进下一段。
/dev/ttyACM0 突然变成了 /dev/ttyACM2。问题出在哪?带着这个故障听完全课——到课段 6 你会亲手让它永不复发。先打个比方:端到端(end-to-end)就像学炒菜不拆步骤——眼睛看到菜在哪(感知),大脑想怎么抓(决策),手直接伸过去(执行),中间不留"专门算坐标的模块、专门规划路径的模块"。具身智能的端到端策略也是这样:摄像头画面直接进模型,模型直接输出关节角度。而要让这条链路跑起来,先得把三个"端"物理连好:
/dev 下每个文件都代表一个设备;② 串口设备挂在 ttyACM* / ttyUSB* 名下;③ USB 是热插拔总线,内核按"谁先被枚举"发号。三条合起来,正好解释课段 1 那个故障。为什么第 00 章要花大力气配 udev 规则?想想小区给快递柜编号:厂家给每块电路板烧了唯一"序列号"(serial),但 Linux 按插拔顺序把串口命名成 ttyACM0、ttyACM2……一重启顺序可能就变了。udev 规则就是"贴标签":不管插哪个口,只要序列号是 5B79018622,系统就给它挂上 /dev/arm_master_right 这个永久别名。
LZ-XL01 平台由三路摄像头(感知端)+ Ubuntu 主机(决策端)+ 四条 SO100 机械臂(执行端)组成。下表按"角色—作用—关键依赖"把三大件拆开讲:
从臂装在底座上(连小推车),吃 12V 大幅供电,是端到端链路里"动手"的那一只。
| 接口 | USB 串口 · /dev/arm_slave_left / arm_slave_right |
|---|---|
| 关节 | SO100 六关节(Joint1~5 + 夹爪) |
| 供电 | 12V 8A(重载,举东西用) |
| 序列号 | 5B79019324(左) / 5B79018452(右) |
主臂装在桌面(卡钳固定),被人手推着做动作,是"示教"的源头。
| 接口 | USB 串口 · /dev/arm_master_left / arm_master_right |
|---|---|
| 关节 | SO100 六关节(与从臂一一对应) |
| 供电 | 5V 2A(轻载,仅示范) |
| 序列号 | 5B61034506(左) / 5B79018622(右) |
左手 / 右手 / 头部各一路,直连主机固定端口,只为让画面永远知道自己来自哪个位置。
| 规格 | 640×480@30 · YUYV/MJPG |
|---|---|
| 接口 | USB 直连 · /dev/cam_left / cam_right / cam_head |
| 插口 | 主机背面端口 7 / 6 / 1(不可变动、不可走拓展坞) |
| 匹配 | 按 ID_PATH 写 udev 别名 |
▍实物对照:三大件长这样(来源:LZ-XL01 硬件指导文件)
▍安装位置与接口细节:主从臂怎么装、摄像头怎么架
环境搭建分四阶段推进:① 系统初始化(U 盘 / 驱动 / 拷贝)→ ② 软件栈(Miniconda / VS Code / LeRobot 依赖)→ ③ 设备认名(机械臂与相机的 udev 别名)→ ④ 验收(三重验证)。一页看完,命令编号与「05 关键命令」一一对应。
UBUNTU 22_0,插入后自动挂载到 /media/lz-xl01/UBUNTU 22_0/,里面装着安装包sudo apt install nvidia-driver-595-open nvidia-settings nvidia-prime -y → sudo reboot 重启 → nvidia-smi 验证cd /home/lz-xl01/ 后 unzip lerobot-0.4.1.zip;U 盘若无 Miniconda 安装包,可 wget 联网下载bash Miniconda3-latest-Linux-x86_64.sh -b 静默安装到 ~/miniconda3,再 conda init bash + source ~/.bashrc 使其生效apt install wget gpg apt-transport-https → 导入微软 GPG 密钥 → 添加官方源 → apt install code -ymain / r / msys2 三通道并 show_channel_urls yes;conda create -n lerobot python=3.10 -y,随后 conda activate lerobotcd ~/lerobot-0.4.1 → pip install --upgrade pip → pip install -e .(开发模式,命令后带清华源参数)/etc/udev/rules.d/99-lerobot-arms.rules(4 条,按序列号 5B61…/5B79… 定 arm_master/slave_left/right)→ usermod -aG dialout $USER99-lerobot-cameras.rules(3 条,按 ID_PATH 端口 7/6/1 定 cam_left/right/head)→ usermod -aG video $USERsudo udevadm control --reload-rules + sudo udevadm trigger(必须重启终端或注销重登,组权限才刷新)python --version → Python 3.10.x;ls /dev/arm_* → 列出全部 4 个别名;ls /dev/cam_* → 列出 cam_head / cam_left / cam_rightsudo reboot 再验证 nvidia-smi;conda init bash 后必须 source ~/.bashrc;usermod 加组后需注销重登,否则当前会话权限不生效——四阶段顺序不可颠倒。# ① 安装 NVIDIA 驱动并重启验证(第 00 章 二) sudo apt update sudo apt install nvidia-driver-595-open nvidia-settings nvidia-prime -y # 完成后:sudo reboot,再执行 nvidia-smi 验证 # ② 解压源码 + 静默安装 Miniconda(第 00 章 三、四) unzip lerobot-0.4.1.zip bash Miniconda3-latest-Linux-x86_64.sh -b ~/miniconda3/bin/conda init bash && source ~/.bashrc # ③ 创建环境并安装 LeRobot(第 00 章 七、八) conda create -n lerobot python=3.10 -y cd ~/lerobot-0.4.1 python3 -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple # ④ 写入机械臂 udev 规则(4 条序列号别名,第 00 章 九) sudo tee /etc/udev/rules.d/99-lerobot-arms.rules << 'EOF' SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d3", ATTRS{serial}=="5B61034506", SYMLINK+="arm_master_left", GROUP="dialout", MODE="0660" # 同样格式另写三条:5B79018622→arm_master_right 5B79019324→arm_slave_left 5B79018452→arm_slave_right EOF sudo usermod -aG dialout $USER # ⑤ 写入相机 udev 规则(3 条端口别名,第 00 章 十) sudo tee /etc/udev/rules.d/99-lerobot-cameras.rules << 'EOF' SUBSYSTEM=="video4linux", ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:7:1.0", ATTR{index}=="0", SYMLINK+="cam_left", GROUP="video", MODE="0660" # 端口6→cam_right 端口1→cam_head 同理 EOF sudo usermod -aG video $USER # ⑥ 重载规则 + 三重验证(第 00 章 十一) sudo udevadm control --reload-rules && sudo udevadm trigger python --version # → Python 3.10.x ls /dev/arm_* # → arm_master_left arm_master_right arm_slave_left arm_slave_right ls /dev/cam_* # → cam_head cam_left cam_right
下图是 LZ-XL01 平台的连接拓扑:主机居中,四条臂经串口、三路摄像头经 USB 汇入,udev 别名像"门牌号"一样把物理端口翻译成稳定设备名:
规则记不住就来配对:点一个设备序列号/端口,再点你认为正确的别名,即时判分:
conda init bash 后没执行 source ~/.bashrc,或没开新终端-i https://pypi.tuna.tsinghua.edu.cn/simple 清华源参数sudo udevadm control --reload-rules && sudo udevadm trigger 后重新插拔臂nvidia-smi → python --version → ls /dev/arm_* /dev/cam_*,哪一步断了修哪一步,别跳着查。udevadm info 查出新臂序列号。ATTRS{serial} 匹配机械臂、却用 ENV{ID_PATH} 匹配相机。为什么两类设备选用不同匹配字段?(提示:相机的多个 video 设备共享同一个 USB 序列信息吗?插口位置对相机为什么反而更重要?)/dev/ttyACM0 这种动态名,会把后面哪个实验(组装找口?校准带 port 参数?遥操作命令?)埋下什么样的坑?逐一推演说明。