ROS机器人开发过程中,需要通过USB口连接多个设备,如:下层执行器,雷达等
而Linux是按照插入顺序对设备进行编号的,例如ttyUSB0
, ttyUSB1
或者 ttyACM0
, ttyACM1
等等
这样的话,每次重新开机的时候容易出现设备不对应编号的情况
这就无法在代码中固定设备的端口号
因此需要将设备的端口号固定
接下来以两块正点原子阿波罗开发板和一个RPLIDAR-A1激光雷达在 Ubuntu 16.04 环境下为例:
先不接设备,查看端口信息:
$ lsusb
$ lsusb
ID 1a86:7523
表示USB设备的ID
这个ID由芯片制造商设置,可以唯一表示该设备
在/etc/udev/rules.d/
下创建任意名称的规则配置文件,如:usb.rules
并进行编辑
$ cd /etc/udev/rules.d/
$ sudo touch usb.rules
$ sudo nano usb.rules
KERNEL=="ttyUSB*",ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="alientek_apollo"
内容中匹配sys中内核名为ttyUSB*
的设备
依据生产商编号idVendor
和产品号idProduct
匹配属性
设定读写权限为0777
符号链接名为alientek_apollo
重新配置生效规则:
$ sudo /etc/init.d/udev restart
现在,拔插设备,再查看映射结果:
$ ls -l /dev |grep ttyUSB
现在访问/dev/alientek_apollo
就是访问该设备了
现在先拔出正点原子阿波罗开发板,插入RPLIDAR-A1激光雷达,查看端口信息:
$ lsusb
可以查看到新增加的RPLIDAR-A1激光雷达设备端口 ID 10c4:ea60
再查看端口:
$ ls /dev/ttyUSB*
现在的ttyUSB0
为RPLIDAR-A1激光雷达设备端口,而不是刚刚拔出的正点原子阿波罗开发板
如果在相关的端口配置代码中以ttyUSB0
为端口名称,那这样搞混设备就炸裂了
那么对规则/etc/udev/rules.d/usb.rules
再次配置,增加以下内容:
KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
重新配置生效规则:
$ sudo /etc/init.d/udev restart
现在,拔插设备,再查看映射结果:
$ ls -l /dev |grep ttyUSB
现在访问/dev/rplidar
就是访问RPLIDAR-A1激光雷达设备了
利用Python进行简单的测试:
接下来,利用Python同时配置这两个端口:
可以看到,正点原子阿波罗开发板的设备端口应为连接而配置错误
那么现在插上刚刚的正点原子阿波罗开发板
再配置这两个端口:
这样的配置就避免了设备不对应编号的情况,且在代码中以ser0
,ser1
区分两个设备
但需要注意的是:
现在的规则,只适用于某个设备插上之后,其ID是唯一的,与其他设备不同
那么在相同ID情况下,如两块正点原子阿波罗开发板
这样的情况,以上的规则也无法避免设备不对应编号的情况
莫慌,查询端口号:
ls -l /sys/class/tty
注意到tyyUSB
的前一位不相同,3-2:1.0
与 3-3.1:1.0
那么对规则/etc/udev/rules.d/usb.rules
再次配置:
KERNEL=="ttyUSB*", KERNELS=="3-2", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="alientek_apollo_0"
KERNEL=="ttyUSB*", KERNELS=="3-3.1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="alientek_apollo_1"
KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
重新配置生效规则:
$ sudo /etc/init.d/udev restart
现在,拔插设备,再查看映射结果:
$ ls -l /dev |grep ttyUSB
谢谢!