主要内容

基于惯性传感器融合和MPU-9250的方位估计

本示例演示了如何从InvenSense MPU-9250 IMU传感器获取数据,并使用传感器数据中的6轴和9轴融合算法来计算设备的方向。

MPU-9250是一个9轴传感器与加速度计,陀螺仪,和磁力计。加速度计测量加速度,陀螺仪测量角速度,磁力计测量x、y、z轴上的磁场。传感器的轴线取决于传感器的制造。

必需的MathWorks®产品下载188bet金宝搏

  • MATLAB®

  • MATLAB支金宝app持包Arduino®硬件

  • 导航工具箱™或传感器融合和跟踪工具箱™

所需的硬件

  • Arduino Uno

  • InvenSense微处理器- 9250

硬件连接

将MPU-9250传感器的SDA、SCL、GND和VCC引脚连接到Arduino®Hardware上的相应引脚。本例使用Arduino Uno板,连接如下:

  • Sda - a4

  • SCL - a5

  • VCC - + 3.3v

  • GND - GND

确保传感器连接完好。建议使用原型屏蔽,并将传感器焊接在其上,以避免移动传感器时连接松动。参考的传感器故障诊断(Arduino金宝app硬件的MATLAB支持包)传感器页面用于调试传感器相关问题。

创建传感器对象

创建一个arduino对象并包含I2C库。

A = arduino(“COM9”“Uno”“库”“I2C”);
正在更新Uno (COM9)上的服务器代码。这可能需要几分钟。

创建MPU-9250传感器对象。

Fs = 100;%采样率(Hz)Imu = mpu9250“SampleRate”fs,“OutputFormat”“矩阵”);

补偿磁强计畸变

融合算法使用磁力计读数,需要对磁畸变进行补偿。一般来说,存在两种效应:硬铁变形和软铁变形。要了解有关这种扭曲的更多信息,请参阅更多关于(导航工具箱)。这些失真可以通过以下步骤确定的校正值进行校正:

  1. 沿着每个轴从0到360度旋转传感器。

  2. 使用magcal(导航工具箱)函数,得到修正系数,如下所示。

Ts = tic;stopTimer = 50;magReadings = [];(toc(ts) < stopTimer)沿着x轴从0到360度旋转传感器。转2-3圈,提高精度。对于其他轴,沿着这些轴旋转。[accel,gyro,mag] = read(imu)magreads = [magreads; magg];结束[A, b] = magic (magreads);% A = 3x3矩阵用于软铁校正% b = 3x1向量,用于硬铁校正

将MPU-9250传感器的轴线与NED坐标对齐

本例中使用的传感器融合算法使用东北向下(NED)作为固定的父坐标系统。在NED参考系中,x轴指向北,y轴指向东,z轴指向下。根据算法的不同,北方可以是磁北也可以是真北。本例中的算法使用磁北极。这里使用的算法期望物体中的所有传感器的轴对齐,并符合NED惯例。

MPU-9250在同一电路板上有两个设备,磁力计和加速度计-陀螺仪。这些装置的轴线彼此不同。磁力计轴与NED坐标对齐。加速度陀螺仪的轴与MPU-9250中的磁力计不同。加速度计和陀螺仪轴需要互换和/或倒置,以匹配磁力计轴。有关更多信息,请参阅中的“轴的方向”一节微控制器- 9250数据表

要将MPU-9250加速度计-陀螺仪轴对准NED坐标,请执行以下操作:

1.定义设备轴:根据NED坐标系定义虚轴作为传感器上的设备轴,虚轴可以与传感器轴相同,也可以不相同。对于MPU-9250,磁强计轴可以看作是器件轴。

2.交换加速度计和陀螺仪读数的x和y值,使加速度计和陀螺仪轴与磁力计轴对齐。

3.确定加速度计和陀螺仪的极性值。

一个加速度计。

  • 放置传感器,使设备X轴向下指向,垂直于传感器所在的表面。加速度计读数应该接近[9.8 0 0]。如果不等于加速度计的x值。

  • 放置传感器,使设备Y轴向下,垂直于传感器所在的表面。加速度计读数应该接近[0 9.8 0]。如果不等于加速度计的y值。

  • 放置传感器,使设备Z轴向下,垂直于传感器所在的表面。加速度计读数应该接近[0 0 9.8]。如果不是负加速度计的z值。

b。陀螺仪

沿着每个轴旋转传感器并捕获读数。使用右手螺尺校正旋转极性。

上述方法在本例中用于设置传感器的轴线。

调谐滤波器参数

本例中使用的算法,经过适当调整后,能够估计方向,并且对环境噪声源具有鲁棒性。您必须考虑使用传感器的情况,并相应地调整过滤器。看到自定义调整融合过滤器有关调优过滤器参数的更多详细信息。

该示例演示了确定方向的三种算法,即ahrsfilterimufilter,ecompass。请参考使用惯性传感器确定方向有关惯性融合算法的更多细节。

Accelerometer-Gyroscope-Magnetometer融合

姿态和航向参考系统(AHRS)由一个9轴系统组成,该系统使用加速度计、陀螺仪和磁力计来计算设备的方向。的ahrsfilter产生一个平稳变化的估计方向的设备,同时正确估计北方方向。的ahrsfilter具有消除陀螺仪偏差的能力,也可以检测和拒绝轻微的磁干扰。

下面的代码片段使用ahrsfilter系统对象来确定传感器的方向,并创建一个随着移动传感器而更新的图形。在这个例子开始之前,传感器必须是静止的。

%陀螺仪噪声和加速度计噪声由数据表确定。陀螺仪enoisempu9250 = 3.0462e-06;%陀螺仪噪声(方差值),单位为rad/s加速度计noisempu9250 = 0.0061;%加速度计噪声(方差值),单位为m/s^2查看器= HelperOrientationViewer(“标题”, {“AHRS过滤”});FUSE = ahrsfilter()“SampleRate”imu。SampleRate,“GyroscopeNoise”GyroscopeNoiseMPU9250,“AccelerometerNoise”, AccelerometerNoiseMPU9250);stopTimer = 100;

当执行下面的代码时,慢慢移动传感器并检查图中的运动是否与传感器的运动相匹配。

修正因子A和b是用神奇的函数得到的,在其中一个解释前几节“补偿磁力计畸变”。Magx_correction = b(1);Magy_correction = b(2);Magz_correction = b(3);Ts = tic;(toc(ts) < stopTimer) [accel,gyro,mag] = read(imu);%根据NED惯例对齐坐标Accel = [-accel(:,2), -accel(:,1), Accel (:,3)];Gyro =[陀螺(:,2),陀螺(:,1),-陀螺(:,3)];mag = [mag(:,1)-magx_correction, mag(:, 2)- magy_correction, mag(:,3)-magz_correction] * A;rotators = FUSE(加速度、陀螺仪、磁);J = numel(rotators)查看器(rotators(J));结束结束

当传感器的设备X轴指向北时,设备y轴指向东,设备z轴指向下。

当传感器的设备X轴指向北时,设备y轴指向西,设备z轴指向上。

Accelerometer-Gyroscope融合

imufilter系统对象使用内部误差状态卡尔曼滤波器融合加速度计和陀螺仪数据。该滤波器能够去除随时间漂移的陀螺仪偏置噪声。过滤器不处理磁力计的数据,所以它不能正确地估计北方的方向。该算法假设传感器的初始位置是这样的:传感器的设备x轴指向磁北,传感器的设备y轴指向东,传感器的设备z轴指向下。在本例开始之前,传感器必须是静止的。

下面的代码片段使用imufilter对象来确定传感器的方向,并创建一个在移动传感器时更新的图形。

displayMessage ([本节使用IMU滤波器通过从\slmpu9250 \rm收集实时传感器数据来确定传感器的方向。...的系统对象。移动传感器以在图形窗口中显示传感器的方向。保持传感器的信纸。...“单击OK”],...使用IMU滤波器和MPU-9250估计方向%陀螺仪噪声和加速度计噪声由数据表确定。陀螺仪enoisempu9250 = 3.0462e-06;%陀螺仪噪声(方差),单位为rad/s加速度计noisempu9250 = 0.0061;%加速度计噪声(方差),单位为m/s^2查看器= HelperOrientationViewer(“标题”, {“IMU过滤”});FUSE = imufilter(“SampleRate”imu。SampleRate,“GyroscopeNoise”GyroscopeNoiseMPU9250,“AccelerometerNoise”, AccelerometerNoiseMPU9250);stopTimer = 100;

当执行下面的代码时,慢慢移动传感器并检查图中的运动是否与传感器的运动相匹配。

在stopTimer指定的时间内,使用imufilter来估计方向并在传感器移动时更新查看器抽搐;(toc < stopTimer) [accel,gyro] = read(imu);Accel = [-accel(:,2), -accel(:,1), Accel (:,3)];Gyro =[陀螺(:,2),陀螺(:,1),-陀螺(:,3)];rotators = FUSE(加速度,陀螺);J = numel(rotators)查看器(rotators(J));结束结束

imufilter算法也可以与MPU6050一起使用,因为它不需要磁力计的值。

当传感器的设备X轴指向北时,设备z轴指向下,设备y轴指向东。

当传感器的设备X轴向上时,设备y轴向西,设备z轴向南。

Accelerometer-Magnetometer融合

ecompass系统对象融合加速度计和磁力计数据。Ecompass算法是一种无内存算法,不需要参数调整,但极易受到传感器噪声的影响。您可以使用球面线性插值(SLERP)来低通滤波噪声轨迹。请参考使用四元数SLERP的低通滤波器定向示例获取更多详细信息。

displayMessage ([“本节使用\slecompass \rmfunction通过从\slmpu9250收集实时传感器数据来确定传感器的方向”...“\ rmsystem对象。移动传感器以在图形窗口中显示传感器的方向。在点击“确定”之前,请保持传感器的静止状态。],...“使用Ecompass算法估计方向。”) viewer = HelperOrientationViewer(“标题”, {“Ecompass算法”});使用ecompass算法估计方向,并在stopTimer指定的时间内随着传感器的移动更新查看器。修正因子A和b是用神奇的函数得到的,在其中一个解释前几节“补偿磁力计畸变”。Magx_correction = b(1);Magy_correction = b(2);Magz_correction = b(3);stopTimer = 100;抽搐;(toc < stopTimer) [accel,~,mag] = read(imu);Accel = [-accel(:,2), -accel(:,1), Accel (:,3)];mag = [mag(:,1)-magx_correction, mag(:, 2)- magy_correction, mag(:,3)-magz_correction] * A;Rotators = ecompass(accel,mag);J = numel(rotators)查看器(rotators(J));结束结束

清理

当不再需要连接时,释放并清除对象

释放(imu);清晰;

尝试的事情

您可以使用其他传感器(如InvenSense MPU-6050和意法半导体LSM9DS1)尝试此示例。注意,MPU-6050传感器只能与imufilter系统对象。