ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IMU与磁力计校准实战:QMI8658A零偏校正与QMC5883L椭球拟合

IMU与磁力计校准实战:QMI8658A零偏校正与QMC5883L椭球拟合 直接说结论我调这两颗传感器踩过的坑80%都能用“没做校准”来解释。QMI8658A是国产六轴IMU内置三轴加速度计和三轴陀螺仪姿态解算的绝对主力QMC5883L是QST家的三轴磁力计常用来做电子罗盘和航向融合。两颗芯片单买便宜、资料不少但如果你照着别人的例程把原始值读出来直接用很快会发现姿态角没问题导航却偏得离谱。原因很简单——MEMS器件出厂一致性再好装到你的板子上之后焊接应力、电源纹波、周边磁铁、马达、扬声器都会给原始数据叠加系统性误差。所以拿到板子的第一件事不是跑算法而是校准。这篇文章把我从零偏校准到椭球拟合的完整流程、代码和踩坑记录都放出来适合正在做无人机、机器狗、手持稳定器或者低成本惯性导航的朋友参考。1. 校准前先把误差来源摸清楚1.1 两颗芯片在系统里的分工和核心参数先说清楚这两颗芯片各自管什么因为很多人把“校准”理解成把读数调到某个固定值但实际上不同类型传感器要校的东西完全不一样。QMI8658A是QST矽睿科技推出的六轴IMU内部集成了三轴MEMS加速度计和三轴MEMS陀螺仪。加速度计负责测量比力静止时可以简单理解为重力加速度陀螺仪负责测量角速度。这两个数据一融合就能得到比较稳的横滚角、俯仰角和航向角。它的通信接口支持I2C和SPII2C的7位地址通常是0x6A或0x6B具体取决于SAO/SDO引脚的电平。量程方面加速度计可选±2g/±4g/±8g/±16g陀螺仪可选±16dps/±32dps/±64dps/±128dps/±256dps实际项目里我习惯加速度计用±4g或±8g陀螺仪用±128dps左右既能保证分辨率又不至于溢位。QMC5883L是QST家的三轴磁力计用来感知地磁场方向输出三个轴的磁场分量。它和HMC5883L在功能上类似很多老代码也尝试互相兼容但寄存器的具体位数和控制逻辑有差别直接套用HMC5883L的驱动经常出问题。QMC5883L默认7位I2C地址是0x0D8位地址是0x1A测量范围典型为±8 gauss内部有可配置的过采样率和输出数据率。这两颗芯片的组合非常经典QMI8658A给姿态角QMC5883L给绝对航向。航向数据用来修正IMU积分产生的漂移姿态数据用来给磁力计做倾角补偿。但如果原始数据本身就有系统误差这套融合算法无论如何都调不好。1.2 误差从哪来零偏、硬铁、软铁三座大山传感器误差可以粗略分成三类理解这三类误差的来源你才知道自己到底在校什么。第一类是零偏误差。陀螺仪静止时理想输出应该是0但因为MEMS结构内部的微小应力、电路放大器的失调电压、温度变化等原因实际输出往往是一个不为0的常数或者在某个小范围内漂移。加速度计静止时理想情况是只感受到1g的重力加速度三个轴的平方和开根号等于1g但零偏会导致这个模长偏离1g比如停在1.03g之类。零偏是IMU里最明显、最先要处理的误差。第二类是硬铁误差。磁力计周围如果有固定的铁磁性材料比如螺丝钉、电池外壳、扬声器磁铁、马达外壳它们会产生一个固定的附加磁场叠加在地磁场上。你转动传感器时这个附加磁场的大小和方向相对传感器几乎不变结果就是磁力计数据的球心从原点被推走了。这个偏移在数据上表现得非常直观模长最小值和最大值不再关于原点对称。硬铁误差的校准思路就是把这个偏移找出来并减掉。第三类是软铁误差。软铁材料本身不产生磁场但会影响磁力线的走向。当磁场沿某个方向经过软铁时会被“压缩”或“扭曲”导致传感器在不同方向上的灵敏度不一致。结果就是原本应该是一个球形的磁力计数据被拉成了一个椭球。此外三个轴的增益不一致、芯片安装的微小倾斜也会贡献类似的椭圆/椭球变形。软铁误差的校准思路比零偏复杂一些但这正是椭球拟合要解决的核心问题。1.3 电路设计上容易被坑的三个点我翻qmi8658a电路图参考设计的时候发现很多人直接抄参考设计但没有内化三个关键点。这些点虽然后期可通过软件校准勉强补但每补一个就得坑掉你好几个小时。第一个是I2C上拉电阻。QMI8658A和QMC5883L如果共用同一条I2C总线需要注意上拉电阻的数量。每颗芯片的SDA/SCL引脚内部一般有弱上拉外部再各放一个4.7kΩ或2.2kΩ看电源电压上拉到VDDIO。如果每个模块都自带独立上拉几颗芯片并在一起会使得总线负载过重导致上升沿变缓。我实测过总线挂三颗带独立上拉的模块400kHz模式下数据偶发错位降到100kHz才稳定。校准程序跑得好好的突然读到跳变值十有八九是I2C信号质量在捣鬼。第二个是去耦电容。IMU这类MEMS芯片对电源纹波很敏感。QMI8658A和QMC5883L的VDD引脚旁边都应该放一个0.1μF陶瓷电容尽量靠近引脚最好再加一个10μF的大电容做低频滤波。我遇到过一块板子陀螺仪静态输出噪声特别大排查半天发现是给传感器供电的LDO输出纹波超标换了低噪声LDO之后数据立刻安静下来。第三个是磁力计的布局。QMC5883L附近不要放排感、电机、喇叭、大电流走线。特别是大电流走线即使离磁力计有几厘米电流变化时产生的磁场变化也足以影响校准结果。更麻烦的是这种磁场是动态的校准算法没法完整消除只能通过重新布局规避。所以画PCB时磁力计往板边放远离电源变换区域是所有校准工作的前提。2. QMI8658A零偏校准先把IMU的“原始”状态掰直2.1 陀螺仪零偏校准静止采样取平均就够了吗陀螺仪的校准目标很简单让静止状态下的输出为零。最常用的方法是静止采集N帧数据求平均值得到零偏然后在每次读数时减去这个零偏。假设采集了200帧静止数据角速度原始值分别为ωx_i、ωy_i、ωz_i单位可以是LSB也可以是换算后的dps那么零偏就是bias_x (1/N) Σ ωx_i bias_y (1/N) Σ ωy_i bias_z (1/N) Σ ωz_i校准后的角速度为ωx_corr ωx_raw - bias_x代码实现非常简单。这里给一个Arduino风格的伪代码#define GYRO_SENSITIVITY 2048.0f // 对应±16dps量程单位LSB/dps实际以数据手册为准 float gx_bias 0, gy_bias 0, gz_bias 0; int16_t gx, gy, gz; long gx_sum 0, gy_sum 0, gz_sum 0; const int samples 200; for (int i 0; i samples; i) { readGyroRaw(gx, gy, gz); gx_sum gx; gy_sum gy; gz_sum gz; delay(10); } gx_bias (float)gx_sum / samples / GYRO_SENSITIVITY; // 单位dps gy_bias (float)gy_sum / samples / GYRO_SENSITIVITY; gz_bias (float)gz_sum / samples / GYRO_SENSITIVITY;看着简单但有几个细节值得注意。采样数量不能太少我建议至少取200帧如果采样率是100Hz也就是2秒以上的数据。太少的话随机噪声没有充分平均掉零点会上下抖。采样时传感器必须完全静止最好放在桌面上不要用手扶着人手的微小抖动会让陀螺仪测到角速度平均出来的零偏就不准了。还有一点经常被忽略MEMS陀螺仪的零偏会随温度变化。刚从冷启动状态读取的零偏和运行10分钟后的零偏可能差不少。所以比较规范的做法是上电预热12分钟等板子温度稳定后再校准。如果是产品化需求还可以在不同温度点做零偏查表补偿但这属于进阶玩法普通DIY场景下预热采样就够了。零偏校准之后静止状态下陀螺仪输出应该稳定在0附近波动幅度取决于传感器本身的噪声水平。如果校准后静止读数还是在±5dps以上跳先不要怀疑校准程序回头查电源和I2C时序。2.2 加速度计零偏校验六面法和模长校验法怎么选加速度计的“零偏”不如陀螺仪那么直接因为加速度计静止时测到的是1g重力而不是0。我们要做的是让它的模长接近1g同时让每个轴的读数都符合物理实际。两种常用方案按场景选即可。方案A是六面静止法也叫六位置法。把传感器分别让X轴朝上、X轴朝下、Y轴朝上、Y轴朝下、Z轴朝上、Z轴朝下每个姿态下静止采集一段时间取平均。记X轴朝上时的加速度计X轴输出为ax_upX轴朝下时输出为ax_down那么bias_x (ax_up ax_down) / 2 scale_x (ax_up - ax_down) / (2g)这里的g是你当地的重力加速度通常取9.81m/s²但如果只是相对校准直接让|scale| (ax_up - ax_down)/2也行。同理可得Y、Z轴的零偏和标度因子。六面法能同时把零偏和标度因子校出来适合对加速度精度要求高的场景比如倾角测量、振动监测。缺点是操作麻烦必须保证每个姿态都足够水平不然会引入误差。方案B是模长检验法。把传感器任意朝向静止放置采集200帧数据求平均得到(ax, ay, az)然后计算模长mag sqrt(ax² ay² az²)如果mag偏离1g说明存在零偏。这个方法只能告诉你误差有多大不能告诉你具体哪个轴偏了。但它速度快适合在姿态解算场景下做快速校验。比如我调云台时可能只需要知道“当前静止模长是不是接近1g”如果偏差超过2%我才会去做完整的六面法。我的经验是如果只是配合磁力计做倾角补偿六面法做一次存下参数就够了因为姿态解算对加速度计的绝对精度要求并不苛刻。但如果你要做计步、跌落检测这类依赖加速度幅值的应用六面法不能省。2.3 寄存器配置和数据读取的细节QMI8658A的寄存器配置并不复杂但有三个坑值得单独说。第一是量程选择。加速度计和陀螺仪各有独立的配置寄存器通常在CTRL2和CTRL3里设置。选好量程后原始LSB转物理值的灵敏度必须查数据手册。比如加速度计±4g量程下典型灵敏度是8192 LSB/g陀螺仪±16dps量程下典型灵敏度是2048 LSB/dps。这些数值一旦搞错校准参数全都会错而且很难发现。第二是数据寄存器读取。QMI8658A的加速度计和陀螺仪输出数据都在一组连续寄存器里可以通过一次I2C突发读取全部拿到。读取前最好先读状态寄存器确认新数据已经准备好避免读到新旧混合的数据。轮询方式虽然简单但如果读取频率和内部输出频率不同步就会偶尔出现一个轴的数据是上一帧的情况。第三是滤波器配置。QMI8658A内部有可配置的数字低通滤波器。开启低通可以让数据更平滑但会引入相位延迟姿态融合算法可能需要相应调整。我建议校准阶段先不滤波或使用较宽的频带让校准参数反映原始器件的真实状态等算法验证通过后再酌情开滤波。// 伪代码示例配置QMI8658A为加速度计±8g陀螺仪±128dps并读取全部数据 writeReg(0x03, 0x00); // 加速度计量程设置具体取决于寄存器定义 writeReg(0x04, 0x00); // 陀螺仪量程设置 // 等待新数据 if (readReg(0x3B) 0x01) { readBurst(0x35, buffer, 12); ax_raw (int16_t)((buffer[1] 8) | buffer[0]); ay_raw (int16_t)((buffer[3] 8) | buffer[2]); az_raw (int16_t)((buffer[5] 8) | buffer[4]); gx_raw (int16_t)((buffer[7] 8) | buffer[6]); gy_raw (int16_t)((buffer[9] 8) | buffer[8]); gz_raw (int16_t)((buffer[11] 8) | buffer[10]); }注意不同批次或不同资料里的寄存器地址可能有细微差别务必以芯片官方数据手册为准。我在网上看到过好几份互相矛盾的寄存器表最后都是靠手册核对才定位到问题。3. QMC5883L硬铁/软铁误差与椭球拟合校准3.1 为什么磁力计输出是椭球而不是球理想情况下把磁力计放在一个地磁场均匀的空间里让你拿着传感器朝各个方向旋转三轴数据画在三维空间里应该是一个圆心在原点的球。这个球的半径就是当地地磁场强度大约在0.25到0.65高斯之间不同城市不同。但现实情况是你拿到的数据形如椭球。造成椭球的有三个原因第一个是零偏硬铁。板子上的铁磁材料附加了一个固定磁场等效于把坐标原点挪走了。反映在数据上原本以原点为球心的球面变成了以某个非原点为中心。第二个是灵敏度不一致。磁力计三个轴的增益可能有差异有的轴放大倍数略大有的略小。这相当于把球沿着某个方向拉伸变成了椭球。第三个是软铁效应。周围软磁性材料会让某些方向的磁场线变密、有些方向变疏效果和轴间灵敏度不一致很相似最终都表现为椭圆体变形。如果不对这些误差做校正直接拿原始磁力计数据算航向角角度会随传感器的姿态和朝向出现很大的偏差。你会发现同一个朝向水平放和竖着放得到的角度不一致这就是椭球误差在捣乱。椭球拟合的目的就是从这个椭圆体的点云里估算出椭球的中心以及从椭球到标准球的变换矩阵。有了中心和变换矩阵就能把任意原始测量值映射到一个近似单位球面让磁力计的输出重新变得“均匀”。3.2 椭球拟合的数学原理一次搞懂10参数二次曲面估计椭球在三维直角坐标里的一般方程可以写成x² * A y² * B z² * C 2xy * D 2xz * E 2yz * F 2x * G 2y * H 2z * I J 0这里A到J一共10个参数但方程可以整体缩放所以自由度为9。我们要做的是给定一堆测量点(xi, yi, zi)求出这10个参数使得所有点尽可能满足方程。这是个线性最小二乘问题。把每个点代入方程后得到一个线性方程。将所有点的方程堆叠起来得到一个N×10的矩阵D其中每行是[x², y², z², 2xy, 2xz, 2yz, 2x, 2y, 2z, 1]我们要找一组非零向量v即A~J这10个参数使得D·v ≈ 0。因为方程允许整体缩放所以不能直接令v为0要施加一个约束比如||v|| 1。求这个约束最小二乘解的标准方法是对D做SVD分解D UΣVᵀ最小奇异值对应的右奇异向量就是我们要的v。这个方法在数学上叫做“总最小二乘”实现起来只需要一个SVD函数非常适合嵌入式上位机脚本。拿到参数后恢复出矩阵A_mat [[A, D, E], [D, B, F], [E, F, C]] b_vec [G, H, I] c J椭球中心为offset -0.5 * A_mat⁻¹ * b_vec这个offset就是硬铁校准要减掉的零偏。接下来要处理软铁变形。将原始点减去offset得到以椭球中心为中心的数据然后做去中心化的SVD或特征值分解求出椭球的三个主轴方向和半轴长度。每个点沿主轴方向按半轴长度缩放就能把椭球压回单位球。实际应用中合并这个缩放和主轴旋转最后得到一个3×3的修正矩阵M。3.3 Python实现椭球拟合与使用修正矩阵我把这个算法整理成了一份可直接使用的Python脚本。它接收一个N×3的数组输出offset和修正矩阵M。上层固件拿到这两个量之后对每个原始磁力计点做运算mag_fixed M (mag_raw - offset)输出就是一个近似单位球上的点。import numpy as np def ellipsoid_fit(data): 输入: data, shape (N, 3), 原始磁力计数据 返回: offset (3,), transform (3,3) 使得 (transform (data - offset)) 的模长近似为一个常数 x data[:, 0] y data[:, 1] z data[:, 2] D np.column_stack([ x*x, y*y, z*z, 2*x*y, 2*x*z, 2*y*z, 2*x, 2*y, 2*z, np.ones_like(x) ]) _, _, Vt np.linalg.svd(D) v Vt[-1] # 最小奇异值对应的右奇异向量 A np.array([ [v[0], v[3], v[4]], [v[3], v[1], v[5]], [v[4], v[5], v[2]] ]) b np.array([v[6], v[7], v[8]]) c v[9] offset -0.5 * np.linalg.solve(A, b) centered data - offset # 用SVD求椭球主轴方向和尺度 U, S, Vt2 np.linalg.svd(centered) # 沿主轴方向缩放为等尺度 # 目标是把椭球变成单位球每个主轴按半轴长度缩放 scales S.mean() / S transform (Vt2.T * scales) Vt2 # 也可以再进一步归一化但上述形式已经能让点云接近球面 return offset, transform # 使用示例 data np.loadtxt(mag_raw.csv, delimiter,) # 每行: mx,my,mz offset, M ellipsoid_fit(data) # 保存参数 np.save(mag_offset.npy, offset) np.save(mag_transform.npy, M) # 验证对原始数据应用修正 fixed (data - offset) M.T norms np.linalg.norm(fixed, axis1) print(校准后模长 min{:.4f} max{:.4f}.format(norms.min(), norms.max()))这个脚本在PC上跑完把offset和M存成浮点数组写进固件即可。实际工程里不需要在单片机上跑拟合采集数据交给上位机结果回填固件这是一种性价比最高的分工方式。3.4 把校准参数烧进固件应用修正的正确姿势拿到offset和M矩阵后最关键的是在固件里正确应用矩阵乘法。矩阵M是3×3的但对每个点应用时要注意乘法的顺序我习惯先减offset再做矩阵变换float mx_fixed 0, my_fixed 0, mz_fixed 0; void applyMagCalibration(float mx, float my, float mz) { float px mx - mag_offset[0]; float py my - mag_offset[1]; float pz mz - mag_offset[2]; mx_fixed mag_transform[0][0] * px mag_transform[0][1] * py mag_transform[0][2] * pz; my_fixed mag_transform[1][0] * px mag_transform[1][1] * py mag_transform[1][2] * pz; mz_fixed mag_transform[2][0] * px mag_transform[2][1] * py mag_transform[2][2] * pz; }如果矩阵系数存储为float数组注意单片机的存储对齐和大小端问题。我踩过的一个坑是在上位机里算出的矩阵是行主序写进C数组时忘了转置结果航向角整个错乱。建议在代码里写一个简短的单元测试用一组已知的原始点算一遍期望输出确认修正逻辑没问题再进入主循环。4. 数据采集策略与完整校准流程4.1 采数姿势决定校准成败别只会转圈椭球拟合对数据分布很敏感。如果采集到的点只覆盖椭球的一部分拟合出来的椭球就只是“猜”出来的校准参数根本不靠谱。很多朋友拿到例程后就在桌上平转一圈Z轴几乎没有变化拟合结果自然一塌糊涂。我的建议是采用“三圈覆盖法”第一圈传感器水平放置在水平面上缓慢旋转一整圈第二圈把传感器立起来像转动方向盘一样让Y轴朝上旋转一整圈第三圈让传感器侧面立起以Z轴为旋转轴旋转一整圈。这样基本能覆盖整个球面的主要方向。如果时间允许再做几个“8字形”或“太极式”的慢速摆动把球面上的空隙补一补。采集时动作一定要慢。磁力计本身输出速率不高动作太快会导致数据点分布不均。理想情况下每秒钟采1020个点总共采集200600个点就够了。太多没有必要太少拟合不稳定。采样过程中要远离大块铁磁物体。桌面上的金属支架、手机、音箱都有可能造成额外干扰。最好把设备放在塑料或木质桌上手机放到几米外。这一条听起来像是废话但你会发现校准结果离奇地差十有八九是采样环境里藏着一个铁疙瘩。4.2 从串口原始数据到最终系数的完整流水线我把整个校准流程固化成了下面这套流水线照着走一遍就能完成两颗传感器的标定第一步上电预热。板子上电后先等12分钟让温度稳定同时让内部电路进入稳定工作状态。第二步采集陀螺仪零偏。把设备放在固定位置采样200帧静止陀螺仪数据算出三个轴的零偏并保存。第三步采集加速度计数据。如果时间充裕做六面法每个姿势各采50帧。如果只是快速验证让设备静止看模长误差误差大再补做六面法。第四步采集磁力计数据。用三圈覆盖法采集300个点以上数据通过串口发到PC保存为CSV文件。建议每条数据带上时间戳方便后续查看。第五步跑椭球拟合脚本。把CSV喂给Python脚本输出offset和M矩阵。第六步把三个部分参数陀螺零偏、加速度计参数、磁力计参数写入固件启动时加载。这套流水线最大的好处是“分步校准、分步验证”。每一步的参数都有独立的意义出了问题能快速定位到哪颗传感器而不是在融合算法里大海捞针。4.3 校准效果验证怎么判断校准得够不够好校准做完不能直接收工要验证效果。我习惯用三个指标第一个指标是磁力计模长一致性。对校准后的磁力计数据计算模长统计最小值和最大值。如果最小值和最大值的比值在0.95以上即波动不超过5%说明校准结果已经不错。如果小于0.9说明还有明显误差多半是数据覆盖不够或软铁干扰没处理好。第二个指标是陀螺仪静止零偏稳定性。校准后把设备静止放桌上连续观察10秒角速度输出看它是否在±0.5dps以内或者至少在此基础上不会越漂越大。如果静止数据还有明显偏移回查第二步。第三个指标是航向角稳定性。这是最终端到端的验证。把设备放在桌面上缓缓旋转观察计算出的航向角是否连续并且在固定位置停住后是否基本保持不变。注意这里计算航向角不能直接用atan2(mx, my)因为磁力计是倾斜安装或处于非水平状态时需要先做倾角补偿。我常用的补偿公式是// pitch和roll由加速度计或IMU融合得到单位弧度 float Xh mx_fixed * cos(roll) mz_fixed * sin(roll); float Yh mx_fixed * sin(pitch) * sin(roll) my_fixed * cos(pitch) - mz_fixed * sin(pitch) * cos(roll); float heading atan2(Yh, Xh);你使用的pitch和roll定义不同公式符号会有一点差异但核心思想是把磁力计向量投影到水平面再求方位角。如果陀螺零偏、加速度计参数、磁力计校准都做得对这个heading在静止时的波动应该控制在几度以内。5. 常见问题与排查技巧实录5.1 磁力计校准后航向依然漂移怎么办这个问题我遇到过很多次而且每次的原因还都不一样。最常见的第一个原因是周围存在动态磁场干扰。电机转动、电感啸叫、大电流走线上的电流突变都会产生变化的磁场。椭球拟合只能消掉固定的硬铁和软铁误差对动态磁场无能为力。排查方法是手机开一个磁力计读数软件在设备周围转一圈看磁场模长是否剧烈变化。如果变化超过地磁场本身的强度先处理电磁干扰源比如给电机加屏蔽、把大电流走线绕开磁力计再重新校准。第二个常见原因是忽略倾角补偿。如果拿着设备有倾斜角度不把磁力计向量投影到水平面就直接算atan2航向角会随俯仰角变化而波动。这种情况看起来像“漂移”其实是算法没有补偿倾斜。配合IMU做倾角补偿后一般能解决。第三个原因是数据同步问题。QMI8658A和QMC5883L如果通过同一I2C总线读取每次读到的不是同一时刻的数据融合时就会引入滞后误差。在校准验证阶段尽量把两个传感器的读取放到同一个时间戳下或者选择QMC5883L的DRDY引脚来同步数据。5.2 QMI8658A数据跳变或噪声偏大的排查思路QMI8658A在初始调试阶段经常表现出“数据跳变”或“噪声大”的现象。我的排查顺序是第一步查供电。用示波器看VDD引脚如果毛刺超过几十毫伏优先换LDO或加大电容。MEMS传感器的模拟电路对电源很敏感很多“噪声”其实是电源噪声。第二步查I2C时序。把I2C速率降到100kHz看跳变是否明显减少。如果减少说明总线负载或布线有问题。顺便检查上拉电阻的值我遇到过用10kΩ上拉导致波形上升沿太缓的情况换4.7kΩ后正常。第三步查量程和灵敏度配置。如果配置寄存器的量程错误原始数据可能出现半程跳变比如明明只动了一点点读数却跳到最大值的一半。量程选小了会溢出选大了分辨率受影响要核对数据手册。第四步关闭内部滤波后对比。开启低通滤波会掩盖部分问题在校准阶段先把滤波关掉或把带宽调到最高看原始数据是否干净。如果原始数据就跳动很大滤波只是在“美化”而不是解决问题。5.3 经验速查表校准参数保存、迁移与后续扩展为了方便阅读我把和校准参数相关的经验整理成了一张速查表推荐收藏备用。项目推荐做法备注参数存储存入EEPROM或Flash启动时读取避免每次都重新校准参数格式用float保存注意大小端和存储对齐陀螺零偏采样200帧10ms间隔预热12分钟再采集加速度计校准六面法优先模长法快速验证每个姿态至少50帧磁力计采点300600点三圈覆盖法远离铁磁物体椭圆拟合输出offset 3×3矩阵矩阵乘法顺序要验证校准触发方式串口指令触发自动校准适合产线或现场调试二次校准更换结构、更换芯片后必须重做结构固定后参数一般稳定还有两个小技巧算是我的私货。第一把校准脚本做成PC端小工具串口收到数据实时显示三维散点图看到点云慢慢变成一个椭球你心里就有数了。第二量产时如果板子结构固定校准参数可以只做一次“母板标定”然后把参数复制到同批次设备但前提是PCB和装配完全一致否则还是建议逐台在线校准。最后再提醒一句校准不是一劳永逸的。如果发现设备用了几个月后航向偏差变大先怀疑温度漂移和结构松动重新校准一次。校准参数和结构强相关外壳变形、螺丝松动、加装了新的磁铁支架都会让之前的参数失效。把这些当作常规维护的一部分比你死磕融合算法要省事得多。
返回列表