资讯动态

IMU标定全解析:从零偏、尺度误差到Allan方差与Kalibr实操

发布时间:2026/10/6 11:04:04 来源:尧图企业网站定制
我做了快十年机器人感知和组合导航被问得最多的问题就是为什么我的IMU数据飘得这么离谱明明买的是几千块的模块静止放在桌面上积分出来的姿态却像喝醉了一样满天飞。其实大多数时候不是IMU本身坏了而是你根本没弄懂它的误差到底从哪来也没花时间去标定。这篇文章我想把IMU标定这件事一次讲透。围绕偏置、尺度误差、轴偏差这三个核心参数展开误差模型、标定原理、实操命令和常见坑覆盖ROS生态里常用的imu_utils、Kalibr工具链也会结合智能小车纠偏、相机IMU联合标定这些实际场景去说。无论你是刚接触SLAM、做视觉惯性导航还是在调自己的小车底盘这篇文章都值得收藏下来慢慢看。1. 先从误差模型说起飘的根源在哪里很多做SLAM的同学一上来就急着采集数据、跑算法姿态飘了就去调滤波器方差折腾半天没效果。真正的问题在于你对IMU内部发生了什么完全没概念。理解误差模型是标定的前提也是后面排查所有问题的底子。1.1 零偏最影响“飘”的罪魁祸首零偏bias是IMU误差里最核心、最致命的一项它的本质是当IMU处于完全静止状态时加速度计和陀螺仪的输出并不是理想中的0g和0°/s而是一个偏离真实值的常量。为什么会有这个偏差因为它不是单一物理原因造成的而是多种效应的叠加。MEMS惯性器件里检测质量块在加工时就有不对称残余应力、封装时的机械应力、ASIC读出电路失调电压、温度梯度引起的热噪声最后都会折算成输出端的一个固定偏移。你可以把它理解为一把尺子的“零点没对准”你量物体长度的时候无论量什么都带着这个系统误差。这个偏差在导航里有个很麻烦的特性就是它会随时间缓慢变化我们叫零偏不稳定性bias instability变化的快慢和幅度取决于传感器等级。战术级IMU的零偏稳定性能做到0.1°/h以内消费级MEMS陀螺仪通常在10-100°/h加速度计零偏稳定性一般在0.1-1mg左右。用消费级IMU去做纯惯性积分几秒钟就开始飘就是零偏在积累二次积分误差这个“飘”是指数级放大的。零偏还可以继续拆成两部分来看固定零偏turn-on bias每次上电后固定不变但每次上电的值都可能不一样。这属于确定性误差通过标定可以补偿掉大部分。运行中漂移in-run bias上电后随时间缓慢变化主要受温度影响。这个靠一次标定无法彻底解决需要算法层面的实时估计也就是很多融合算法里把bias作为状态量去在线估计的原因比如VINS-Mono里就同时估计加速度计和陀螺仪的bias。在实际标定流程里我们通常会用长时间静止的数据来估计这个值因为静止条件下IMU的真实角速度和真实加速度都是已知的输出均值就是零偏的最佳估计。1.2 尺度误差与轴偏差标定中容易被忽略的“隐形误差”尺度误差scale factor error和轴偏差misalignment是标定里最容易被人忽略、但对导航精度影响巨大的两个参数。尺度误差的物理本质是IMU输出的数字量与实际物理量之间存在一个比例偏差。这个偏差来自传感器增益电阻的精度误差、ADC参考电压偏差、数字滤波器的增益误差等。举个例子如果你给陀螺仪一个真实的50°/s角速度但传感器读出来是50.5°/s那么这个0.5°/s的差值就是尺度误差引起的。这个误差是线性的、可重复的所以非常适合通过标定来修正。轴偏差则是由于MEMS传感器的三个敏感轴X、Y、Z在封装时与芯片的机械基准面没有严格垂直。理论上三个轴应该两两正交但实际制造会有几度甚至十几度的偏差尤其是在低成本的消费级模组里。轴偏差会导致你只在绕X轴旋转时Y轴和Z轴也会读出角速度分量这会让后续的姿态解算产生严重的耦合错误。很多人滤波不收敛、姿态乱跳就是没处理好轴偏差绕一个轴转时另一个轴也在“动”滤波器看到的就是一个自相矛盾的观测值。在数学上尺度误差和轴偏差通常合在一起建模成3×3的尺度-失准矩阵一般用上三角或下三角的6个参数来描述轴偏差的六个方向耦合分量加上3个尺度因子一共9个待标定参数。这就是后面Kalibr、imu_tk这些工具里所谓“9参数内参标定”的由来。1.3 噪声与随机游走标不掉但必须估准偏置、尺度、轴偏差属于确定性误差是可以通过标定补偿的。但IMU里还有一种误差是标定永远无法消除的就是测量噪声和随机游走。测量噪声的典型表现是白噪声它的均值为零但是方差不为零。积分的时候白噪声虽然均值是零但积分本身就相当于一个随机游走过程也就是角度误差会随时间做随机游走扩散。这个参数一般用角度随机游走ARW单位是°/√h来描述加速度计对应速度随机游走VRW单位是m/s/√h。随机游走bias random walk则是零偏在更长时间尺度上的随机波动用速率随机游走来描述单位是°/h/√h。这部分误差来自传感器内部电子器件的1/f噪声、温度波动等。你可能会问既然标定消除不了噪声为什么要花时间去估计它因为所有融合算法里噪声方差也就是ARW/VRW和bias instability是设置协方差初值的重要依据。滤波器或者优化算法里的噪声协方差如果设置得和传感器实际特性不匹配整个系统就会出现过估计或欠估计表现就是姿态该收敛的时候不收敛定位轨迹发飘或者更新时被某个传感器带跑偏偏。Allan方差分析就是为了从数据里测出这些随机误差参数然后把它们填进VINS、ORB-SLAM3、OpenVINS这些系统的配置参数里去。这里顺便回答一个很常见的问题标定能解决“飘”吗答案是可以解决掉很多但不能解决所有。确定性误差标定实时零偏估计合理的噪声参数这三位一体才能让IMU数据可用。很多人只做了其中一步就抱怨标定没用其实是没理解整个链路。2. 标定前的准备姿势不对标定白费IMU标定这件事数据采集质量直接决定标定结果质量。很多时候不是标定算法不行而是采集数据前犯了低级错误比如手抖、地面振动、没预热导致标定结果看起来有模有样实际一用就露馅。2.1 传感器选择与数据采集的基本纪律先说硬件准备。标定IMU的传感器至少需要满足一个基本前提你能拿到原始的角速度和加速度数据。很多集成方案里带了内部融合算法、输出了四元数这种是做不了内参标定的因为内部的补偿逻辑已经帮你处理过了。ROS里常见的做法是通过驱动节点直接发布/imu/data_raw这个topic里包含的是未经外部标定补偿的原始测量值。数据采集有几个纪律我觉得比选哪款IMU更重要固定牢靠。IMU必须牢固安装在刚性平台上不能有弹性悬挂。标定过程中的任何意外晃动都会污染数据。我见过有人手持IMU采集标定数据结果陀螺仪的零偏估计出来是负的因为手在无意识抖动求均值的时候把数据弄偏了。充分预热。MEMS器件上电后需要一段时间达到热平衡通常建议10到30分钟。冷启动状态下直接采数据后面几分钟数据会有一个明显的热漂移过程会让标定结果偏大。远离热源和振动源。IMU旁边不要放稳压电源、电机、风扇这些会引起局部温度梯度和振动。在轮式机器人上标定时尽量断电关机采集不要放在带电状态的小车上采因为电机在待机状态下也有微弱振动。数据长度足够。静止标定的数据分析Allan方差需要至少2小时的数据才能得到稳定的长周期参数短数据会导致bias instability估计不出来。工业和学术上有个惯例是6小时但实际项目中2-3小时基本可用。2.2 静止采集与转台采集两种数据各有什么用途IMU标定数据一般分两类用途完全不同很多人混在一起用这是个大坑。静止数据IMU相对于地面完全静止时采集的数据。这种数据的用途有两个一是估计零偏因为静止时真实角速度是0真实加速度是重力加速度大小已知、方向待求所以输出均值里的偏差就是零偏二是做Allan方差分析因为静止时除了随机噪声和零偏漂移几乎没有别的分量统计学分析才能剥离出随机误差参数。静止采集的姿势没有硬性要求但摆放位置要避开桌面共振频率机械硬盘的振动、空调风口的低频抖动都可能被IMU捕获。多位置/旋转数据IMU在至少6个不同姿态下静止采集的数据或者转台上旋转采集的数据。这种数据的用途是估计尺度误差、轴偏差和加速度计零偏。原理是这样的不管IMU怎么转重力矢量的模长恒为1g9.80665 m/s²左右当你把IMU转到不同姿态时重力在三个轴上的投影会变化。通过对比实际投影和理论投影就可以反推出三个轴的尺度和轴间耦合系数。这本质上是把IMU当成了一个“姿态传感器”来标定利用重力这个天然的绝对基准。转台采集注意如果是单轴转台最好让IMU绕两个不同轴分别旋转避免轴偏差参数不可观。多位置法和转台法的本质差别在于转台可以提供已知的高精度角速度因此陀螺仪的尺度误差和轴偏差估计更准而多位置法只能用重力标定加速度计陀螺仪的尺度只能靠地球自转但太微弱消费级IMU几乎标不出来。2.3 一次成功的IMU标定需要哪些工具链工具链方面我按自己的使用习惯列一个清单都是开源免费、社区成熟度高的工具ROS工具imu_utils离线Allan方差分析和零偏估计配合code_utils编译标定工具箱imu_tk多位置标定的经典实现适合加速度计内参Kalibr相机-IMU联合标定也支持纯IMU内参标定但主要是外参标定数学工具MATLAB的imufilter、Sensor Fusion and Tracking ToolboxPython的scipynumpy自己写优化也可以用数据记录ROS的rosbag record注意要记录时间戳IMU数据必须有精确时间戳否则联合标定会出现时间不对齐的问题工具不在多关键是理解每一步在做什么。下面我会以ROS生态为主讲一套完整的实操流程先用imu_utils做Allan方差分析零偏估计再用Kalibr做相机-IMU联合标定中间穿插imu_tk做加速度计内参校准。3. 核心参数与标定方法从六面静止到Allan方差这一章是整个文章的核心我会分别讲清楚偏置、尺度误差、轴偏差这三个参数的标定原理和计算方法。如果你能理解这一章后面用任何工具都会非常顺手因为你不再是把命令跑通就完事而是知道每一步在解什么数学问题。3.1 六面静止标定用重力做基准六面静止标定是加速度计标定的经典方法也是理解IMU标定原理的入门题。所谓六面就是让IMU的X轴朝上、X轴朝下、Y轴朝上、Y轴朝下、Z轴朝上、Z轴朝下每个姿态静止采集一段时间一般30秒左右每个姿态下的加速度均值记录下来。理想情况下X轴朝上时加速度计输出应为(1g, 0, 0)X轴朝下时输出应为(-1g, 0, 0)以此类推。但实际输出会偏离这个理想值。我们用6个姿态的数据联立方程可以求解出加速度计的零偏3个参数、尺度误差3个参数和轴偏差6个耦合参数或简化为3个正交性偏差角。数学上是这样建模的。假设真实比力为g测量输出为y那么有y S · M · g b n其中S是3×3对角尺度矩阵M是描述轴偏差的3×3上三角或下三角矩阵b是零偏向量n是噪声。标定就是利用已知g在不同姿态下的投影去估计S、M、b这12个参数或者简化模式下9个参数。举个例子如果你采集了10个姿态比六面更多的多位置法每个姿态下都有等式通过最小二乘或者更鲁棒的优化方法就可以求出这些参数。这里有个细节用重力作为基准时重力加速度的模长和方向是已知的但重力加速度的具体数值和当地纬度、海拔有关不过九点八这个量级下1mg的差异对消费级IMU标定影响微乎其微一般在代码里直接用9.80665这个常数完全够用。多位置法的优势是在室内就能完成不需要转台这种昂贵的设备代价是加速度计参数能标得很准但陀螺仪的参数标不了。这也是为什么旋转采集的标定方法更全面。3.2 Allan方差分析量化噪声与零偏不稳定性Allan方差是上世纪60年代David Allan为研究原子钟频率稳定度提出的一种时域分析方法后来被广泛应用到惯性传感器的随机误差分析里。它解决的核心问题是如何从一段静止数据中分离出不同时间尺度上的噪声成分从而估算出角度随机游走、速率随机游走、零偏不稳定性等参数。它的做法非常直观。把一段长时间的数据按不同的时间长度T分帧每帧内求平均然后计算相邻帧平均值之差的方差得到的就是Allan方差。这个方法的一个特性是它会在双对数坐标下呈现不同的斜率段每一段对应一种随机误差类型时间尺度T双对数曲线斜率对应误差项典型特征短T-1/2角度随机游走白噪声数据快速跳动导致的积分误差中T0零偏不稳定性曲线谷底就是bias的长期漂移水平长T1/2速率随机游走零偏做随机漫步很难补偿更长T1速率斜坡单调漂移温度效应主导实际操作中我们用imu_utils工具自动处理这个分析过程。这个工具会输出一张双对数曲线图同时在终端打印出计算好的噪声参数。你拿到手的参数通常是这样的gyr_noise陀螺仪的角度随机游走单位rad/s/√Hz或者折算成°/√hacc_noise加速度计的噪声密度单位m/s²/√Hzgyr_bias_instability陀螺仪零偏不稳定性单位rad/sacc_bias_instability加速度计零偏不稳定性单位m/s²这些参数会直接进入VINS的配置文件和Kalibr的IMU配置里所以先做这一步再去做联合标定整个流程才不会乱。实测经验提醒Allan方差分析对数据量极其敏感少于1小时的数据基本只能看到白噪声段无法正确估计bias instability估计出来的值明显偏大。所以想做准至少采2小时以上静止数据中间不要碰传感器、不要开关灯大功率设备。3.3 转台标定与多位置法把尺度误差和轴偏差拆开加速度计的尺度误差和轴偏差可以用多位置法标出来但陀螺仪的尺度误差和轴偏差就没那么容易了。为了标定陀螺仪的内参通常需要转台来提供已知角速度或者用一种叫“rate test”的方法让转台以固定的角速度旋转对比IMU输出与转台设定的角速度从而求出尺度误差和轴偏差。rate test的原理很简单转台转速是已知的比如精确设定为100°/s那么IMU角速度输出的均值如果是100.5°/s就能算出尺度因子是1.005。为了让轴偏差也可观你需要分别绕三个正交轴旋转每个轴正反各转一边共6组数据或者更多。如果没有转台只能用多位置法陀螺仪静止数据估计零偏。这也是很多标定工具比如imu_tk默认的做法。它只解决加速度计内参和陀螺仪零偏陀螺仪的尺度和轴偏差是标不了的。很多同学不知道这个限制以为跑完imu_tk就万事大吉结果陀螺仪尺度和轴偏差误差还在在剧烈运动场景下就会暴露出来。所以我的建议是如果预算允许高精度应用上转台是必要的。如果只是消费级小车、室内SLAM用多位置法Allan方差基本够用因为陀螺仪的尺度和轴偏差误差通常只有0.1%-1%在温和运动场景下影响不大。而转台本身很贵一般只有专业的标定服务商和大型实验室才有。3.4 VINS/滤波器中这些参数怎么用标定出来的参数最终是要喂给算法使用的。以VINS-Mono为例它的配置文件euroc_config.yaml里有几个关键参数就是直接来自标定结果# 加速度计噪声密度和随机游走 acc_n: 0.0836157906179 # (m/s^2) / sqrt(Hz) acc_w: 0.0034341378289 # (m/s^2) / sqrt(Hz) * sqrt(Hz) # 陀螺仪噪声密度和随机游走 gyr_n: 0.00387639781748 # (rad/s) / sqrt(Hz) gyr_w: 0.00004761568734 # (rad/s) / sqrt(Hz) * sqrt(Hz)acc_n、gyr_n对应的是Allan方差分析里的角度随机游走参数acc_w、gyr_w对应的是速率随机游走。很多调参党只会拍脑袋调协方差其实正确做法是先通过Allan方差分析拿到真实数据再根据融合效果微调。零偏的初始值一般不用填在配置文件里因为大多数开源算法都会把bias作为状态量在线估计有初始估计更好没有也能收敛。但尺度误差和轴偏差参数开源算法里基本不会用因为VINS这类算法假定IMU内参已经校准过了输入给它的是已经完成内参补偿的“干净”数据。这也从另一个角度说明了为什么在跑VINS之前先把内参标定做好。4. 实操过程在ROS里完成一次完整标定看完原理我们来一次完整的实操。整个过程我假设你用的是ROS我以ROS Noetic/Ubuntu 20.04为例Melodic同理有一块支持ROS驱动发布的IMU比如Realsense D435i、车萝卜等或自制的MPU6050/ ICM20602方案。4.1 环境准备与数据采集首先确保ROS驱动能正常发布IMU的原始数据topic。推荐先检查rostopic list | grep imu rostopic echo -n1 /imu/data_raw确认数据在动、时间戳正常后就可以开始数据采集了。这里我强烈建议分两次采集第一次把IMU固定在一个稳定的刚性平台上比如桌面不要碰它记录至少2小时的静止数据用于Allan方差分析。采集命令rosbag record -O imu_static.bag /imu/data_raw第二次手持或者用支架让IMU在空间里缓慢旋转尽量覆盖所有姿态同时一定要让运动平缓避免撞击、跌落记录5-15分钟就好用于多位置标定。但这个采集姿势很容易引入人为误差如果你有泡沫块或双面胶把IMU贴在台面上然后用手均匀翻转会稳很多。如果后面要做相机-IMU联合标定这组数据也可以是带着标定板一起采集的高动态数据。注意rosbag要记录原始topic不要记录经过算法融合过的增强IMU数据。很多IMU模组默认开启了内部融合输出的角速度、加速度已经被内部算法修正过这种数据虽然看起来更平滑但不能用于标定。4.2 用imu_utils离线分析imu_utils是一个基于C的IMU数据分析工具专门做Allan方差分析和零偏估计。编译方式网上资料很多这里简要说明流程。编译步骤依赖code_utils和ceres-solvermkdir -p ~/imu_calib_ws/src cd ~/imu_calib_ws/src git clone https://github.com/gaowenliang/code_utils.git git clone https://github.com/gaowenliang/imu_utils.git cd ~/imu_calib_ws catkin_make如果编译报错找不到backward通常需要先编译code_utils再编译imu_utils这是官方仓库里的已知顺序问题。采集完2小时静止数据后运行分析。先启动roscore然后播放bag的同时运行imu_utils节点roscore rosrun imu_utils imu_anlyzer -t 1.5 -d /imu/data_raw -o /tmp/imu_calib其中-t指定分析时长单位小时要根据bag实际长度调整。等待运行完成后会在指定输出目录生成一系列文件包括imu_acc.yaml加速度计的Allan方差拟合结果里面有noise_density和bias_instabilityimu_gyro.yaml陀螺仪的对应结果打开yaml文件你会看到类似这样的内容gyr: noise_density: 2.315339956937e-03 random_walk: 3.143693620047e-05 bias_instability: 3.485406340875e-04这些值单位是连续的物理量分别对应白色的角度随机游走、速率随机游走和零偏不稳定性。把它们折算成VINS配置里的gyr_n和gyr_w注意单位换算。通常VINS里gyr_n填的是noise_density本身gyr_w填的是random_walk值。加速度计同理加速度计的noise_density填到acc_nrandom_walk填到acc_w。这个工具还顺带输出零偏的估计值我看过很多次和静止数据均值基本一致所以零偏也可以直接用静止1分钟数据算均值获得效果差不多。4.3 用imu_tk做加速度计多位置标定如果需要加速度计的尺度误差和轴偏差用imu_tk是效率最高的。它是一个C库也提供了命令行工具。编译安装后运行imu_tk_calib -i imu.bag -m /imu/data_raw -o calib_result.txt它会自动从bag里读取数据检测分段点每次改变姿态之间的静止段然后通过优化估计出加速度计的尺度、轴偏差和零偏。运行前记得给它采包含多种姿态的数据至少8-12段每个姿态保持2-3秒。运行结束会生成一个文件比如calib_result.txt里面包含12个参数Scale: 0.997 0.000 0.000 0.000 1.002 0.000 0.000 0.000 1.001 Misalignment: 0.998 -0.005 0.002 0.004 0.999 -0.003 -0.002 0.003 0.997 Bias: 0.012 -0.008 0.015里面Scale矩阵对角线接近1、Bias是零偏、Misalignment是轴偏差、尺度耦合的综合矩阵。实际使用中可以把这三部分合成为一个3×3内参矩阵加一个零偏向量写进自己的预处理节点里对原始数据做补偿。4.4 用Kalibr做相机-IMU联合标定相机和IMU的外参旋转和平移标定在视觉惯性系统里的重要性不亚于内参因为外参标错了整个系统就会出奇怪的问题比如初始化慢、尺度漂移明显。Kalibr的核心流程是在IMU静止时通过相机标定板得到相机的姿态估计然后把IMU的输出和相机姿态估计联系起来优化出相机-IMU的相对位姿、时间延迟以及IMU的内参如果同时发布原始IMU数据。使用Kalibr前需要先准备标定板常见的是棋盘格或者Aprilgrid。建议用Aprilgrid因为在动态运动时更鲁棒不会出现局部误检。标定相机的内参kalibr_calibrate_cameras --target april_6x6_80x80cm.yaml --bag cam.bag --topics /cam/image_raw --models pinhole-radtan然后进行相机-IMU联合标定kalibr_calibrate_imu_camera --target april_6x6_80x80cm.yaml --cam camchain-imucam.yaml --imu imu.yaml --bag imu_cam.bag --time-calibration这个过程中imu.yaml里的参数来自我们之前Allan方差分析的结果Kalibr会用它们作为IMU误差的初值并在优化中当作先验信息。最后得到的结果文件中包含了cam0: T_cam_imu: rotation: [0.014, -0.999, -0.020, ...] translation: [0.021, 0.003, -0.017] timeshift_cam_imu: -0.125其中T_cam_imu就是相机到IMU的外参timeshift_cam_imu是相机和IMU图像帧的时间延迟。这两项是VINS、ORB-SLAM3联合标定的关键参数。4.5 标定结果如何解读与验证标定做完不代表就结束了你需要用一组独立的验证数据确认标定结果确实有效。最简单的验证方法是做静止稳定性对比。分别用原始IMU数据和经过内参补偿的数据做静止姿态积分看谁的姿态漂移慢。如果标定有效补偿后静止姿态漂移应该明显减小尤其是绕重力方向的航向角漂移。但要说清楚即使标定很好静止放置时航向角还是会漂移因为陀螺仪零偏不稳定性决定了航向通道的漂移下限标定只能降低这一下限不能消除。更严格的验证方式是重投影误差对比跑一段VINS的数据集看标定前后初始化时段的相机重投影误差、IMU残余误差是否有显著下降。如果标定结果正确联合优化时的残差会下降如果标定反了符号错误残差会爆炸运行结果会是乱七八糟的轨迹。一个小技巧标定完成后把相机保持静止左右晃动IMU或者反过来然后看相机和IMU的姿态是否一致变化。外参正确的话在纯旋转运动下VIO应该能稳定跟踪姿态不发散。5. 常见问题与排查技巧实录讲了这么多流程最后一定要把实战中的坑分享出来。IMU标定这个事坑特别多很多问题看起来是“标定不准”实际上却是数据采集中某个小细节没做好。5.1 问题速查表先放一个整理好的速查表方便你快速定位问题现象可能原因排查/解决方案Allan方差曲线无谷底数据时间过短或传感器异常至少采2小时静止数据检查振动源零偏估计为负且数值大采集时传感器在运动或有振动重新采集静止数据固定传感器标定后姿态反而更漂尺度/轴偏差补偿符号反了检查标定矩阵是否要取逆对照转台或已知角度验证外参标定残差过大时间戳不对齐、标定板识别错误加--time-calibration重新做相机内参标定VINS初始化慢/尺度错误标定参数与算法预期单位不一致检查单位换算rad与degs与h标定结果对不同采集数据变化大数据里包含了太多动态过程静止段不够多位置采集中每段静止时间加长运动平缓5.2 温度漂移与长时间稳定性温度是IMU标定的“头号隐形杀手”。MEMS传感器的零偏随温度变化通常是几mg/°C到几十mg/°C陀螺仪更是能达到0.01-0.1°/s/°C。这也意味着在20°C环境下标出来的参数拿到40°C的车载环境里去用误差会明显增大。我踩过的坑是给一台户外巡检小车做标定冬天室内标定效果一流夏天开出去半小时后发现VINS轨迹持续东向偏移。排查到最后发现是IMU温度从20°C升到了50°C零偏漂移超出了算法在线估计的收敛范围。对策有几个尽可能在目标工作温度下标定。至少保证采集数据时传感器已经是热平衡状态。有条件的话做温度补尝。高端IMU自带温补表消费级IMU也可以自己做温度标定把IMU放进温箱记录不同温度下的零偏拟合一条温度曲线在算法里实时补偿这个效果很好。滤波算法的bias估计协方差不能设太小否则在线估计跟不上温度变化。5.3 智能小车场景的“IMU纠偏”调参心得最近不少人问我智能小车用MPU6050做航向纠偏为什么总是纠不回来这个问题要从两个层面看一是MPU6050这类消费级IMU本身噪声和温漂都大直接用原始yaw积分根本不够看二是PID纠偏的参数和IMU滤波没配合好。小车纠偏的实用套路通常是这样的先做一个零速静止校准上电前放在水平地面上开机后先采集前100帧算初始零偏在代码里把后续数据减去这个均值这一步就完成了最简单的一次性标定。然后配合互补滤波或者Mahony滤波这里加速度计的静态姿态负责校正俯仰和横滚yaw角只能靠陀螺仪积分积分漂移是不可避免的。要实现有效的yaw纠偏还需要一点额外的手段如果小车是差速驱动可以结合轮式里程计计算出来的角速度做一个简单的观测用卡尔曼滤波融合IMU的yaw和里程计的yaw可以大幅降低漂移。如果是麦克纳姆轮或阿克曼底盘在直线行驶时用运动模型约束住yaw变化也是一个很有效的纠偏方式。实在不行就用磁力计做绝对航向参考。但磁力计在电机附近会被严重干扰放远一点、做好椭球拟合校准才行。所以“imu纠偏怎么设置比较合理”这个问题的答案是先标定、再滤波、最后融合轮速/磁力计。单纯靠调PID把IMU yaw纠回来是治标不治本。5.4 Lidar/相机-IMU联合标定中常见的坑Lidar和IMU联合标定是很多SLAM项目里绕不开的环节比如LIO-SAM、FAST-LIO这类算法都要求有精确的外参初始值。常见的坑有以下几类时间同步问题。Lidar每帧点云的时间戳和IMU采样时间戳如果不是同一个时钟源外参标定结果会有偏差。尤其是用纯软件时间同步时网络延迟会造成几毫秒到几十毫秒的不确定性。如果发现外参反复横跳先检查时间同步是否可靠。初始值问题。点云配准类的外参标定都是非线性优化对初始值敏感。初始外参偏差太大会直接收敛到局部极小值。建议先用标定板或者手动粗对齐得到一个还不错的初始值再做精标定这一步很关键。参考对象问题。Lidar和IMU联合标定中如果环境中没有明显的平面特征点云配准精度会下降导致外参标定结果不稳定。采集时尽量在室内走廊、大厅这种有清晰平面结构的环境。还有一个很隐蔽的问题点云畸变。如果Lidar去畸变用的就是待标定的IMU外参就形成了一个循环依赖。解决办法是采集静态或慢速数据做标定或者用不含畸变的方式做点云提取比如只取每帧的某个固定时间段不要让点云畸变影响外参估计结果。5.5 最后再分享一个小技巧关于IMU标定我最后想分享一个非常实用的小技巧。很多时候标定工具跑完了但你不确定结果是否可信可以做一个简单的“旋转验证”把IMU绕X轴匀速转一整圈理想情况下角速度积分应该恰好是360°。如果标定后的积分结果是370°或350°说明本身的尺度或轴偏差补偿没有到家如果结果是361°或者359°这个误差级别说明标定已经在合理范围内了。这个方法虽然粗糙但在现场没有复杂设备的情况下特别实用能很快判断标定靠不靠谱。我自己的习惯是每次拿到新的IMU模组都会先建一套标准化的标定流程脚本自动完成2小时静止采集→Allan方差分析→多位置采集→imu_tk内参标定→Kalibr联合标定→旋转验证。全部流程跑下来大约一个下午。第一次做会觉得繁琐但之后就一劳永逸。而且做过一次完整标定后你会对你手里的传感器特性有非常清晰的认知后面排查SLAM问题会顺手非常多。这比每次都靠玄学调参靠谱得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑