0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >技术信息 > 在GPS不足以提供精准的位置数据时使用IMU

在GPS不足以提供精准的位置数据时使用IMU

来源: digkey
2018-11-29
类别:技术信息
eye 281
文章创建人 Steve Leibson

原标题:在GPS不足以提供精准的位置数据时使用IMU

  

  全球导航卫星系统 (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。例如,DFRobot 的 SEN0140 10 DOF MEMS IMU 传感器板是一种紧凑型 IMU 板,集成了一个 Analog Devices ADXL345 加速计、一个 Honeywell Microelectronics & Precision Sensors 磁力仪、一个 TDK Invensense 陀螺仪和一个 Bosch Sensortec 气压传感器。

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

  图 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 #include #include #include #include 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 代码的图片.png

  图 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/气压计图片.png

  图 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 的补充,则可实现更精准的定位和更快的更新率。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯