主要内容

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

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

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

需要MathWorks®产品2022世界杯八强谁会赢?

  • MATLAB®

  • Arduino硬件的MATLAB支持包

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

所需的硬件

  • Arduino Uno

  • InvenSense微处理器- 9250

硬件连接

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

  • Sda - a4

  • SCL - a5

  • VCC - + 3.3v

  • GND - GND

检查传感器连接是否完好。建议使用屏蔽原型,并将传感器焊接到屏蔽原型上,以避免移动传感器时连接松动。参考的传感器故障诊断页面,用于调试传感器相关问题。

创建传感器对象

创建一个arduino对象,包括I2C库。

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

创建MPU-9250传感器对象。

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

补偿磁强计失真

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

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

  2. 使用函数,如下所示,得到修正系数。

Ts = tic;stopTimer = 50;magReadings = [];(toc(ts) < stopTimer)将传感器沿x轴从0旋转到360度。*旋转2-3圈以提高准确度。对于其他轴,沿该轴旋转。[加速度,陀螺,mag] = read(imu);magreads = [magreads;mag];结束[A, b] = magcal(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系统对象,以确定传感器的方向,并创建一个图形,该图形在移动传感器时更新。在这个例子开始之前,传感器必须是静止的。

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

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

修正因子A和b是用magcal函数得到的,解释在其中一个%前几节,“补偿磁强计失真”。Magx_correction = b(1);Magy_correction = b(2);Magz_correction = b(3);Ts = tic;(toc(ts) < stopTimer) [accel,陀螺,mag] = read(imu);按照NED约定对齐坐标加速度=[-加速度(:,2),-加速度(:,1),加速度(:,3)];陀螺=[陀螺(:,2),陀螺(:,1),-陀螺(:,3)];mag = [mag(:,1)-magx_correction, mag(:, 2)- magy_correction, mag(:,3)-magz_correction] * A;旋转器= FUSE(加速,陀螺,mag);J = numel(rotators) viewer(rotators(J));结束结束

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

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

Accelerometer-Gyroscope融合

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

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

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

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

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

imufilter算法也可以用于MPU6050,因为它不需要磁强计值。

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

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

Accelerometer-Magnetometer融合

ecompass系统对象融合加速度计和磁力计数据。Ecompass算法是一种无记忆算法,不需要参数调优,但很容易受到传感器噪声的影响。可以使用球面线性插值(SLERP)对噪声轨迹进行低通滤波。请参考基于四元数SLERP的低通滤波器定位(传感器融合与跟踪工具箱)示例获取更多详细信息。

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

清理

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

释放(imu);清晰;

可以尝试的事情

您可以在其他传感器(如InvenSense MPU-6050和STMicroelectronics LSM9DS1)上尝试此示例。注意,MPU-6050传感器只能与imufilter系统对象。

Baidu
map