如何使用 Vgamepad 和 Joycons 模拟 Xbox 360 操纵杆?

问题描述 投票:0回答:1

我已成功使用 Joycon-python 将所有按钮和触发器从 JoyCon 映射到使用 vgamepad 的模拟 Xbox 360 控制器。但是,我不知道如何映射操纵杆。我尝试了很多不同的方法。在最坏的情况下,我根本没有任何输出,而在最好的情况下,模拟输出严格而强烈地进入一个方向,我无法通过移动操纵杆来明显影响这一方向。

import vgamepad as vg
import time
from pyjoycon import JoyCon, get_R_id, get_L_id

right_joycon_id = get_R_id()
left_joycon_id = get_L_id()

right_joycon = JoyCon(*right_joycon_id)
left_joycon = JoyCon(*left_joycon_id)

gamepad = vg.VX360Gamepad()

while True:
    right_report = right_joycon.get_status()
    left_report = left_joycon.get_status()

    right_stick_x = right_report['analog-sticks']['right']['horizontal']
    right_stick_y = right_report['analog-sticks']['right']['vertical']
    left_stick_x = left_report['analog-sticks']['left']['horizontal']
    left_stick_y = left_report['analog-sticks']['left']['vertical']

    mapped_right_stick_x = int((right_stick_x - 32768) * 32767 / 32768)
    mapped_right_stick_y = int((right_stick_y - 32768) * 32767 / 32768)
    mapped_left_stick_x = int((left_stick_x - 32768) * 32767 / 32768)
    mapped_left_stick_y = int((left_stick_y - 32768) * 32767 / 32768)

    gamepad.right_joystick(x_value=mapped_right_stick_x, y_value=mapped_right_stick_y)
    gamepad.left_joystick(x_value=mapped_left_stick_x, y_value=mapped_left_stick_y)

    gamepad.update()
    
    time.sleep(0.005)

使用此代码,输出会连续将模拟操纵杆急剧指向左下角,而不管操纵杆的物理状态如何。

事实上,我几乎不知道我在做什么,并且可能忽略了一些明显的东西,但我已经很远地映射了所有其他功能(除了隆隆声),所以我希望有人能解释我错过了什么

python joystick gamepad device-emulation nintendo
1个回答
0
投票

joycon-python 将摇杆轴输出为 12 位无符号整数值(0 到 4096),而 vgamepad 需要 16 位有符号整数值(-32768 到 32767)。

天真地:

    x360_axis = int((joycon_axis - 2048) * (65536 / 4096))

请注意,您从中获得的值未经校准。开关控制器具有需要从设备读取并应用于原始摇杆轴值的校准数据。

工厂校准数据存储在

0x603d
(左摇杆)和
0x6046
(右摇杆):

https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/spi_flash_notes.md#x6000-factory-configuration-and-calibration

摇杆校准数据包含每个轴的最小值、最大值和中心值:

https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/spi_flash_notes.md#analog-stick-factory-and-user-calibration

还有死区信息

0x6086
:

https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/imu_sensor_notes.md#stick-parameters-1--2

© www.soinside.com 2019 - 2024. All rights reserved.