USB 连接与端口识别
3.1 端口命名规则
| 系统 | 端口名长什么样 | 在哪查设备 |
|---|---|---|
| macOS | /dev/tty.usbmodem… | 终端 ls /dev/tty.usb* |
| Ubuntu / Linux | /dev/ttyUSB0 或 /dev/ttyACM0 | ls /dev/ttyUSB* /dev/ttyACM*;lsusb 只能看有没有识别到芯片,给不出端口名 |
| Windows | COM3 / COM4 … | 设备管理器 → 端口 (COM 和 LPT) |
写参数时的对应关系:--robot.port=/dev/tty.usbmodem…(macOS)、--robot.port=/dev/ttyUSB0(Linux)、--robot.port=COM3(Windows)。数字部分以你机器上实际查到的为准——重新插拔、换 USB 口、重启都可能让它变号。
3.2 端口权限要求
**macOS 不需要任何权限命令。**正常桌面登录下 /dev/tty.usbmodem* 默认就允许当前登录用户打开,插上即用,不用 sudo、也不用改权限。要做的只有查端口这一句:
ls /dev/tty.usb*真正需要改权限的只有 Linux / Ubuntu——设备属 root:dialout、权限 crw-rw----,普通用户默认不在 dialout 组,于是报 Permission denied:
# 一次性解决: 加入 dialout 组 (必须重新登录才生效, 新开终端不够)
sudo usermod -aG dialout $USER
# 临时救急: 只对当前这个设备生效, 重启后失效
sudo chmod 666 /dev/ttyUSB0Windows 也没有 Unix 式权限问题:装好驱动、端口没被别的程序独占即可,一般不需要管理员权限。
3.3 USB 拓扑:相机直连,机械臂可以走集线器
一台 Mac 上同时插三个 USB 设备(两块驱动板 + 两路相机),怎么插会直接影响后面录制的稳定性:
- 相机尽量直连电脑——尤其是装在末端的那台。录制时对帧率最敏感的就是它,一旦掉帧就是
TimeoutError。 - 机械臂的两条信号线可以走集线器。它们只跑 UART 控制报文,带宽压力小,接集线器一般没问题。
- 别把相机和机械臂插在同一个 hub 的相邻口上,供电和带宽会互相挤。
3.4 端口名会不会变
macOS 的 /dev/tty.usbmodem… 后面那串数字来自驱动板 USB 芯片的序列号,是跟着板子走的。两块板的名字(如 …5B8E1136841 与 …5B790188161)就是这样区分开的:换 USB 口、重启、插拔顺序变化通常都不会互换。真正会让它变的是换了一块板子。
不过别赌这一点,确认「谁是谁」最省事的办法是只插一块:终端里 ls /dev/tty.usb*,多出来的那个就是它。
Linux 上可以彻底固定——用 udev 规则按序列号建一个永远不变的名字。先取出序列号:
udevadm info --query=property --name=/dev/ttyACM0 \
| sed -n 's/^ID_SERIAL_SHORT=\(.*\)$/ATTRS{serial}=="\1"/p'
# 输出示例:ATTRS{serial}=="5A7C118736"把两条规则写进 /etc/udev/rules.d/99-my-robot.rules:
# Rule for the Leader Arm
SUBSYSTEM=="tty", ATTRS{serial}=="5A7C118736", SYMLINK+="leader_arm", MODE="0666"
# Rule for the Follower Arm
SUBSYSTEM=="tty", ATTRS{serial}=="5A7C118880", SYMLINK+="follower_arm", MODE="0666"几个字段:SUBSYSTEM=="tty" 表示串口设备;ATTRS{serial} 按序列号精确匹配;SYMLINK+="leader_arm" 建出 /dev/leader_arm;MODE="0666" 顺手把权限问题一起解决(以后不用再 chmod)。
sudo udevadm control --reload-rules && sudo udevadm trigger
# 拔插设备后再看,应为 /dev/leader_arm -> ttyACM0 这样的软链
ls -l /dev/leader_arm /dev/follower_arm之后所有命令里的端口都写成 --robot.port=/dev/follower_arm、--teleop.port=/dev/leader_arm,再也不用每次 lerobot-find-port。Mac 没有 udev,享受不到这一条,但上面第一段的结论说明在 Mac 上这个需求本身不强烈。