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