爲什麼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