You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:57:00