此示例显示如何从Invense MPU-9250 IMU传感器获取数据,以及如何在传感器数据中使用6轴和9轴融合算法来计算设备的方向。
MPU-9250是一种带有加速计、陀螺仪和磁强计的9轴传感器。加速计测量加速度,陀螺仪测量角速度,磁强计测量x、y和z轴上的磁场。传感器的轴取决于传感器的制造。
MATLAB®
Arduino金宝app®硬件的MATLAB支持包
传感器融合与跟踪工具箱™ 或导航工具箱™
微控制器
英文森MPU-9250
将MPU-9250传感器的SDA、SCL、GND和VCC引脚连接至Arduino®硬件上的相应引脚。此示例使用Arduino Uno板,并具有以下连接:
SDA-A4
症状自评量表-A5
VCC-+3.3V
GND-GND
确保与传感器的连接完好无损。建议使用原型屏蔽并将传感器焊接到其上,以避免移动传感器时连接松动。参考传感器故障诊断(Arduino金宝app硬件的MATLAB支持包)用于调试传感器相关问题的传感器页面。
创建一个阿杜伊诺
对象并包含I2C库。
a=arduino(“COM9”,“乌诺”,“图书馆”,“I2C”);
正在更新Uno(COM9)上的服务器代码。这可能需要几分钟。
创建MPU-9250传感器对象。
fs=100;%采样率(单位:Hz)imu=mpu9250(a,“采样器”,财政司司长,“输出格式”,“矩阵”);
聚变算法使用磁强计读数,需要补偿磁畸变,如硬铁畸变。硬铁变形是由产生磁场的材料产生的,导致响应面上的原点移动。可以通过从每个轴的磁强计读数中减去校正值来校正这些失真。要查找校正值,请执行以下操作:
1.围绕每个轴将传感器从0旋转到360度。
2.获取最小和最大磁强计读数。
3.平均最小和最大读数,以获得每个轴的校正值。
校正值随环境的变化而变化。
以下代码段可用于获取x轴的偏差值,其他轴也可遵循类似的过程:
显示消息([“融合算法使用需要补偿磁畸变的磁强计读数。”...给定的代码片段可以用来找到补偿硬铁变形的校正值。当代码'...,将传感器围绕x轴从0旋转到360度。对于其他轴,相应修改代码并旋转'...“沿该轴的传感器”],“补偿硬铁变形”);抽搐;stopTimer = 100;magReadings = [];虽然(toc<停止计时器)绕x轴从0到360度旋转传感器。%旋转2-3次以提高精度。%对于其他轴,请围绕该轴旋转。[加速度、陀螺仪、磁力]=读取(imu);磁读数=[磁读数;磁读数];终止%对于y轴,使用magreads(:,2),对于z轴,使用magreads (:,3)magx_min = min (magReadings (: 1));magx_max = max (magReadings (: 1));magx_correction = (magx_max + magx_min) / 2;
为了更精确的跟踪,还需要校准磁强计的其他失真。这个magcal
功能(此功能在传感器融合和跟踪工具箱中都可用™ 和导航工具箱™) 也可用于补偿软铁变形。在中更改为传感器计算的校正值readSensorDataMPU9250
示例文件夹中的函数.
本例中使用的传感器融合算法使用东北向下(NED)作为固定的父坐标系。在NED坐标系中,X轴指向北方,Y轴指向东方,Z轴指向下方。根据算法,北方可能是磁北或真北。本例中的算法使用磁北。此处使用的算法要求对象中的所有传感器将其轴线对齐,并符合NED惯例。
MPU-9250有两个设备,磁力计和加速度计-陀螺仪,在同一个板上。这些设备的轴是不同的。磁力计轴与NED坐标对齐。加速度-陀螺仪的轴与mpu9250中的磁力计轴不同。加速度计和陀螺仪轴需要交换和/或倒置,以匹配磁力计轴。有关更多信息,请参阅中“轴的方向”一节MPU-9250数据表.
要将MPU-9250加速度计-陀螺仪轴对准NED坐标,请执行以下操作:
1.定义设备轴:根据NED坐标系,将虚轴定义为传感器上的设备轴。NED坐标系可能与传感器轴相同,也可能与传感器轴不同。对于MPU-9250,磁力计轴可视为设备轴。
2.交换加速度计和陀螺仪读数的x和y值,使加速度计和陀螺仪轴与磁强计轴对齐。
3.确定加速度计和陀螺仪的极性值。
A.加速计
放置传感器,使设备X轴指向下方,垂直于传感器所在的表面。加速计读数应约为[9.8 0]。如果不是,则取加速度计的x值。
放置传感器,使设备Y轴向下,垂直于传感器所在的表面。加速计读数应约为[09.80]。如果不是,则取加速度计的y值。
放置传感器,使设备Z轴向下,垂直于传感器所在表面。加速计读数应约为[0 9.8]。如果不是,则否定加速计的z值。
B陀螺仪
沿每个轴旋转传感器并获取读数。使用右手螺丝尺纠正旋转极性。
在本例中,上述方法用于设置传感器的轴。
在本例中使用的算法,当被适当调整时,能够估计方向,并且对环境噪声源具有鲁棒性。必须考虑传感器使用的情况,并相应地调整滤波器。融合滤波器的定制调整有关调谐滤波器参数的更多细节。
该示例演示了确定方向的三种算法,即ahrsfilter
,过滤器
和生态公司
参考使用惯性传感器确定方向有关惯性聚变算法的更多详细信息。
姿态和航向参考系统(AHRS)由一个9轴系统组成,该系统使用加速计、陀螺仪和磁强计来计算设备的方向。这个ahrsfilter
生成设备方向的平滑变化估计,同时正确估计北向。这个ahrsfilter
具有消除陀螺仪偏差的能力,还可以检测和拒绝轻微的磁干扰。
以下代码段使用ahrsfilter
系统对象来确定传感器的方向,并创建一个图形,该图形在移动传感器时得到更新。在这个例子开始之前,传感器必须是静止的。
%陀螺仪噪声和加速度计噪声由数据表确定。陀螺噪声EMPU9250=3.0462e-06;陀螺噪声(方差值),单位为rad/sAccelerometerNoiseMPU9250 = 0.0061;%加速度计噪声(方差值),单位为m/s^2观众= HelperOrientationViewer (“头衔”,{“AHRS过滤器”});保险丝= ahrsfilter (“采样器”imu。SampleRate,“GyroscopeNoise”,EMPU9250,“加速度计噪音”,加速度计NOISEMPU9250);停止计时器=100;
在执行下面的代码时,缓慢地移动传感器,并检查图中的运动是否与传感器的运动相匹配。
%使用ahrsfilter估计方向,并将查看器更新为%传感器按stopTimer指定的时间移动显示消息(['本节使用AHRS过滤器通过从\slmpu9250\rm收集实时传感器数据来确定传感器的方向'...的系统对象。移动传感器以在图形窗口中显示传感器的方向。把传感器文具放在你的面前。...'单击“确定”],...使用AHRS滤波器和mcu -9250估计方向)抽搐;虽然(toc对于J = numel(rotators) viewer(rotators(J));终止终止
当传感器的设备X轴指向北方时,设备Y轴指向东方,设备Z轴指向下方。
当传感器的设备X轴向北时,设备y轴向西,设备z轴向上。
的过滤器
系统对象使用内部错误状态卡尔曼滤波器融合加速度计和陀螺仪数据。该滤波器能够消除随时间漂移的陀螺仪偏置噪声。该滤波器不处理磁强计数据,因此无法正确估计北半球的方向。该算法假设传感器的初始位置是这样的:传感器的设备X轴指向磁北,传感器的设备Y轴指向东,传感器的设备Z轴指向下。在本示例开始之前,传感器必须处于静止状态。
以下代码段使用过滤器
对象来确定传感器的方向,并创建一个在移动传感器时更新的图形。
显示消息(['本节使用IMU过滤器通过从\slmpu9250\rm收集实时传感器数据来确定传感器的方向'...的系统对象。移动传感器以在图形窗口中显示传感器的方向。把传感器文具放在你的面前。...'单击“确定”],...“使用IMU滤波器和MPU-9250估计方向。”)%陀螺仪噪声和加速度计噪声由数据表确定。陀螺噪声EMPU9250=3.0462e-06;陀螺噪声(方差),单位为rad/sAccelerometerNoiseMPU9250 = 0.0061;%加速度计噪声(方差),单位为m/s^2观众= HelperOrientationViewer (“头衔”,{“IMU过滤器”});保险丝= imufilter (“采样器”imu。SampleRate,“GyroscopeNoise”,EMPU9250,“加速度计噪音”,加速度计NOISEMPU9250);停止计时器=100;
在执行下面的代码时,缓慢地移动传感器,并检查图中的运动是否与传感器的运动相匹配。
%使用imufilter估计方向,并将查看器更新为%传感器按stopTimer指定的时间移动抽搐;虽然(toc < stopTimer) [accel,gyro] = readSensorDataMPU9250(imu);旋转=保险丝(accel,陀螺);对于J = numel(rotators) viewer(rotators(J));终止终止
的过滤器
该算法也可用于MPU6050,因为它不需要磁强计值。
当传感器的设备X轴向北时,设备z轴向下,设备y轴向东。
当传感器的设备X轴向上时,设备y轴向西,设备z轴向南。
的生态公司
system object融合了加速度计和磁强计数据。Ecompass算法是一种无记忆算法,无需参数调整,但极易受传感器噪声的影响。您可以使用球面线性插值(SLERP)对噪声轨迹进行低通滤波。请参阅使用四元数SLERP的低通滤波器定位有关更多详细信息,请参见示例
显示消息([“本节使用\slecompass \rmfunction来确定传感器的方向,通过从\slmpu9250收集实时传感器数据”...“\r系统对象。移动传感器以在图形窗口中显示传感器的方向。在单击“确定”之前保留传感器信纸'],...“使用罗盘算法估计方向。”)抽搐;观众= HelperOrientationViewer (“头衔”,{“Ecompass算法”}); 停止计时器=100;抽搐;%使用ecompass算法估计方向,并将查看器更新为%传感器按stopTimer指定的时间移动。虽然(toc对于J = numel(rotators) viewer(rotators(J));终止终止
当不再需要连接时,释放并清除对象
释放(imu);删除(imu);清晰;
您可以用其他传感器尝试这个例子,如InvenSense MPU-6050和STMicroelectronics LSM9DS1。注意,MPU-6050传感器只能与过滤器
系统对象。