磁力计是一种测量地球磁场强度以确定方向的传感器。在移动设备中,它作为数字指南针工作,在正确校准下精度可达1–2度。根据Bosch Sensortec Application Note, 2024,现代MEMS磁力计仅消耗0.5–2毫安,可装入1.5×1.5×0.7毫米的封装中。
要点
磁力计在移动设备中是一种基于霍尔效应的三轴磁场传感器。它测量磁感应矢量在X、Y和Z轴上的投影。结合加速度计,磁力计可以确定方位角——即北方向与手机轴之间的夹角。
现代智能手机使用基于各向异性磁阻效应(AMR)和霍尔效应的MEMS磁力计。AMR传感器(Asahi Kasei Microdevices的AKM系列)提供0.15 µT/LSB的灵敏度和±1200 µT的量程——这足以测量地球磁场(25–65 µT)。
| 参数 | 值 |
|---|---|
| 技术 | AMR / 霍尔效应 |
| 量程 | ±1200 — ±1300 µT |
| 功耗 | 0.5–2 mA |
| 尺寸 | 1.5×1.5×0.7 mm |
| 灵敏度 | 0.15 µT/LSB |
没有数字指南针,导航应用无法确定移动方向。谷歌地图使用磁力计来显示地图相对于用户视线方向的朝向。当传感器失效时,应用仅在地图上显示位置,没有蓝色方向箭头。
霍尔效应是一种物理现象,即在磁场作用下,导电板边缘产生电位差。在MEMS磁力计中,使用坡莫合金(NiFe)薄膜结构,其电阻随外部磁场的变化而变化(AMR效应)。
三个通道(X、Y、Z)各自由四个磁电阻组成,连接成惠斯通电桥。磁场使电阻值变化2–3%,由差分放大器转换为电压。内置16位ADC以高达100 Hz的频率对信号进行数字化。
为了测量磁场的垂直分量,使用了集成磁通集中器(IMC — Integrated Magnetic Concentrator)。这是一种坡莫合金薄膜结构,将水平磁场偏转到垂直平面,使单个AMR电桥能够测量所有三个轴。
磁力计相对于地球磁场确定朝向(绝对参考),而陀螺仪仅测量角度变化(相对数据)。陀螺仪在短时间间隔内提供准确数据,但会累积漂移误差。磁力计不会漂移,但易受磁干扰。
Android通过SensorManager.getRotationMatrix结合三个传感器的数据。磁力计用于长时间间隔内校正陀螺仪漂移。如果没有磁力计,陀螺仪在5分钟内会累积10–20度的误差。根据Google ARCore(2024)的数据,融合算法在磁力计存在时可达到1–3度的精度。
val accelerometerReading = FloatArray(3)
val magnetometerReading = FloatArray(3)
val rotationMatrix = FloatArray(9)
val orientationAngles = FloatArray(3)
SensorManager.getRotationMatrix(
rotationMatrix, null,
accelerometerReading,
magnetometerReading
)
SensorManager.getOrientation(
rotationMatrix, orientationAngles
)
// orientationAngles[0] — 以弧度表示的方位角
硬铁 — 由手机内部铁磁材料产生的恒定磁场:扬声器磁铁、振动马达、金属框架。硬铁干扰表现为每个轴上的恒定偏移(bias)。软铁 — 由导磁材料引起的磁场方向变化,这些材料扭曲了磁力线的形状。
磁力计的标准校准过程是将手机旋转成八字形(figure-8 pattern)。在此过程中,传感器在三维空间中记录点。没有干扰时,点位于半径为25–65 µT的球面上。硬铁偏移球心,软铁将其变为椭球体。校准算法计算偏移和缩放参数。
data class CalibrationParams(
val biasX: Float,
val biasY: Float,
val biasZ: Float,
val scaleX: Float,
val scaleY: Float,
val scaleZ: Float
)
fun applySoftIronCorrection(
raw: FloatArray, p: CalibrationParams
): FloatArray {
return floatArrayOf(
(raw[0] - p.biasX) * p.scaleX,
(raw[1] - p.biasY) * p.scaleY,
(raw[2] - p.biasZ) * p.scaleZ
)
}
开发人员可以通过在设备移动过程中收集数据来实现自己的磁力计校准。椭球拟合(ellipsoid fitting)算法通过最小化偏离球面的平方和来找到硬铁和软铁参数。Apache Commons Math库为此任务提供了非线性最小二乘法(Levenberg-Marquardt)的实现——软件校准后的精度可达0.5度。
为了最小化硬铁干扰,制造商将磁力计放置在手机上部,远离扬声器和振动马达。苹果工程师在iPhone 16 Pro Max(2024)中采用了坡莫合金箔屏蔽磁力计,将扬声器的影响降低了4倍。三星Galaxy S24 Ultra使用额外的补偿电路,实时测量扬声器中的电流以减去感应场。带磁吸装置的保护壳(例如车载支架中)会产生强烈的干扰——使用后磁力计可能会显示错误方向,直到重新校准。
Android提供两个传感器:TYPE_MAGNETIC_FIELD(以µT为单位的校准数据)和TYPE_MAGNETIC_FIELD_UNCALIBRATED(带干扰估计的原始数据)。对于导航应用,建议使用校准后的传感器——系统会根据最近的八字形运动自动应用内置校准。
SENSOR_DELAY_NORMAL延迟(200毫秒)对于指南针来说足够,SENSOR_DELAY_FASTEST(0毫秒)——仅用于特殊研究应用。接收到数值后,可以通过getRotationMatrix + getOrientation将其转换为方位角。通过event.accuracy检查传感器精度很重要——SENSOR_STATUS_UNRELIABLE值表示需要校准。
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
val accuracy = event.accuracy
if (accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
showCalibrationHint()
return
}
System.arraycopy(event.values, 0,
magnetometerReading, 0, 3)
}
}
磁力计不仅用于指南针。AR应用,包括Pokemon GO,使用磁力计确定相机相对于真实世界的朝向。如果没有磁力计,ARCore会切换到屏幕轴模式——朝向仅由陀螺仪确定,这会降低精度。
在基于Android Auto的汽车导航系统中,磁力计用于在隧道和密集城市建筑中丢失GPS信号时确定行驶方向。结合车辆车轮的里程计数据(通过OBD-II获取),磁力计可在没有GPS的情况下继续导航长达5分钟,定位精度达10–20米。根据谷歌地图工程博客(2024),混合算法将城市峡谷中的路线丢失率降低了40%。
导航应用使用磁力计确定移动方位角——即北方向与用户当前航向之间的夹角。在谷歌地图中,磁力计数据与GPS轨迹和移动历史相结合,显示蓝色方向箭头。当GPS信号丢失时(在隧道、地下通道中),磁力计仍然是关于朝向的唯一信息来源。
集成ASIC的新一代三轴磁力计(博世BMM350,2024年)仅消耗0.35毫安,支持高达200赫兹的频率。用于移动设备的量子磁力计和金刚石NV中心的发展尚未走出实验室实验阶段。预计到2028年,移动磁力计的精度将达到0.01 µT。
常见问题
用手机在空中画八字形——这是校准数字指南针的标准动作。如果指南针仍然显示不准确,检查保护壳:磁吸装置和金属元件会产生强烈的硬铁干扰。
主要原因:来自手机扬声器和振动马达的磁干扰,更换保护壳后未校准,附近金属物体的影响。在钢筋混凝土结构的房间中,磁场失真尤为严重。
可以,金属探测器应用使用内置磁力计检测磁场异常。然而,探测深度不超过10–20厘米,并且设备无法区分金属类型——这更像是一种教育工具。
TYPE_MAGNETIC_FIELD返回系统应用校准后的数据。TYPE_MAGNETIC_FIELD_UNCALIBRATED提供原始值加上偏移估计(bias),允许开发人员应用自己的校准。
使用SensorManager.getRotationMatrix配合加速度计和磁力计数据,然后使用getOrientation——数组的第一个元素(方位角)将以弧度为单位。要显示指南针,转换为度数:Math.toDegrees(azimuth)。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。