【通用】相机 / 雷达 / 语音盒等 USB 设备不稳定排查思路


适用于产品: 幻尔科技树莓派系列(LanderPi / MentorPi / TurboPi / PuppyPi / ROSOrin Pro 树莓派版 等)
涉及模块: USB 枚举 / 集线器 / udev 设备别名 / ROS2 驱动节点
核心标签: 通用 树莓派 usb #图传相机 #激光雷达 #语音盒


:warning: 一句话顺序:先用 lsusb 确认设备在不在总线上,再用 lsusb -t 看速率和驱动,再用 dmesg 看是一条链掉还是一串掉;一串掉查共同上游,一条掉查那根线和那个口,最后才看 /dev 别名和 ROS 节点。顺序颠倒会浪费大量时间。

一、准备

(1)连上树莓派设备,进入 VNC 远程桌面。

(2)在桌面上打开终端,后续命令都在这个终端里敲。

二、第 1 层 枚举层:设备到底在不在总线上

lsusb

看设备有没有出现在列表里。这一步只回答"在不在",不回答"好不好"。

:light_bulb: 树莓派机型的 USB 口位有固定分工(Pi5):bus 1 是 USB 2.0 黑口,bus 3 是 USB 3.0 蓝口。相机、雷达、语音盒分别挂在哪个口,出厂是有要求的,换口会连带别名失效。

三、第 2 层 链路层:挂在哪个口、什么速率、被谁占着

lsusb -t

看三件事:

(1)设备挂在哪一条总线的哪一个端口(例如 1-2.1 表示 bus 1 的第 2 口下第 1 个子口)。

(2)速率是不是 480M 或 5000M。速率掉到 12M 说明协商降级,通常是线材或接触问题。

四、第 3 层 时间线:掉的是哪一条链(这一步信息量最大)

sudo dmesg -T | grep -iE 'usb|xhci|disconnect|over-current|error -7' | tail -80

看下面这几种信息,对照含义:

日志关键字 含义 排查方向
new device number 反复递增 在反复重枚举,一会儿好一会儿坏 线材、接触、供电
Cannot enable. Maybe the cable is bad? 使能失败 接触、线材、供电
over-current 电流超限 供电,优先换电源或去掉外设
USB disconnect 加父路径 掉了具体某条链 顺父路径查那一条
error -71 物理层(协议/握手) 线、口、上电时序
error -110 传输超时 供电、线材、固件卡死
error -32 收尾动作,单独出现不定论 需要结合上下文
干净的 disconnect 加干净重枚举 设备自己掉电或复位 供电波动、固件复位

判断口径:

(1)一次掉一个设备,查那根线和那个口。

(2)几个设备一起掉,说明共同上游有问题,比如集线器。优先排查集线器接口松动、集线器供电、通信线。

:magnifying_glass_tilted_left: 想在拔插的那一刻看到日志,必须加 --line-buffered,否则 grep 会缓存,等你看到时现场已经过去了:

sudo dmesg -Tw | grep --line-buffered -iE 'usb|3251'

五、第 4 层 命名层:/dev 别名还在不在

ls -l /dev/lidar /dev/ldlidar /dev/rrc /dev/ring_mic
ls -l /dev/serial/by-id

设备在总线上、别名却没了,基本就是插错口了。

原因在于 udev 规则分两种写法:

写法 例子 换 USB 口的结果
按口位绑定 雷达 / 语音盒的规则锁死某个端口号(如 3-1:1.0) 换口就失配,别名不生成
按设备名通配 控制板的规则用 ttyACM 通配 换口照样生成,别名不丢

所以同一台机器上,控制板的 /dev/rrc 换口后还在,而雷达和语音盒的别名换口后消失,这不是巧合。

修复时用 VID:PID 匹配,不要写口位后缀。临时应急可以先手工补一个软链接,重启后失效。

六、第 5 层 应用层:程序有没有在跑

pgrep -af aurora930
fuser -v /dev/lidar
ros2 node list

能打开但没数据,通常是两种情况:被第二个进程抢了串口,或驱动节点根本没起来。

:high_voltage: fuser 只做查看,不要顺手加 kill。当场杀掉正在占用串口的进程,会连带把上层 ROS 链路一起打断,先记录 PID,再决定怎么处理。

七、拔插实验:一次只改一个变量

一次只改一个变量,否则判不出是谁的问题。

步骤 只改什么 观察什么
1 原样不动 测存活时长,记下来作为基线
2 只换线,口不动 再测存活时长;同时看 lsusb -t 速率有没有从 480M 变成 5000M
3 只换口,换到蓝色 USB 3.0 口,线用新的 再测存活时长
4 换到已知正常的设备(U 盘、鼠标) 确认那个口本身好不好

每一次都要边操作边看日志,用带 --line-buffered 的那条命令。