程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何使用带有 Joycons 的 Vgamepad 模拟 Xbox 360 操纵杆?

发布于2023-11-01 04:47     阅读(1155)     评论(0)     点赞(14)     收藏(0)


我已经成功地将所有按钮和触发器从使用 Joycon-python 的 Joycons 映射到使用 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)

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

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


解决方案


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



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2038868/50004527605bbca661ba/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)