×

使用MPU9250获取实时位置

消耗积分:2 | 格式:zip | 大小:0.03 MB | 2023-02-01

分享资料个

描述

主条目:使用MPU9250获取实时位置

MPU-9250 是目前最先进的加速度计、陀螺仪和罗盘组合小尺寸传感器之一。它取代了流行的 MPU-9150,降低了功耗,改善了陀螺仪噪声和罗盘满量程范围性能。它具有许多高级功能,包括低通滤波、运动检测甚至可编程专用处理器。

它内部包括 MPU-6500,其中包含一个 3 轴陀螺仪和一个 3 轴加速度计,以及AK8963 ,市场领先的 3 轴数字罗盘。MPU-9250 使用 16 位模数转换器 (ADC) 对所有 9 个轴进行数字化。

MPU-9250 是一款高性能加速度计、陀螺仪和磁力计选项,适用于手势识别、自平衡机器人、手机、健身监测等应用,以及需要检测运动方向和幅度以及旋转的类似应用。阅读带有 Arduino 的 MPU9250 传感器一文中,我们介绍了该模块以及如何与其交互。以及,使用互补滤波器来获得相对位置。现在让我们看看 MPU9250 模块的全部功能:混合使用陀螺仪、加速度计和磁力计来获得实时准确位置。

陀螺仪

陀螺仪是一种用于测量或保持方位和角速度的装置。角速度以每秒度数(或弧度)为单位测量,是单位时间内物体旋转角度的变化。

加速度计

加速度计传感器是测量加速度的集成电路 (IC),加速度是单位时间内速度的变化。测量加速度可以获取物体倾斜和振动等信息。

通常,g用作加速度的单位,相对于标准重力 (1g = 9.80665m/s2)。

磁力计

磁力计提供有关设备传感器检测到的磁场的信息,理论上可以暴露用户的位置。磁力计传感器以 μT(微特斯拉)为单位测量所有三个物理轴(x、y、z)的磁场。

接线图

按照下图连接图连接电源管脚和SDA、SCL管脚。

pYYBAGNOS7aAGaVsAADaa8uh5VY306.png
Arduino Nano 接线与 MPU9250
 

注意:该模块的工作电压为 3.3 伏,尽管某些版本具有允许将其连接到 5V 的稳压器。请务必在使用前检查您的模块规格。

相对和绝对方向

相对方向是一个对象相对于另一个对象的位置和方向的恢复。根据方向,存在三种类型的角速率测量:

  • 偏航:从上方看物体时在平面上的水平旋转。
  • 俯仰:从前面看到的物体的垂直旋转。
  • 滚动:从前面看物体时的水平旋转。

使用平面的每个轴的图形表示:

poYBAGPXac2AI4skAAAaTaUqXBQ362.png
 

绝对方向是磁力计的常见用例之一,表示相对于地球平面的固定方向(固定到磁场矢量和重力矢量)。

噪音和错误

在理想情况下,具有应用公式的传感器数据将为我们提供精确和精确的角度。实际情况有所不同,因为某些因素会影响传感器输出。

通常,当您使用加速度计四处移动时,它会经历运动加速度。额外的加速度值可能会影响定向精度。另一个与加速度计相关的问题是噪声:电信号中不需要的干扰。加速度计能够测量任何角度,但是它的读数有噪声并且即使使用低通滤波器也有一定的误差范围。

另一方面,陀螺仪存在偏置不稳定性,其中陀螺仪的初始零读数会由于设备内固有缺陷和噪声的集成而导致随时间漂移。

在需要通过传感器融合进行绝对定位的应用中,磁力计对于校正陀螺仪漂移是绝对必要的。磁力计问题是它们的非理想响应面和位置依赖性。

获取实时位置

有不同的算法来解决错误和噪声问题。我们将使用四元数。四元数用于纯数学,但在应用数学中也有实际用途,特别是涉及三维旋转的计算。它们可以与其他旋转方法一起使用,例如欧拉角和旋转矩阵,或者作为它们的替代方法,具体取决于应用程序。MPU9250 库的使用使我们摆脱了对四元数所有复杂性的理解,并且实现已经完成。

磁偏角

应根据您要获得准确数据的位置来设置磁偏角。您可以在此处找到您所在城市的磁偏角。

poYBAGPXadCAKmrjAAAPdOX5axw176.png
 

请注意,此处的偏角目前为 1˚ 38'。提供的格式需要转换为代码的十进制度数。每度有60分钟,其中38分钟为度的38/60,即0.63。1˚ 38' 的十进制格式的赤纬为 1.63。使用您所在位置的偏角更新代码MAGNETIC_DECLINATION常量。

磁性校准

有一种简单的方法可以自动校准并纠正磁力计数据的一些错误。以八字形模式缓慢移动传感器,并跟踪在六个主要方向中的每一个方向上测量的最小和最大场。可以从后续数据中减去平均值,这相当于将响应曲面重新置于原点的中心。该库具有自动为我们执行的校准功能,我们只需要在校准开始时将传感器移动成 8 字形即可。

为 MPU9250 安装 Arduino 库

要与 MPU9250 模块交互,我们可以使用原始实现或利用现有库。该库提供了一个与模块通信的接口,为我们节省了大量时间。另一个优势是多年来由社区测试和改进的健壮代码库。我们建议使用该库并避免从头开始实施所有内容。它可以从我们的官方存储库下载。

要导入库,请打开 Arduino IDE,转到 Sketch > Include Library > Add.ZIP Library 并选择从我们的 GitHub 存储库下载的库文件。

poYBAGNOS6-AXK2tAABgOEnpXcY744.png
将外部库包含到 Arduino IDE
 

然后你可以简单地使用include语句:

#include "MPU9250.h"

它将包括具有预定义函数的库,以与 MPU9250 交互。

Arduino代码

下面的代码很简单,因为我们使用了一个库,该库提供了与 MPU9250 模块交互的清晰接口。在设置函数中,我们配置和校准模块并在循环中每隔INTERVAL_MS_PRINT毫秒打印一次输出。

#include "MPU9250.h"

#define MPU9250_IMU_ADDRESS 0x68

#define MAGNETIC_DECLINATION 1.63 // To be defined by user
#define INTERVAL_MS_PRINT 1000

MPU9250 mpu;

unsigned long lastPrintMillis = 0;

void setup()
{
  Serial.begin(115200);
  Wire.begin();

  Serial.println("Starting...");

  MPU9250Setting setting;

  // Sample rate must be at least 2x DLPF rate
  setting.accel_fs_sel = ACCEL_FS_SEL::A16G;
  setting.gyro_fs_sel = GYRO_FS_SEL::G1000DPS;
  setting.mag_output_bits = MAG_OUTPUT_BITS::M16BITS;
  setting.fifo_sample_rate = FIFO_SAMPLE_RATE::SMPL_250HZ;
  setting.gyro_fchoice = 0x03;
  setting.gyro_dlpf_cfg = GYRO_DLPF_CFG::DLPF_20HZ;
  setting.accel_fchoice = 0x01;
  setting.accel_dlpf_cfg = ACCEL_DLPF_CFG::DLPF_45HZ;

  mpu.setup(MPU9250_IMU_ADDRESS, setting);

  mpu.setMagneticDeclination(MAGNETIC_DECLINATION);
  mpu.selectFilter(QuatFilterSel::MADGWICK);
  mpu.setFilterIterations(15);

  Serial.println("Calibration will start in 5sec.");
  Serial.println("Please leave the device still on the flat plane.");
  delay(5000);

  Serial.println("Calibrating...");
  mpu.calibrateAccelGyro();

  Serial.println("Magnetometer calibration will start in 5sec.");
  Serial.println("Please Wave device in a figure eight until done.");
  delay(5000);

  Serial.println("Calibrating...");
  mpu.calibrateMag();

  Serial.println("Ready!");
}

void loop()
{
  unsigned long currentMillis = millis();

  if (mpu.update() && currentMillis - lastPrintMillis > INTERVAL_MS_PRINT) {
    Serial.print("TEMP:\t");
    Serial.print(mpu.getTemperature(), 2);
    Serial.print("\xC2\xB0"); //Print degree symbol
    Serial.print("C");
    Serial.println();

    Serial.print("Pitch:\t");
    Serial.print(mpu.getPitch());
    Serial.print("\xC2\xB0"); //Print degree symbol
    Serial.println();

    Serial.print("Roll:\t");
    Serial.print(mpu.getRoll());
    Serial.print("\xC2\xB0"); //Print degree symbol
    Serial.println();

    Serial.print("Yaw:\t");
    Serial.print(mpu.getYaw());
    Serial.print("\xC2\xB0"); //Print degree symbol
    Serial.println();

    Serial.println();

    lastPrintMillis = currentMillis;
  }
}

测试

串行监视器将每INTERVAL_MS_PRINT毫秒打印一次最后可用的传感器数据(在上面的示例中,每秒一次),它应该类似于:

pYYBAGPXadSAeInyAAAavl-bBHg264.png
测试输出
 

通常方向绘制在物理模块上,因此您可以轻松检测俯仰和滚动。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !