ROS2 机器人开发:解决多 USB 设备名跳变(udev 固定别名)

在 ROS2 开发中,我们经常会接入多个 USB 串口设备(如激光雷达、485 转换器、STM32 控制板等)。Linux 系统默认分配的 /dev/ttyUSB0ttyUSB1 会因为重启或插拔顺序导致名称“漂移”。

本文记录如何通过 lsusb 排查硬件并使用 udev 规则永久固定设备名称。

1. 硬件信息排查

首先,通过“排除法”确定各设备的硬件 ID。

Bash

1
2
3
4
5
6
7
8
9
10
# 1. 不插设备时运行一次
lsusb

# 2. 插上激光雷达,再次运行,多出的设备即为雷达
# 示例输出:Bus 001 Device 014: ID 10c4:ea60 Silicon Labs CP210x...
# 其中 10c4 是 vendorID,ea60 是 productID

# 3. 插上 485 转换器,再次运行
# 示例输出:Bus 001 Device 016: ID 1a86:7523 QinHeng Electronics CH340...
# 其中 1a86 是 vendorID,7523 是 productID

2. 创建 udev 规则文件

利用设备的唯一硬件 ID,为它们建立“永久别名(Symlink)”。

Bash

1
2
# 创建并编辑规则文件
sudo nano /etc/udev/rules.d/99-robot-usb.rules

在文件中写入以下内容(根据实际查到的 ID 修改):

Plaintext

1
2
3
4
5
# 激光雷达别名:rplidar
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", SYMLINK+="rplidar"

# 485 转换器别名:tty485
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", SYMLINK+="tty485"
  • MODE:="0666":自动解决串口权限问题,无需 sudo

  • SYMLINK+=:创建指向原设备的软链接。

3. 激活规则

保存退出(Ctrl+O, Enter, Ctrl+X)后,刷新系统规则:

Bash

1
2
sudo udevadm control --reload-all
sudo udevadm trigger

4. 验证与应用

检查 /dev 目录下是否生成了我们定义的别名:

Bash

1
ls -l /dev/rplidar /dev/tty485

结果: 此时你会看到 /dev/rplidar 指向了某个 ttyUSBx

在 ROS2 中使用:

在 Launch 文件或 YAML 配置文件中,直接将端口号写死为别名即可:

Python

1
2
# 示例
parameters=[{'serial_port': '/dev/rplidar'}]

总结

通过 lsusb 获取身份信息 + udev 规则绑定,我们可以确保机器人软件系统永远通过固定的名字访问硬件,不再受插拔顺序影响。