Linux 笔记 | Ubuntu 使用udev绑定ttyUSB端口
Udev 是 Linux 的设备管理器,可以为硬件设备动态创建和删除节点。简而言之,它可以帮助您的计算机轻松找到您的机器人设备。默认情况下,连接到 Linux (Ubuntu) PC 的硬件设备将属于 root 用户。这意味着任何以非特权(即非 root)用户身份运行的程序(例如 ROS 节点)将无法访问它们。最重要的是,Linux是按照插入顺序设备名如ttyACMx和ttyUSBx是任意编号。通过udev设备描述符固定端口号,就可以解决这个问题。
1. 查看USB设备信息
下面以RPLIDAR-A1激光雷达作为示例。
首先拔插USB,输入命令查看信息:
sudo dmesg | tail
这里可看到设备的idVendor和idProduct,还有已连接到ttyUSB2.
2. 配置udev规则
首先进入udev规则目录,并且创建你想配置的文件,如51-rplidar.rules
cd /etc/udev/rules.d
sudo vim 51-rplidar.rules
编辑内容如下:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
udev 规则由一堆逗号分隔的标签组成,如上所述。标签分为两部分:匹配和配置,但是它们顺序是可以调换的,重新配置后最终生成/dev/rplidar设备文件
- 匹配键
- KERNEL : 内核设备名称
- ATTRS{idProduct} : usb芯片的idVendor供应商ID
- ATTRS{idProduct} : usb芯片的idProduct识别码
- 赋值键
- MODE : 设备设定权限
- SYMLINK : /dev/下的设备文件产生符号链接
保存编辑好的文件,退出。然后重启udev服务
sudo service udev reload
sudo service udev restart
重新拔插设备后可看到指向挂载点ttyUSB0的链接符号rplidar
ls -l /dev/rplidar
3. 绑定USB端口
你可能遇到雷达、IMU串口都是使用cp2102芯片通讯,这样usb的PID和VID相同,从而导致识别错乱,绑定设备的USB端口是最稳妥方法
首先根据第一步查找到你接入的USB设备,比如/dev/ttyUSB2
,获取USB系统属性信息列表
udevadm info --attribute-walk --name=/dev/ttyUSB2
这里可看到KERNELS=="1-2.1"
,将这个KERNELS匹配键添加到刚udev文件上
首先进入udev规则目录,编辑你的配置的文件,如51-rplidar.rules
cd /etc/udev/rules.d
sudo vim 51-rplidar.rules
保存编辑好的文件,退出。然后重启udev服务,重新拔插设备即可识别
sudo service udev reload
sudo service udev restart
现在KERNELS的值与现实物理USB接口绑定,只要USB接口不变,那么不同顺序的插入都不影响Linux识别传感器设备。
注意事项
-
检查您的规则是否遵循命名约定 – –.rules. 从技术上讲,您可以为同一设备设置多个规则,并且数量决定了它们的执行顺序。由于我们正在编写插件规则,因此优先级为 99 是最安全的。
-
一个文件中可以有多个规则,由换行符分隔。确保每个单独的规则都在一行上。
- 检查所有标记(匹配和配置)是否以逗号分隔。
- 检查您的规则文件是否有尾随换行符。
- 检查您的规则是不是root用户
ll /etc/udev/rules.d/
输出root root
为root用户所有 。