我正在尝试运行 python3脚本在 Ubuntu 18.04.05 上控制 USB 机械臂(OWI 535)。
该脚本成功打开了用于控制机械臂的“tinker”GUI 模块。
传递命令时,python 脚本返回以下错误:
raise USBError(_strerror(ret), ret, _libusb_errno[ret]) usb.core.USBError: [Errno 13] Access denied (insufficient permissions)
研究了错误后,我了解到,为了使脚本获得访问 USB 设备的正确权限,需要在 /etc/udev/rules.d 中创建一个授权脚本的规则文件。也有人说 Ubuntu 管理 rules.d 的方式与其他发行版略有不同,但我无法辨别出其中的区别。
使用 lsusb 我识别了 USB 设备:
Bus 001 Device 008: ID 1267:0001 Logic3 / SpectraVideo plc
我创建了一个规则文件:/etc/udev/rules.d/99-usbls.规则使用以下行:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0x4F3", ATTRS{idProduct}=="0001", MODE="0777"
其中 0x4F3 是供应商 ID 1267 的十六进制数
我在规则文件中尝试了不同的属性,例如组=“plugdev”并使用命令重新启动了 udev:
sudo udevadm control --reload
sudo udevadm trigger
这些更改对 python 脚本的运行没有影响,我得到了同样的错误。
经过进一步研究和修改后更新
我想检查 UDEV 是否正确应用了我设置的权限99-usbls.规则,我确定了udevadm 测试命令,但需要指定机器人手臂的路径。我发现这很棘手,这些论坛上的许多建议似乎都指向类似ttyUSB1但我的 Ubuntu 18.04.05 却出现了不同情况。我最终找到并运行了这个脚本,它为我提供了设备的路径:
#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath="${sysdevpath%/dev}"
devname="$(udevadm info -q name -p $syspath)"
[[ "$devname" == "bus/"* ]] || [[ "$devname" == "input/"* ]] || [[ "$devname" == "video0"* ]] || exit
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && exit
busnum="$(udevadm info -a -p $(udevadm info -q path -n /dev/$devname) | awk -F "==" '/busnum/ {gsub("\"","");print $2}' | head -1)"
devnum="$(udevadm info -a -p $(udevadm info -q path -n /dev/$devname) | awk -F "==" '/devnum/ {gsub("\"","");print $2}' | head -1)"
bus_dev=${busnum}:${devnum}
lsusb="$(lsusb -s $bus_dev)"
echo "$lsusb - /dev/$devname"
)
done
这成功地为我提供了路径:
Bus 003 Device 002: ID 1267:0001 Logic3 / SpectraVideo plc - /dev/bus/usb/003/007
这让我能够运行udevadm 测试:
udevadm test $(udevadm info -q path -n /dev/bus/usb/001/007)
输出告诉我我的 UDEV 规则正在被读取但尚未被应用:
---
Reading rules file: /etc/udev/rules.d/99-usbls.rules
IMPORT builtin 'usb_id' /lib/udev/rules.d/50-udev-default.rules:13
IMPORT builtin 'hwdb' /lib/udev/rules.d/50-udev-default.rules:13
MODE 0662 /lib/udev/rules.d/50-udev-default.rules:42
---
UDEV 使用来自50-udev-默认.规则
为了测试目的,如果我编辑50-udev-默认.规则第 42 行至
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
并连接并重新连接 USB 设备,然后 Python 脚本运行,我就可以控制机器人了!
所以现在我必须弄清楚我的 UDEV 规则文件出了什么问题.....