VirtualBox Ubuntu20.04虚拟机pygame读取摇杆轴和按钮值恒为0求助
首先确认:VirtualBox 透传摇杆后在 Ubuntu 客户机 /dev 路径下识别为 hidraw1 属于正常情况,USB HID 类设备默认会生成对应的 hidraw 设备节点,不代表识别异常。
你可以按照以下顺序排查问题:
1. 优先排查系统层面是否能正常读取摇杆数据
不要直接定位到代码问题,先验证底层输入是否正常:
- 先安装测试工具:运行
sudo apt update && sudo apt install evtest joystick - 执行
ls /dev/input/查看是否存在js*开头的设备(如js0、js1),如果不存在说明系统 udev 规则没有将 hidraw 设备映射为标准 joystick 设备,属于 VirtualBox 透传 HID 设备的常见问题 - 如果存在对应
js设备,执行jstest /dev/input/js0(根据你的实际设备号替换),摇动摇杆、按动按钮看终端是否有数值跳动:- 如果 jstest 也没有数值变化,说明是系统层没有拿到摇杆数据,和代码无关
- 如果 jstest 有数值变化,说明问题出在 pygame/SDL 层或你的代码逻辑上
2. 排查设备访问权限问题
普通用户默认可能没有 hidraw 设备的读取权限,不会触发报错但只会返回 0:
- 执行
sudo usermod -aG input,plugdev $USER将当前用户加入输入设备权限组,执行后重启虚拟机再测试
3. 调整 VirtualBox USB 配置
- 打开虚拟机设置→USB,确认当前使用的控制器和摇杆兼容:如果你的摇杆是 USB 2.0 设备,将默认的 USB 3.0 (xHCI) 控制器切换为 USB 2.0 (OHCI + EHCI) 控制器后重启虚拟机
- 确认透传摇杆时,宿主机已经完全释放设备,没有同时占用摇杆
- 部分特殊手柄需要额外驱动支持,执行
sudo apt install xboxdrv安装通用手柄驱动后再测试
4. 修正代码逻辑
你当前的代码存在两处容易出问题的地方:
- 你写死了
con=3,但从你输出的 joysticks 列表可以看到有 4 个摇杆对象,VirtualBox 通常会虚拟出多个空的 HID 设备,序号 3 大概率不是你的实际物理摇杆,需要遍历所有摇杆确认对应序号 - 你创建 Joystick 对象后没有调用
.init()方法初始化单个摇杆设备,仅初始化 pygame.joystick 模块不足以正常读取数据
修正后的初始化代码参考:
pygame.joystick.init() joysticks = [] for i in range(pygame.joystick.get_count()): joy = pygame.joystick.Joystick(i) joy.init() # 必须初始化单个摇杆 print(f"摇杆{i}:名称={joy.get_name()},轴数={joy.get_numaxes()},按钮数={joy.get_numbuttons()}") joysticks.append(joy) # 根据打印的名称找到对应的摇杆序号替换con变量
内容的提问来源于stack exchange,提问作者Chaz
相关产品推荐
相关产品推荐

