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

如何通过Python向游戏发送方向盘/摇杆输入以实现自动驾驶平滑控制

用Python模拟摇杆输入实现游戏车辆平滑自动驾驶控制

之前用pynput模拟键盘按键确实只能实现离散的开关式控制,想要让车辆转向、油门/刹车的动作更平滑,模拟游戏手柄的摇杆输入绝对是更优解——毕竟摇杆输出的是连续的数值信号,完美匹配你的机器学习模型输出的连续控制量。

我推荐用vgamepad这个库,它专门用来创建虚拟游戏手柄,能直接向系统发送符合标准的手柄输入信号,大部分游戏都会把它当成真实的手柄设备来识别,配置起来也很简单。

步骤1:安装依赖

先通过pip安装vgamepad:

pip install vgamepad

步骤2:编写控制代码

下面是完整的示例代码,把模型输出的控制量映射到虚拟手柄的摇杆和扳机上:

import vgamepad as vg
import time

# 创建一个虚拟Xbox 360手柄(绝大多数游戏都兼容这个手柄协议)
gamepad = vg.VX360Gamepad()

# 假设你的机器学习模型输出的控制量范围是:
# steering: -1.0(左满舵)~ 1.0(右满舵)
# throttle: 0.0(无油门)~ 1.0(满油门)
# brake: 0.0(无刹车)~ 1.0(满刹车)
model_steering = 0.3  # 示例:轻微向右打方向
model_throttle = 0.7  # 示例:70%油门输出
model_brake = 0.0     # 示例:无刹车

# 将模型输出映射到手柄控件的硬件范围:
# 左摇杆X轴(控制方向):范围是-32768 ~ 32767
steering_input = int(model_steering * 32767)
# 右扳机(油门)/左扳机(刹车):范围是0 ~ 65535
throttle_input = int(model_throttle * 65535)
brake_input = int(model_brake * 65535)

# 设置手柄的输入状态
gamepad.left_joystick(x_value=steering_input, y_value=0)  # Y轴不用,保持0即可
gamepad.right_trigger(value=throttle_input)
gamepad.left_trigger(value=brake_input)

# 把输入信号发送给系统
gamepad.update()

# 如果是实时自动驾驶,把逻辑放到循环里即可:
# while True:
#     # 获取模型的实时输出
#     # model_steering, model_throttle, model_brake = your_model.get_control_output()
#     # 映射并更新手柄输入
#     gamepad.left_joystick(x_value=int(model_steering * 32767), y_value=0)
#     gamepad.right_trigger(value=int(model_throttle * 65535))
#     gamepad.left_trigger(value=int(model_brake * 65535))
#     gamepad.update()
#     time.sleep(0.01)  # 控制更新频率,避免占用过多CPU

额外说明

  • 不同游戏的手柄控制映射可能不一样,如果你的游戏用右摇杆控制方向,或者用其他按键,只需要修改代码里对应的手柄控件即可(比如right_joystick代替left_joystick)。
  • 如果你不想用vgamepad,也可以试试pygame,但pygame的虚拟手柄配置在部分系统上会更麻烦,而且需要手动发送事件,不如vgamepad直接。
  • 对比之前的pynput键盘控制,摇杆输入是连续的数值变化,比如方向盘从0到0.3的过程是平滑过渡的,而不是直接从“无转向”跳到“向右打方向”,这就是你要的平滑控制效果。

内容的提问来源于stack exchange,提问作者Shaurya K. Panwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:37:50