2. 地磁场模型与测量:WMM、IGRF、磁力计原理与标定

做地磁导航,第一个绕不开的问题就是:地磁场到底长什么样?

我刚开始接触这个方向时,总觉得地磁场不就是个指南针嘛,南北指向就完了。后来真上手做项目才发现——地磁场是个三维矢量场,而且它随时间、空间都在变。你想想看,要拿它做导航,首先得有个“标准答案”去对照。

这一节,我们就来聊聊这个“标准答案”是怎么来的,以及我们怎么把它测准。

2.1 世界地磁模型(WMM)与国际地磁参考场(IGRF)

这两个模型,说白了就是地磁场的“官方地图”。

  • WMM(World Magnetic Model):由美国国家地理空间情报局(NGA)和英国国防部联合发布。每5年更新一次。主要用于军事、航空、航海导航。
  • IGRF(International Geomagnetic Reference Field):由国际地磁学与高空物理学协会(IAGA)发布。也是每5年更新,但更偏向科研用途。

我个人习惯,做工程落地时优先用WMM。为什么?因为WMM的更新更及时,而且它的误差指标是公开的——全球平均误差小于1°,这对导航来说已经够用了。

核心区别一句话:WMM是工程版,IGRF是学术版。两者底层算法一样,都是球谐分析,但WMM更注重实时性和可用性。

2.2 球谐模型:地磁场是怎么算出来的?

地磁场模型的核心,是一个数学公式:

V(r, θ, φ) = a * Σ (a/r)^(n+1) * [g_n^m * cos(mφ) + h_n^m * sin(mφ)] * P_n^m(cosθ)

别被这个公式吓到。我拆开给你看:

  • r, θ, φ:就是你的位置——距离地心的半径、余纬、经度。
  • a:地球参考半径,约6371.2 km。
  • g_n^m, h_n^m:高斯系数。这些系数就是模型的核心参数,WMM和IGRF每5年更新一次的就是它们。
  • P_n^m:施密特准归一化缔合勒让德函数。嗯,名字很长,但你可以把它理解成一组“基函数”。

我在项目中遇到过一个问题:球谐模型的阶数怎么选?

WMM用的是12阶(n=12),IGRF到13阶。阶数越高,局部细节越准,但计算量也越大。对于嵌入式系统,我建议:

  • 如果MCU主频在100MHz以上,跑12阶没问题。
  • 如果资源紧张,可以降到8阶,误差大约增加0.5°~1°。
我的经验:在STM32F4上,12阶球谐模型一次计算大约需要2ms。如果导航周期是10Hz,这个开销完全可以接受。

2.3 地磁传感器(磁力计)原理

模型再好,也得靠传感器去测真实值。常用的磁力计有三种:

类型 原理 典型芯片 精度
各向异性磁阻(AMR) 利用坡莫合金的磁阻效应 HMC5883L, HMC5983 ±0.1°
巨磁阻(GMR) 多层膜结构,电阻变化更大 AA002, AAH002 ±0.2°
磁通门(Fluxgate) 线圈感应,精度最高 RM3100, LSM303 ±0.05°

我个人最常用的是AMR磁力计。为什么?因为它功耗低、体积小、价格便宜,而且精度对大多数导航场景已经够用。磁通门虽然精度高,但功耗和成本都上去了,一般用在航空或深海场景。

注意:磁力计测的是总磁场强度,包括地磁场和周围环境的干扰磁场。你在地铁站、钢筋水泥楼里测到的值,可能有一半都是干扰。

2.4 传感器标定方法

标定,说白了就是把传感器测到的“假值”校正成“真值”。我见过太多人拿着没标定的磁力计数据直接算航向,结果偏了20°还浑然不知。

磁力计的误差主要分两类:

  • 硬铁误差:由传感器附近的永久磁铁或带磁金属引起。表现为测量数据整体偏移。
  • 软铁误差:由铁磁性材料(如钢筋、电机外壳)引起。表现为测量数据被拉伸或扭曲。

标定的核心方法:椭圆拟合

具体步骤:

  1. 拿着传感器在空间中缓慢旋转,采集各个方向的磁场数据。
  2. 理论上,这些数据应该落在一个球面上(地磁场大小恒定)。
  3. 但实际上,由于硬铁和软铁误差,数据会落在一个椭球面上。
  4. 用最小二乘法拟合出这个椭球的参数,然后反算出校正矩阵。

我给大家一个简单的Python代码示例:

import numpy as np

def calibrate_magnetometer(data):
    """
    data: Nx3 矩阵,每行是 (x, y, z) 磁场读数
    返回: 校正后的数据
    """
    # 椭球拟合
    A = np.c_[data[:,0]**2, data[:,1]**2, data[:,2]**2,
              2*data[:,0]*data[:,1], 2*data[:,0]*data[:,2],
              2*data[:,1]*data[:,2], 2*data[:,0], 2*data[:,1], 2*data[:,2],
              np.ones(data.shape[0])]
    
    b = np.ones(data.shape[0])
    
    # 最小二乘解
    coeff, _, _, _ = np.linalg.lstsq(A, b, rcond=None)
    
    # 提取椭球参数
    # ... (这里省略了参数提取的详细推导)
    
    # 返回校正矩阵和偏移量
    return correction_matrix, offset

# 使用示例
raw_data = np.loadtxt('magnetometer_raw.txt')
calibrated_data = calibrate_magnetometer(raw_data)
避坑指南:我曾经在标定时犯过一个低级错误——旋转速度太快,导致数据点分布不均匀。后来我改成慢速旋转,每个方向停留1秒,标定效果立刻好了很多。

2.5 本章知识体系

为了让你更直观地理解这一章的内容,我画了一张流程图:

地磁场模型与测量知识体系 地磁场模型 WMM IGRF 地磁传感器 AMR GMR 磁通门 传感器标定 硬铁误差 软铁误差 椭圆拟合标定法 校正后的地磁场矢量

这张图把本章的三个核心模块串起来了:模型提供参考值,传感器提供测量值,标定消除两者之间的误差。三者缺一不可。

2.6 小结

这一章我们聊了:

  • WMM和IGRF的区别与选择
  • 球谐模型的基本原理
  • 三种磁力计的原理和适用场景
  • 椭圆拟合标定的具体方法

嗯,内容不少。但这些都是后面做地磁导航的地基。地基打不牢,楼盖得再高也得塌。

一句话总结:地磁导航的第一步,不是算法,而是把地磁场模型和传感器标定搞明白。这一步省了,后面全是白干。

专注资料整理