Ubuntu 下用 udev 固定 PX4 飞控 USB 设备名

1. 为什么要固定设备名

PX4 飞控通过 Type-C 连接电脑后,Ubuntu 一般会识别成:

/dev/ttyACM0

但是如果拔插顺序变化,或者电脑上接了多个 USB 设备,它可能变成:

/dev/ttyACM1 /dev/ttyACM2

这样 MAVROS 的启动命令就容易失效。

所以可以用udev规则,把飞控固定成一个自定义名字,例如:

/dev/px4_fcu

以后 MAVROS 里就固定使用:

serial:///dev/px4_fcu:57600

2. 建议统一创建一个规则文件

我建议机器人相关设备统一写到一个文件里:

sudo nano /etc/udev/rules.d/99-robot-devices.rules

这个文件名可以自己取,只要放在:

/etc/udev/rules.d/

并且以:

.rules

结尾即可。

例如下面这些名字都可以:

99-robot-devices.rules 99-px4.rules 99-usb-devices.rules

如果以后要添加相机、雷达、其他串口设备,也可以继续往99-robot-devices.rules里面加规则,不一定每个设备都新建一个文件。


3. 查询 PX4 当前设备

插上 PX4 飞控 Type-C 线后,执行:

ls /dev/ttyACM*

一般会看到:

/dev/ttyACM0

然后查询这个设备的 USB 物理路径:

udevadm info -q property -n /dev/ttyACM0 | grep ID_PATH

会得到类似:

ID_PATH=pci-0000:00:14.0-usb-0:3:1.0

复制ID_PATH=后面的内容,例如:

pci-0000:00:14.0-usb-0:3:1.0

4. 编写 udev 规则

打开统一规则文件:

sudo nano /etc/udev/rules.d/99-robot-devices.rules

添加下面这一行:

SUBSYSTEM=="tty", KERNEL=="ttyACM*", ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:3:1.0", SYMLINK+="px4_fcu", GROUP="dialout", MODE="0660"

注意:这里的:

pci-0000:00:14.0-usb-0:3:1.0

要替换成自己电脑实际查到的ID_PATH

如果你想把设备名改成别的,例如:

/dev/fcu

那就把:

SYMLINK+="px4_fcu"

改成:

SYMLINK+="fcu"

5. 添加串口权限

执行:

sudo usermod -aG dialout $USER

然后重启电脑,或者退出当前用户重新登录。


6. 重新加载 udev 规则

执行:

sudo udevadm control --reload-rules sudo udevadm trigger

然后拔掉飞控 Type-C 线,再重新插上。


7. 检查是否绑定成功

执行:

ls -l /dev/px4_fcu

如果成功,会看到类似:

/dev/px4_fcu -> ttyACM0

这说明/dev/px4_fcu已经指向了当前 PX4 飞控设备。


8. 在 MAVROS 中使用固定设备名

原来可能使用:

serial:///dev/ttyACM0:57600

现在改成:

serial:///dev/px4_fcu:57600

例如:

ros2 run mavros mavros_node --ros-args \ -p fcu_url:=serial:///dev/px4_fcu:57600

如果是 launch 文件,也可以写成:

default_value='serial:///dev/px4_fcu:57600'

9. 如果以后添加其他设备

可以继续打开同一个文件:

sudo nano /etc/udev/rules.d/99-robot-devices.rules

然后在下面继续添加新规则。

例如另一个串口设备可以写成:

SUBSYSTEM=="tty", KERNEL=="ttyUSB*", ENV{ID_PATH}=="另一个设备的ID_PATH", SYMLINK+="my_serial", GROUP="dialout", MODE="0660"

如果是相机/dev/video0,可以先查询:

udevadm info -q property -n /dev/video0 | grep ID_PATH

然后规则大致类似:

SUBSYSTEM=="video4linux", KERNEL=="video*", ENV{ID_PATH}=="相机的ID_PATH", SYMLINK+="camera_front", MODE="0666"

10. 总结

最终 MAVROS 使用:

serial:///dev/px4_fcu:57600

不再使用不稳定的:

/dev/ttyACM0

只要 PX4 飞控插在同一个 USB 口上,设备名就会固定为:

/dev/px4_fcu