为什么PS4手柄摇杆回中是0.00392?DS4协议的秘密

    使用PS系列手柄连接电脑测试摇杆的时候,我们往往会发现测试网页中摇杆完美回中后的坐标并不在零点,而是在一个很奇怪的数0.00392上面。

    无论如何设置摇杆回中,摇杆输出都会回复到0.00392上,这是为什么呢?结合DS4手柄协议,这个现象很容易解释。

    摇杆回中坐标为0.00392的原因是:DS4使用8位字节(0-255)表示摇杆位置,中点为127.5,而测试网站使用-1到1坐标系,换算后127.5的偏差对应0.00392。以下是详细推导

    UP在之前的手柄协议科普中提过,手柄需要按照协议中的规定的格式,构造手柄数据包并上报给上位机(PC/主机),上位机才能够正确解析并且了解手柄当前的状态,例如哪些按键被按下,当前摇杆位置等

在PC平台上,我们可以使用wireshark去捕获这些手柄数据包,成功之后我们可以看到类似下图的一些数字:

    这就是DS4向电脑发送的手柄状态报告数据包了,其中包含了手柄所有的状态信息,例如当前按键、摇杆位置等等。按照设计,DS4每秒向上位机上报250次状态数据包,对应手柄250Hz的回报率。上图中第一行与第一列是序号,方便给你数数使用,从A1开始是手柄数据包的正文内容。可以看到数据包中使用的是16进制的数据,每个数字的范围是0至F,每两个数字例如A1我们称作1个字节,一个字节表示的数字范围最小是00,对应10进制0,最大是FF,对应十进制255。

    首字节数据A1我们称为第0字节,第二字节11我们称为第1字节,后面以此类推,通过数数我们可以得知,DS4手柄状态信息一共有79个字节组成。在这79个字节内,包含手柄全部状态信息。我们找到一个描述数据报格式的图片,对照详细说明一下。

    什么,你说你看不懂?图片的第一列byte index就是字节的索引,里面标注的数字就是我们刚才数数的第几个字节,后面的内容就是这个字节的功能,例如[3]后面写的Left Stick X,代表第3字节对应16进制数字的含义就是左摇杆X轴的位置,并且后面注释0 = left,代表第3字节内容如果是00时,表示左摇杆当前位置在最左边,我们可以反推第3字节内容如果是FF时,表示左摇杆当前位置在最右边。

    按照图中所示,我们可以尝试解析数据包内容。

  1. 字节0至字节3是数据包的一些属性

  2. 字节4至字节7是左右摇杆的坐标,X轴的最左边是0,Y轴的最上面是0

  3. 字节8至字节10是按键信息

  4. 字节11至字节12是左右扳机数据,00代表没有按下,FF代表最大按下

  5. 字节13至字节14是时间戳,配合陀螺仪数据使用

  6. 字节15是手柄电量,同样00代表最小,FF代表最大

  7. 字节16至字节21是陀螺仪的三轴角速度

    数据包一共有79个字节,后面的数据中还有3轴加速度、触摸板、校验码,以及一些不明含义的数据,就不展开说了。

    回到0.00392这个问题上来,既然数据包定义了摇杆的位置,并且注释X轴的最左边是0,Y轴的最上面是0,那么可以确定这两个轴相反方向的最大值是FF,我们把数值填进图中。

    数据包的字节4至字节5表示当前左摇杆X轴与Y轴的坐标,尝试在X轴移动左摇杆,可以发现当摇杆移动至最左边时第4字节值是00,当移动至最右边时第4字节值是FF

    当左摇杆自然回中时,我们可以发现这两个字节分别是80和7F。

    现在问题来了,轴的总长度是FF,轴的中点也就是上图的圆心在什么位置?转化成数学问题就是FF除以2等于多少?16进制数的计算可能比较烧脑,我们将其转换成10进制,FF对应10进制255,除以2以后得到127.5。

    由于单字节16进制数无法表示小数,摇杆自然回中后的字节4与字节5数字分别是80与7F,转换成10进制后得到128与127,与圆心的实际位置产生了0.5的差值。

    但是网页中为什么不是0.5?别忘了我们现在在0至255的坐标系中,而实际的测试网站中的摇杆坐标,往往是从-1到1的,我们需要将0至255的坐标系中的0.5,转换至-1到1中去。

公式如下:2/255*0.5 ≈ 0.00392

    其中2是-1到1坐标系中单个轴的总长度,255是0至255的坐标系中单个轴的总长度,0.5是刚才计算出来的回中点差值。

DS4手柄支持传输多种不同格式的数据包,手柄状态输出报告只是其中一种。除此之外还有输入报告,负责控制手柄的LED与震动。功能报告,负责查询设置手柄状态。握手数据包,负责连接电脑时交互数据。此外还有音频信号相关的数据包。

如果你看到这里,那么恭喜你,你对手柄协议的了解程度已经超过99%的人了,不光是DS系列手柄,所有的手柄,乃至包括鼠标键盘在内的所有外设,都是使用类似逻辑与主机电脑交互的。更进一步来说,手柄圈子里面吹的天花乱坠的各种概念和名词,最终都会体现在协议定义的数据包里,例如回报率,步长,线性度,摇杆分辨率,输入延迟,原生陀螺仪/映射摇杆

站在能够理解协议的层面,回头再去看各种概念,简直如同降维打击。各种神神叨叨的名词概念将会变的非常通透,再也没有人能够通过罗列看不懂的数值忽悠到你,如果大家对这些内容感兴趣,可以点赞关注一件三连,我是手柄模飞玩家,后续会给带来更多手柄专业内容。

更多游戏资讯请关注:电玩帮游戏资讯专区

电玩帮图文攻略 www.vgover.com