IMU提供精准的位置数据

作者:Steve Leibson

投稿人:DigiKey 北美编辑

全球导航卫星系统 (GNSS) 非常有用,能够定位全球任意位置已正确启用此功能的系统,但仅仅使用 GNSS 接收器进行定位也存在一些问题。使用惯性测量装置 (IMU) 对 GNSS 进行补充,则可以克服这些问题。

IMU 采用陀螺仪、加速计和磁力仪,基于初始起点测量位置。本文将讨论它的嵌入式应用,然后再介绍一些适当的解决方案示例以及使用方法。

IMU 如何补充 GNSS

GNSS 存在四个问题。首先,GNSS 信号具有很强的指向性,因此会被建筑物遮挡。其次,接收器有几十秒到一分钟甚至更长时间的热启动和冷启动时间。接收器需要利用启动时间采集并锁定定位所需的多个卫星信号。

第三,GNSS 的位置更新率被限制为每秒一次。这对追踪缓慢移动的大型物体而言没有问题,但对许多嵌入式应用而言,启动时间太长而且更新率太慢。第四,GNSS 精确到米,对于大多数嵌入式应用而言不够精确。这类应用种类繁多,例如不涉及地面交通的机器人和虚拟现实等。

IMU 提供了许多嵌入式应用所需的更精细的定位分辨率和更快的更新率。并且,和 GNSS 接收器提供绝对定位信息相反,IMU 提供距离已知起点的相对位置信息,因此这两种位置传感器可互为补充。

现代电子 IMU 以板安装电子元件的方式提供,以微机电系统 (MEMS) 技术为基础,因此体积小、重量轻且相对坚固。它们具有可变的自由度 (DOF) 能力,而且与 GNSS 接收器不同,IMU 不依赖无线电信号。IMU 的耗电量极低,可通过各种供应源获取具有广泛分辨率和精度的产品。

借助这些特性,IMU 可用于增强 GNSS 接收器的定位信息。(请参阅“使用 GNSS 模块快速设计位置跟踪系统”。)

IMU 剖析

运动传感器对物理运动做出响应并进行检测,包括加速度、移动速率或距离等参数。惯性传感器是一种特殊的运动传感器。IMU 将各种运动传感器集成到一个器件中,可提供高精度定位信息。它们对传感器自身的运动做出响应。

IMU 整合了以下一种或多种运动传感器类型:

  • 陀螺仪传感器测量角度位置变化,通常以每秒度数表示。随时间进行角速率积分可测得行程角度,用于追踪方向变化。陀螺仪传感器提供一个、两个或三个轴,分别对应俯仰角、翻滚角和偏航角。陀螺仪追踪与重力无关的相对运动,因此传感器偏置或积分误差会造成称为“漂移”的位置误差。
  • 加速计传感器测量线性加速度,包括设备运动造成的加速度分量和重力造成的加速度。加速度以 G 为单位,是地球重力(1 G = 9.8 米/秒2)的倍数。加速计提供一个、两个或三个轴,分别定义 X、Y、Z 坐标系。通过计算测得的器件角度并进行重力补偿,可使用加速计数据来测量静态设备方向。复杂运动周期会令方向计算变得复杂。
  • 磁传感器测量磁场强度,通常以微特斯拉 (µT) 或高斯(100 µT = 1 高斯)为单位。移动电子设备中最常用的磁传感器是三轴霍尔效应磁力仪。根据地理位置,地球磁场幅度介于 25 到 65 µT 之间,且倾斜角度各不同。就美国大陆而言,强度介于 45 到 55 µT 之间,角度为 50 - 80 度。通过计算检测到的地球磁场角度,并将此测量的角度与加速计测量的重力进行比较,即可非常精确地测量出设备相对于地磁北极的航向。要获得正北航向,还需要根据当前经纬度进行调节。
  • 压力传感器测量差压或绝对压力,单位通常为百帕 (hPa) 或毫巴 (mbar),二者等效。海平面标准气压定义为 1013.25 hPa。海拔高度变化会导致检测到的环境气压发生相应变化,可用于追踪垂直运动。

使用 IMU 的运动追踪采用传感器融合,根据已知的起点和方向,推导单一、高精度的相对设备方向和位置估计值。传感器融合涉及使用 IMU 制造商或应用开发人员开发的复杂数学算法来组合 IMU 的各种运动传感器输出。使用传感器融合进行位置计算可得到以下测量结果:

  • 重力 – 具体而言地球重力,且不含设备感应到的由运动造成的加速度。当 IMU 静止时,加速计测量重力矢量。当 IMU 运动时,重力测量需要融合加速计和陀螺仪的数据,并减去运动造成的加速度。需要相对于地球来检测方向的应用可使用重力测量。
  • 线性加速度 – 等于加速计测得的设备加速度,但要减去重力矢量。IMU 线性加速度可用于测量三维空间中的运动。该值的精度取决于重力矢量的追踪精度。
  • 方向(海拔高度)– 欧拉角集合,包括偏航角、俯仰角、翻滚角,测量单位为度。
  • 旋转矢量 – 由加速计、陀螺仪和磁力仪传感器的数据组合得出。旋转矢量表示围绕特定轴的旋转角度。

IMU 可用于各种应用,包括消费品(手机)、医学(成像)、工业(机器人)和军工(航向跟踪)。所需 IMU 精度取决于应用要求。

六种自由度

自由度 (DOF) 指刚性物体在三维空间中的可能运动。3D 空间中只有六种 DOF:三个线性转换 DOF(前/后、上/下、左/右)和三个旋转 DOF(偏航、仰俯和翻滚)。无论运动有多复杂,空间内任何可能的刚性物体运动都能以六种基本 DOF 的组合来表示。

但在 IMU 领域内,有很多 9 DOF 甚至 10 DOF 传感器的叫法。考虑到总共只有六种用于描述运动的 DOF,这种命名规则会造成相当的困扰。9 DOF 这一数字命名源于累计 IMU 内所含各种传感器的 DOF。因此,如果 IMU 包含一个 3 DOF 加速计、一个 3 DOF 陀螺仪和一个 3 DOF 磁力仪,则称之为 9 DOF IMU。再增加一个气压传感器用于测量海拔高度,就会得到一个 10 DOF IMU。

市场上有各种价格和功能的 IMU。例如,DFRobotSEN0140 10 DOF MEMS IMU 传感器板是一种紧凑型 IMU 板,集成了一个 Analog Devices ADXL345 加速计、一个 Honeywell Microelectronics & Precision Sensors 磁力仪、一个 TDK Invensense 陀螺仪和一个 Bosch Sensortec 气压传感器。

DFRobot 的 SEN0140 10 DOF MEMS IMU 传感器板图片

图 1:DFRobot 的 SEN0140 10 DOF MEMS IMU 传感器板集成了加速计、磁力仪、陀螺仪和气压传感器。(图片来源:DFRobot)

主流 SEN0140 传感器的测量规格如下:

  • ADXL345 加速计:±16 g,13 位分辨率(在所有 g 量程内保持 4 mg/LSB 的比例系数)
  • Honeywell Microelectronics & Precision Sensors 磁力仪:±8 高斯满量程磁场
  • TDK Invensense 陀螺仪:满量程 ±2000°/秒
  • Bosch Sensortec 气压传感器:4.35 PSI 至 15.95 PSI(30 kPa 至 110 kPa)

所有这四个传感器都连接到板上的单一 SPI 串口,这意味着嵌入式处理器必须单独对每个处理器进行寻址和查询。DFRobot 的 SEN0140 还采用低噪声 LDO,为传感器提供 3 至 8 伏稳压电源。

使用现有 Arduino 库,DFRobot 的 10 DOF IMU 能直接兼容 Arduino 开发板。该器件还可用于具有 SPI 端口的任何微处理器或微控制器系统。

以下是从 DFRobot 的 SEN0140 10 DOF 开发板提取传感器数据的 Arduino 代码示例(列表 1):

复制 #include <Wire.h> #include <FreeSixIMU.h> #include <FIMU_ADXL345.h> #include <FIMU_ITG3200.h> #include <HMC5883L.h>   float angles[3]; // yaw pitch roll float heading;   short temperature;   long pressure;   // Set the FreeSixIMU object FreeSixIMU sixDOF = FreeSixIMU(); HMC5883L compass;   // Record any errors that may occur in the compass.int error = 0;   void setup(){   Serial.begin(9600);   Wire.begin();   delay(5);   sixDOF.init(); //init the Acc and Gyro   delay(5);   compass = HMC5883L(); // init HMC5883   error = compass.SetScale(1.3); // Set the scale of the compass.error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous     if(error != 0) // If there is an error, print it out.Serial.println(compass.GetErrorText(error));   bmp085Calibration(); // init barometric pressure sensor }   void loop(){   sixDOF.getEuler(angles);   temperature = bmp085GetTemperature(bmp085ReadUT());   pressure = bmp085GetPressure(bmp085ReadUP());   getHeading();   PrintData();   delay(300); }   void getHeading(){     // Retrive the raw values from the compass (not scaled).MagnetometerRaw raw = compass.ReadRawAxis();     // Retrived the scaled values from the compass (scaled to the configured scale).MagnetometerScaled scaled = compass.ReadScaledAxis();     // Values are accessed like so:   int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)     // Calculate heading when the magnetometer is level, then correct for signs of axis.heading = atan2(scaled.YAxis, scaled.XAxis);     float declinationAngle = 0.0457;   heading += declinationAngle;     // Correct for when signs are reversed.if(heading < 0)     heading += 2*PI;     // Check for wrap due to addition of declination.if(heading > 2*PI)     heading -= 2*PI;     // Convert radians to degrees for readability.heading = heading * 180/M_PI;  }   void PrintData(){   Serial.print("Eular Angle: ");   Serial.print(angles[0]);   Serial.print("  ");     Serial.print(angles[1]);   Serial.print("  ");   Serial.print(angles[2]);   Serial.print("  ");   Serial.print("Heading: ");   Serial.print(heading);   Serial.print("  ");   Serial.print("Pressure: ");   Serial.print(pressure, DEC);   Serial.println(" Pa"); } 

列表 1:这是从 DFRobot 的 SEN0140 10DOF 开发板提取传感器数据的 Arduino 代码示例。(代码来源:DFRobot)

此 Arduino 代码可生成图 2 所示输出。

Arduino 代码的图片

图 2:上述 Arduino 代码生成此输出,显示 SEN0140 传感器的状态。(图片来源:DFRobot)

Digilent 410-326 9 轴 IMU/气压计基于 STMicroelectronics LSM9DS1 iNEMU IMU,该 IMU 整合如下规格的 3D 加速计、3D 陀螺仪和 3D 磁力仪:

  • ±2/±4/±8/±16 g 满量程线性加速度(3D 加速计)
  • ±245/±500/±2000°/秒满量程角速率(3D 陀螺仪)
  • ±4/±8/±12/±16 高斯满量程磁场(3D 磁力仪)

所有三种运动传感器—加速计、陀螺仪和磁力仪—都集成到一个小型封装中,并通过 LSM9DS1 的 I2C 接口进行连接。

Digilent 的 410-326 9 轴 IMU/气压计图片

图 3:Digilent 的 410-326 9 轴 IMU/气压计使用 STMicroelectronics 的 LSM9DS1 iNEMU IMU,该 IMU 在一个封装中整合了 3D 加速计、3D 陀螺仪和 3D 磁力仪。(图片来源:Digilent)

Thales Visionix NavChip 精密 6 轴 MEMS IMU 源自军工技术,可以 1 kHz 的速率进行位置数据采集和处理。然后,以用户可选择的低至 200 Hz(或更低)的速率处理并集成数据。它还使用工厂校准和嵌入式温度传感器进行补偿,以纠正其他传感器的偏置、比例系数和错位。其加速计和磁力仪的规格如下:

  • 加速计:满量程角速率 2000°/s
  • 磁力仪:满量程加速度 ±16g

NavChip 模块带有 TTL UART 和 SPI 端口,并具有 1 个脉冲/秒的输入,用于同步 GPS 模块。提供 V14447-03-02 RS-422 评估套件,让原型设计更加轻松。模块有内置测试 (BIT) 模式,可按指令测试,并提供连续诊断监测。该装置已进行工厂校准,并在 -40°C 至 +85°C 的工作温度范围内提供温度补偿。

Thales 利用工厂校准和温度补偿,在 NavChip 模块的规格书中增加了一系列稳定性规格,这在其他大多数商用 IMU 规格书中是没有的:

  • 陀螺仪偏置运行稳定性:5°/小时
  • 角向随机游走:0.18°/√小时
  • 速度随机游走:0.03 米/秒/√小时

软件角度

有了本文所列的所有 IMU,编写如以上 Arduino 代码列表所示的提取原始传感器数据的软件并不困难。但是,将这些传感器读数集成为可用的导航数据才是更复杂的任务。一些开源程序包专门设计为将 IMU 数据整合到应用中。

ArduPilot Mega (APM) 便是这样一款专为自主式无人机而开发的程序。它支持驾驶和无人驾驶(完全自主)飞行,包括数百个 GPS 航点、摄像机控制、自主起飞和着陆。由于是开源程序,IMU 代码可开放检查,并能改用于其他类型的应用。

来自 Open Source Robotics Foundation 的机器人操作系统 (ROS) 提供了编写机器人软件的灵活框架。它集合了众多工具、库和惯例,旨在简化跨众多机器人平台创建复杂而强大的机器人行为的任务。ROS 包含多个 IMU 的接口代码,以便为其导航模块提供信息。

总结

许多嵌入式应用需要能够在全球任意位置实现系统定位。仅 GNSS 接收器是不够的,但有了 IMU 的补充,则可实现更精准的定位和更快的更新率。

 

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

关于此作者

Steve Leibson

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

关于此出版商

DigiKey 北美编辑