1. 为什么要固定设备名
PX4 飞控通过 Type-C 连接电脑后,Ubuntu 一般会识别成:
/dev/ttyACM0但是如果拔插顺序变化,或者电脑上接了多个 USB 设备,它可能变成:
/dev/ttyACM1 /dev/ttyACM2这样 MAVROS 的启动命令就容易失效。
所以可以用udev规则,把飞控固定成一个自定义名字,例如:
/dev/px4_fcu以后 MAVROS 里就固定使用:
serial:///dev/px4_fcu:576002. 建议统一创建一个规则文件
我建议机器人相关设备统一写到一个文件里:
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.04. 编写 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