用于精确定位的 IMU:第 2 部分 – 如何使用 IMU 软件实现更高的精度

作者:Steve Leibson

投稿人:DigiKey 北美编辑

许多嵌入式系统需要跟踪其所在的地点或位置和航向,设计人员经常将 GNSS(全球导航卫星系统)作为首选(参见“使用 GNSS 模块快速设计位置跟踪系统”)。然而,GPS 不能总是专门用于确定位置和航向信息,原因有多方面,首先是功耗。

GPS 系统需要消耗大量电力。许多嵌入式系统,尤其是电池供电的系统,无法负担 100% 时间都维持 GPS 定位所需的功耗预算。此外,GPS 信号会受到阻挡,更新率较慢,且精度为 1 米 (m),这对某些应用而言可能不够。

使用惯性测量装置 (IMU) 对 GNSS 定位数据进行补充,则可以克服这些问题。

前一篇 IMU 文章讨论了如何使用基于 MEMS 技术的相对便宜的 IMU 来确定位置和航向,请参阅“在 GPS 不足以提供精准的位置数据时使用 IMU”。但是,仅凭 IMU 传感器数据还无法提供绝对位置。GNSS 接收器仅提供位置数据,但为了将 IMU 的相对运动数据转换为绝对位置和航向,则需要大量软件,其中会用到传感器滤波、融合和二重积分。

本文讨论 IMU 的嵌入式应用、各种 IMU 传感器所提供数据的误差来源,以及计算来自 IMU 传感器的精准定位和航向信息所需的软件。此外,本文还会讨论 STMicroelectronics MotionFX 库,以及如何使用该软件将 IMU 传感器数据转换为嵌入式系统中的定位和航向。

IMU 如何补充 GNSS 接收器

GNSS 存在四个问题:

  1. GNSS 信号具有很强的指向性,很容易被建筑物遮挡。因此,室内或城市混凝土峡谷深处的 GNSS 操作可能会有问题。
  2. GNSS 接收器有几十秒甚至更长时间的热启动和冷启动时间。如果 GNSS 接收器不是连续工作(例如为了省电),则每个新位置读数可能需要好几秒才能获得。
  3. GNSS 的位置更新率被限制为每秒一次。对于涉及快速运动的嵌入式应用,该更新率不够快。这样的应用有很多,从虚拟现实到材料处理和机器人技术。
  4. GNSS 精度为米级。该分辨率对于许多嵌入式应用而言太过粗糙。

IMU 提供了许多嵌入式应用所需的更精细的定位分辨率和更快的更新率。并且,和 GNSS 接收器提供绝对定位信息相反,IMU 提供距离已知起点的相对位置信息,因此这两种位置传感器可互为补充。IMU 的这些特点使其对于增强直接从 GNSS 接收器获得的定位信息非常有用,请参阅“使用 GNSS 模块快速设计位置跟踪系统”。

IMU 在航空航天工业中的应用已有数十年历史。然而,航空航天用精密 IMU 是基于昂贵的陀螺仪和其他大型传感器,难以应用于对成本更敏感的系统。

现代电子 IMU 已高度集成化,可包含多种类型的传感器——加速计、陀螺仪和磁力仪;其基于微机电系统 (MEMS) 技术,因此体积小、重量轻且相对坚固。这些新一代 IMU 可作为板安装元件提供,经证明非常适合嵌入式应用。

IMU 可提供多种自由度 (DOF),而且与 GNSS 接收器不同,IMU 不依赖无线电信号提供定位数据。IMU 耗电量也极低,来源众多,并具有广泛的分辨率和精度规格可供选择。

借助这些特性,IMU 可用于增强 GNSS 接收器模块提供的定位信息(参见“使用 GNSS 模块快速设计位置跟踪系统”),但还需要大量软件来过滤 IMU 传感器数据,融合 IMU 内部多种类型传感器提供的数据,并利用二重积分根据融合的传感器数据计算位置。

IMU 误差源

多个传感器结合以提高精度是航空航天工业长期以来的常见做法,其中加速计和陀螺仪广泛用于惯性导航系统。在此类系统中,陀螺仪通过角速度变化检测方向,但随着时间推移,陀螺仪往往会漂移,因为它仅检测变化而没有固定的参考系。将加速计数据添加到陀螺仪数据中,可以最大限度地减小陀螺仪偏置,从而得到更准确的位置估计。加速计检测相对于重力的方向变化,该数据可用于给陀螺仪定向。

加速计对于静态(与动态相反)计算更准确。当系统已处于运动状态时,利用陀螺仪检测方向要更好。加速计反应迅速,若只使用该数据,加速计抖动和噪声会产生累积误差。此外,由于重力之类的外力,加速计往往会使加速度失真,这也会作为噪声在系统中累积。

将陀螺仪的长期精度与加速计的短期精度相结合,依靠每种传感器的优势来抵消或至少减轻另一种传感器的弱势,可以获得更精确的方向读数。这两类传感器相互补充。

此时需要融合滤波来减少误差

IMU 软件使用滤波来最大限度地减小 IMU 数据的定位误差。有多种滤波方法可融合传感器数据,每种方法都有不同程度的复杂性。互补滤波是合并多个传感器所提供数据的简单方法。互补滤波是一种将高通陀螺仪滤波和低通加速计滤波相结合的线性函数。因此,加速计数据中的高频噪声会在短期内被滤除,并且被陀螺仪数据平滑。

虽然互补滤波在计算上很简单,但为了实现更好的精度,IMU 现在更喜欢使用卡尔曼滤波之类的更复杂技术。卡尔曼滤波是一种非常受欢迎的递归传感器融合算法,不需要大量处理能力就能构建更精确的定位系统。卡尔曼滤波有多种类型,包括标准卡尔曼滤波、扩展卡尔曼滤波 (EKF) 和无迹卡尔曼滤波 (UKF)。

卡尔曼滤波使用若干数学方程来预测值,并基于以下假设:被滤波的数据为高斯分布形式,对其应用线性方程进行滤波。然而,现实世界中的运动并不像卡尔曼滤波的假设那样中规中矩。实际运动遵循的方程常常涉及非线性的正弦和余弦函数,因此 EKF 采用泰勒级数和高斯分布的单点近似来线性化非线性函数。这些近似可能是重大的误差源。

UKF 使用确定性采样方法来解决此误差问题,生成一组精心选择的采样点来代表数据的预期高斯分布,而不是 EKF 所用的单点近似。这些采样点完全捕获了预期高斯值的真实均值和协方差,从而实现更精确的滤波。

磁力仪误差源

典型 IMU 包含三种不同的传感器:用于测量角速度/速度的陀螺仪、用于测量线性加速度的加速计以及用于测量磁场强度的磁力仪。更具体地说,IMU 的磁力仪测量地球的磁场强度,以确定相对于地磁北极的航向。设计用于导航应用的 IMU 的每类传感器通常有三个,以对应三个正交运动轴。

然而,磁力仪易受硬铁和软铁失真的影响。外部磁场影响导致的地球磁场失真一般分为硬铁效应和软铁效应两种。如果不存在失真效应,将磁力仪旋转 360° 并将结果数据绘制成图,得到的将是一个以 (0, 0) 为中心的圆(图 1)。

将磁力仪旋转 360° 并将结果数据绘制成图的图形

图 1:如果附近的铁质材料未引起局部磁场失真,则将磁力仪旋转 360° 并将结果数据绘制成图,得到的将是一个以位置 (0, 0) 为中心的圆。(图片来源:sensorsmag.com)

硬铁和/或软铁效应的存在可能会影响该圆。硬铁效应导致其从位置 (0, 0) 发生简单偏移(图 2)。

硬铁失真效应使磁力数据发生偏移的图片

图 2:硬铁失真效应导致磁力数据从位置 (0, 0) 发生偏移。(图片来源:sensorsmag.com)

软铁效应使圆变形,产生一个椭圆(图 3)。

软铁失真效应扭曲 360° 磁力数据图片

图 3:软铁失真效应会扭曲 360° 磁力数据,将其从圆形变为椭圆形。(图片来源:sensorsmag.com)

请注意,硬铁效应和软铁效应可能同时出现。

补偿软铁失真所需的计算量比补偿硬铁失真的计算量要大得多,因此,从 IMU 的磁力仪附近移走软铁材料可能是更有效、更经济的办法。但在很多情况下,这不是一种选择,而需要进行补偿计算。

积分,然后再次积分

最后,加速计和陀螺仪仅提供关于物体上的加速力(线性和旋转)的信息,因此必须将该数据积分两次才能确定位置,因为加速度是物体速度的变化率,而速度是物体位置的变化率。换言之,IMU 陀螺仪和加速计数据提供的是物体绝对位置的二阶导数。

二重积分本身就需要相当多的处理,但对于三维定位,还必须消除重力的加速度影响。对于加速计,重力表现为恒定加速度,导致其数据发生偏移。通常,重力的加速度影响必须在 IMU 和包含 IMU 的物体处于静止状态时,通过校准从系统中消除。

请注意,由于采样误差,这种二重积分会引起误差。采样率越慢,误差越大。

IMU 软件的设计考虑因素

为实际的 IMU 软件实现这些算法时,请考虑以下措施和建议:

  • IMU 传感器信号有噪声,需要进行数字滤波。通常,IMU 应用中会使用某种卡尔曼滤波。
  • 即使进行滤波,仍不免存在其他误差源,例如耦合到 IMU 的机械噪声,以及上面讨论的硬铁和软铁失真。必须滤除这种噪声,或以其他方式从数据中消除此噪声。
  • 应用开始时,需要在 IMU 处于静止状态时执行校准例程,原因是为了尽可能准确,软件需要知道当物体不运动时传感器读数是多少。运动中物体的实际加速度值等于加速度传感器的当前采样值减去校准值。
  • 校准后,传感器值可以是正数,也可以是负数。因此,保存这些值的变量必须有正负之分。
  • 对传感器数据的采样频率越高,产生的结果越准确,但更多样本将需要更多存储器和更严格的定时要求,还可能涉及到其他硬件考虑因素。
  • 采样周期必须始终完全相同。采样周期不相等会引起数据误差。
  • 样本之间的线性数据拟合(插值)可产生更准确的结果,但也需要更多的处理时间。

从上面的讨论中可以明显看出,根据 IMU 数据确定航向、位置和运动所需的计算并不简单。因此,IMU 供应商常常为其产品提供软件应用包来执行这些计算。例如,STMicroelectronics 开发了 MotionFX 库,此库扩展了该公司的可下载 X-CUBE-MEMS1 软件的功能,以包含 IMU 功能。

该库中的软件从加速计、陀螺仪和磁力仪获取数据,并为 STMicroelectronics 的 MEMS 传感器(包括 IMU)提供实时运动传感器数据融合。无论环境条件如何,MotionFX 滤波和预测软件都使用高级算法智能集成来自多个 MEMS 传感器的输出。该库仅针对 STMicroelectronics 的 MEMS IMU 设计,若使用其他供应商的 IMU,无法保证该软件的功能和性能。

MotionFX 库运行在 STMicroelectronics 各种基于 Arm® Cortex®-M0+、Cortex-M3 和 Cortex-M4 处理器内核的微控制器上。当安装在以下开发板上时,有针对 STMicroelectronics X-NUCLEO-IKS01A2 扩展板(图 4)的实例实现供参考:

STMicroelectronics 的 MotionFX 库管理并融合了来自 IMU 的加速计、陀螺仪和磁力仪的数据。该库提供以下例程:

  • 实时、9 轴、运动传感器数据融合(加速计、陀螺仪、磁力仪)
  • 实时、6 轴、运动传感器数据融合(加速计、陀螺仪)
  • 旋转、四元数、重力和线性加速度数据的计算
  • 陀螺仪偏置校准
  • 磁力仪硬铁校准

使用 MotionFX 软件时,STMicroelectronics 建议采用 100 Hz 传感器数据采样频率。

STMicroelectronics 的 X-NUCLEO-IKS01A2 扩展板图片

图 4:STMicroelectronics 针对 IMU 的 MotionFX 软件支持其 X-NUCLEO-IKS01A2 扩展板。(图片来源:STMicroelectronics)

MotionFX 库实现了一种传感器融合算法来估计空间中的三维方向。它过滤并融合来自多个传感器的数据,以弥补 IMU 各个传感器的局限性。

清单 1 提供的演示代码显示了启动和运行 STMicroelectronics IMU 所需的操作。

副本
[…]#define VERSION_STR_LENG 35
#define MFX_DELTATIME 10
[…]/*** Initialization ***/
char lib_version[VERSION_STR_LENG];
char acc_orientation[3];
MFX_knobs_t iKnobs;
/* Sensor Fusion API initialization function */
MotionFX_initialize();
/* Optional: Get version */
MotionFX_GetLibVersion(lib_version);
MotionFX_getKnobs(&iKnobs);
/* Modify knobs settings */
MotionFX_setKnobs(&iKnobs);
/* Enable 9-axis sensor fusion */
MotionFX_enable_9X(MFX_ENGINE_ENABLE);
[…]/*** Using Sensor Fusion algorithm ***/
Timer_OR_DataRate_Interrupt_Handler()
{
MFX_input_t data_in;
MFX_output_t data_out;
/* Get acceleration X/Y/Z in g */
MEMS_Read_AccValue(data_in.acc[0], data_in.acc[1], data_in.acc[2]);
/* Get angular rate X/Y/Z in dps */
MEMS_Read_GyroValue(data_in.gyro[0], data_in.gyro[1], data_in.gyro[2]);
/* Get magnetic field X/Y/Z in uT/50 */
MEMS_Read_MagValue(data_in.mag[0], data_in.mag[1], &data_in.mag[2]);
/* Run Sensor Fusion algorithm */
MotionFX_propagate(&data_out, &data_in, MFX_DELTATIME);
MotionFX_update(&data_out, &data_in, MFX_DELTATIME, NULL);
}

清单 1:演示代码显示了如何使用 MotionFX 库来从该公司的 X-NUCLEO-IKS01A2 扩展板上的 IMU 元件提取信息。(代码来源:STMicroelectronics)

该演示软件的流程图如下所示(图 5)。

展示 MotionFX 演示代码所用步骤顺序的流程图图片

图 5:此流程图说明了清单 1 中的 MotionFX 演示代码所使用的步骤顺序,以便从 STMicroelectronics 的 X-NUCLEO-IKS01A2 扩展板提取数据,并将数据融合成三维空间方向。(图片来源:STMicroelectronics)

请注意,陀螺仪数据可能会漂移,导致三维空间方向估计的精度降低。MotionFX 软件可以使用磁力仪数据(提供绝对方向信息)来补偿这种降级情况。同时,磁力仪不能以高速率产生航向数据,而且磁力仪会遭受磁干扰,但陀螺仪数据可以弥补磁力仪的这些弱点。

MotionFX 软件的 9 轴传感器融合计算使用来自加速计、陀螺仪和磁力仪的数据,提供三维空间中的绝对方向,包括航向(相对于地磁北极)。

MotionFX 软件的 6 轴传感器融合计算仅使用加速计和陀螺仪的数据。此操作级别对计算的要求较低,并且不提供关于绝对方向的信息,但该例程比 9 轴例程运行得更快。6 轴传感器融合适合测量快速运动,例如游戏或固定机器人,另外也可用在不需要绝对方向的场合。

总结

IMU 在嵌入式应用中非常有用,可以自行提供位置和航向信息。IMU 也可用于增强 GNSS 接收器信息,以提高定位精度或更新率。然而,将 IMU 集成到嵌入式系统中需要大量软件,IMU 供应商常常会提供相关软件,以帮助实现这些器件的实际应用。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Steve Leibson

Steve Leibson 是 HP 和 Cadnetix 的系统工程师、《EDN》和《Microprocessor Report》杂志主编以及 Xilinx 和 Cadence 的技术博主,并担任过两集“The Next Wave with Leonard Nimoy”的技术专家。33 年来,他一直致力于帮助设计工程师们开发出更好、更快、更可靠的系统。

关于此出版商

DigiKey 北美编辑