ZHCUB24A June 2023 – December 2023 TMAG3001 , TMAG5170 , TMAG5170-Q1 , TMAG5170D-Q1 , TMAG5173-Q1 , TMAG5253 , TMAG5273
無論游戲手柄是使用 1 個磁體和 1 個檢測器件還是 2 個磁體和 2 個檢測器件實現的,都需要進行一些后處理以將測得的數據轉換為對最終用戶有意義的位置數據。后處理采用與游戲手柄沿 x 軸和沿 y 軸的俯仰度相對應的測量值來推斷旋轉角度和俯仰角度。
對于 2 磁體 2 器件設計,校準涉及找到在兩個傳感器上觀察到的 z 軸磁場的全局最大值和最小值。一個器件的 z 場值與 x 方向上的游戲手柄移動相關,而另一個器件的 z 場值與 y 方向上的游戲手柄移動相關。限制的測量值可作為參考,用于比較未來的測量值。要找到這些限制值,用戶需要如圖 2-14 所示在運動區域周邊移動游戲手柄,并且器件采樣率明顯快于用戶在運動區域周邊移動游戲手柄的速率。這會提高校準階段的空間分辨率,并確保傳感器檢測到理想全局最大值和最小值的概率更高。這些值預計會在 0°、90°、180° 和 270° 處找到,如果用戶只是嘗試通過僅移動到這些視覺感知角度來進行校準,則用戶很容易錯過幾度。
由于旋轉平面中器件和傳感器之間的意外偏移預計會影響測量的線性度,因此可以確定默認的靜止位置和游戲手柄限制測量值。這可以在拇指操縱桿處于靜止位置時進行測量。或者,如果預計靜止位置具有一定的容差,則可以使用通過先前確定的全局最大值和最小值計算平均位置。
通過計算 x 和 y 限制值以及中間靜止位置,可以計算旋轉值。方程式 1 說明了利用的基本概念。但是,在這種情況下,所有測得的 x 和 y 值都相對于校準期間找到的全局最大值和最小值進行了歸一化,如方程式 2 所示。
由于歸一化使所有 x 分量和 y 分量值介于 0 和 1 之間,因此僅計算 0 和 90° 之間的角度。因此,需要為 x_component 和 y_component 分配符號。符號的分配方式取決于磁體極性,如果組裝不一致,磁體極性可能會有所不同。圖 2-15 展示了可以針對 2 磁體 2 傳感器方向安裝磁體的四種不同方式。因此,可以使用與以下偽代碼類似的函數。
float AngleComponent(const float measured, const float Left_Down_Bound, const float Right_Up_Bound, const float Center)
{
float angleComponent;
if(measured > Center)
{
if(Left_Down_Bound > Center)
{
angleComponent = -(measured-Center)/(Left_Down_Bound-Center);
}
else if(Right_Up_Bound > Center)
{
angleComponent = (measured-Center)/(Right_Up_Bound-Center);
}
}
else if(measured < Center)
{
if(Left_Down_Bound < Center)
{
angleComponent = -(measured-Center)/(Left_Down_Bound-Center);
}
else if(Right_Up_Bound < Center)
{
angleComponent = (measured-Center)/(Right_Up_Bound-Center);
}
}
return angleComponent;
}
反正切函數(通常縮寫為 atan())的一個缺陷是它計算的值介于 -90° 和 90° 之間。要獲得圓周中的整個角度范圍,必須使用 atan2()。但是,該函數計算的值介于 -180° 和 180° 之間。因此,如果嚴格要求角度為正值,則可以在計算中包含一個三元運算符,如方程式 3 所示。
只要運動區域邊界俯仰角已知,就可以使用方程式 4 通過測量數據推斷游戲手柄俯仰度。