ZHCUB24A June   2023  – December 2023 TMAG3001 , TMAG5170 , TMAG5170-Q1 , TMAG5170D-Q1 , TMAG5173-Q1 , TMAG5253 , TMAG5273

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2游戏手柄设计
    1. 2.1 确定外形尺寸
      1. 2.1.1 选择机械实现
      2. 2.1.2 选择磁性实现
    2. 2.2 磁体传感器放置
    3. 2.3 设计计算
    4. 2.4 后期处理
    5. 2.5 原型设计和基准测试
    6. 2.6 误差源
      1. 2.6.1 机械迟滞
      2. 2.6.2 附近材料的影响
      3. 2.6.3 支点滑移
      4. 2.6.4 偏移
  6. 3控制杆设计
    1. 3.1 确定外形尺寸
      1. 3.1.1 选择机械实现
    2. 3.2 磁体传感器放置
    3. 3.3 设计计算
    4. 3.4 原型设计和基准测试
    5. 3.5 误差源
  7. 4总结
  8. 5参考资料
  9. 6修订历史记录

后期处理

无论游戏手柄是使用 1 个磁体和 1 个检测器件还是 2 个磁体和 2 个检测器件实现的,都需要进行一些后处理以将测得的数据转换为对最终用户有意义的位置数据。后处理采用与游戏手柄沿 x 轴和沿 y 轴的俯仰度相对应的测量值来推断旋转角度和俯仰角度。

对于 2 磁体 2 器件设计,校准涉及找到在两个传感器上观察到的 z 轴磁场的全局最大值和最小值。一个器件的 z 场值与 x 方向上的游戏手柄移动相关,而另一个器件的 z 场值与 y 方向上的游戏手柄移动相关。限制的测量值可作为参考,用于比较未来的测量值。要找到这些限制值,用户需要如图 2-14 所示在运动区域周边移动游戏手柄,并且器件采样率明显快于用户在运动区域周边移动游戏手柄的速率。这会提高校准阶段的空间分辨率,并确保传感器检测到理想全局最大值和最小值的概率更高。这些值预计会在 0°、90°、180° 和 270° 处找到,如果用户只是尝试通过仅移动到这些视觉感知角度来进行校准,则用户很容易错过几度。

GUID-20230512-SS0I-GV0W-FTZX-6QX1PFLPSXRX-low.svg图 2-14 用于确定全局最大值和最小值的圆周运动

由于旋转平面中器件和传感器之间的意外偏移预计会影响测量的线性度,因此可以确定默认的静止位置和游戏手柄限制测量值。这可以在拇指操纵杆处于静止位置时进行测量。或者,如果预计静止位置具有一定的容差,则可以使用通过先前确定的全局最大值和最小值计算平均位置。

通过计算 x 和 y 限制值以及中间静止位置,可以计算旋转值。方程式 1 说明了利用的基本概念。但是,在这种情况下,所有测得的 x 和 y 值都相对于校准期间找到的全局最大值和最小值进行了归一化,如方程式 2 所示。

方程式 5. 角度   =   arctan ( y x )
方程式 2. 角度   =   arctan ( y_component x_component )   =   arctan ( Y_measured Y_Center Y_Bound Y_Center X_measured X_Center X_Bound X_Center )

由于归一化使所有 x 分量和 y 分量值介于 0 和 1 之间,因此仅计算 0 和 90° 之间的角度。因此,需要为 x_component 和 y_component 分配符号。符号的分配方式取决于磁体极性,如果组装不一致,磁体极性可能会有所不同。图 2-15 展示了可以针对 2 磁体 2 传感器方向安装磁体的四种不同方式。因此,可以使用与以下伪代码类似的函数。

GUID-20230512-SS0I-DGPC-FGN8-Q8G5XPRWJRS8-low.svg图 2-15 磁体安装
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 所示。

方程式 3. 角度   =   atan2 ( y_component x_component ) + ( y_component < 0 ? 360 : 0 )

只要运动区域边界俯仰角已知,就可以使用方程式 4 通过测量数据推断游戏手柄俯仰度。

方程式 4. 角度   =   间距 max × ( x 2 + y 2 x 2 最大值 + y 2 max )