估计方向与互补的过滤器和IMU数据

这个例子展示了如何从Arduino中传输IMU数据,并使用一个互补的过滤器来估计方向。

硬件连接

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

  • SDA - A4

  • SCL - A5

  • VCC - + 3.3V

  • GND - GND

确保与传感器的连接完好无损。建议将传感器连接到原型防护罩上,以避免传感器在运动时连接松动。参考的传感器故障诊断页面调试传感器相关的问题。

创建传感器对象

创建一个Arduino的对象和一个mpu9250对象。指定传感器采样率Fs和时间量来运行循环。或者,启用isVerbose标志,检查是否任何样品溢出。通过禁用useHW国旗,你也可以运行保存在MAT文件传感器数据的例子loggedMPU9250Data.mat

中的数据loggedMPU9250Data.mat而IMU是一般是由于朝南被记录下来,然后旋转:

  • 绕z轴+90度

  • -绕z轴180度

  • 绕z轴+90度

  • 绕y轴+90度

  • 绕y轴-180度

  • 绕y轴+90度

  • 绕x轴90度

  • 绕x轴-270度

  • 绕x轴180度

注意最后两个绕x轴的旋转是额外的90度。这样做是为了把设备翻转过来。IMU的最终方向与初始方向相同,即正南。

FS = 100;samplesPerRead = 10;运行时间= 20;isVerbose = FALSE;useHW = TRUE;如果useHW a = arduino;imu = mpu9250 (,“SampleRate”Fs,“OutputFormat”,“矩阵”,...“SamplesPerRead”,samplesPerRead);其他的负载(“loggedMPU9250Data.mat”,'allAccel',“allGyro”,“allMag”,...'ALLT',“allOverrun”,...'numSamplesAccelGyro','numSamplesAccelGyroMag')结束

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

加速度计,陀螺仪和磁强计在MPU-9250的轴不彼此对齐。指定索引和符号X,Y,和每个传感器的z轴,以使传感器与北 - 东 - 向下(NED)对准坐标系统时,它是静止的。在这个例子中,虽然加速度计和陀螺仪轴保持固定磁力轴改变。对于自己的应用程序,更改下列参数是必要的。

%加速度计轴的参数。accelXAxisIndex = 1;accelXAxisSign = 1;accelYAxisIndex = 2;accelYAxisSign = 1;accelZAxisIndex = 3;accelZAxisSign = 1;%陀螺仪轴参数。gyroXAxisIndex = 1;gyroXAxisSign = 1;gyroYAxisIndex = 2;gyroYAxisSign = 1;gyroZAxisIndex = 3;gyroZAxisSign = 1;%磁力轴参数。magXAxisIndex = 2;magXAxisSign = 1;magYAxisIndex = 1;magYAxisSign = 1;magZAxisIndex = 3;magZAxisSign = 1;用于对齐传感器数据轴的辅助函数。alignAccelAxes = @(在)[accelXAxisSign,accelYAxisSign,accelZAxisSign]....* in(:, [accelXAxisIndex, accelYAxisIndex, accelZAxisIndex]);回转轴= @(in)[回转轴,回转轴,回转轴]...*在(:,[gyroXAxisIndex,gyroYAxisIndex,gyroZAxisIndex]);alignMagAxes = @(在)[magXAxisSign,magYAxisSign,magZAxisSign]....* in(:, [magXAxisIndex, magYAxisIndex, magZAxisIndex]);

执行额外的传感器校准

如果需要,您可以校准磁强计,以补偿磁扭曲。有关详细信息,请参阅的硬铁失真部分的补偿使用惯性传感器融合和MPU-9250估计方位(传感器融合和跟踪工具箱)例子。

指定互补的滤波器参数

complementaryFilter有两个可调参数。的AccelerometerGain参数决定了在陀螺仪测量中,加速度计测量的可信程度。的MagnetometerGain参数决定了磁强计测量多少可信任在陀螺仪测量。

compFilt = complementaryFilter(“SampleRate”Fs)
compFilt = complementaryFilter与属性:采样率:100 AccelerometerGain:0.0100 MagnetometerGain:0.0100 HasMagnetometer:1 OrientationFormat: '四元数'

估计方位加速度计和陀螺仪

设置HasMagnetometer财产禁用磁强计测量的输入。在这种模式下,过滤器只需要加速计和陀螺仪测量值作为输入。此外,过滤器呈IMU的初始取向与父导航框架对齐。如果IMU不与导航框架初始取向,将有一个恒定的取向估计偏移。

compFilt = complementaryFilter('HasMagnetometer',假);调谐器= HelperOrientationFilterTuner (compFilt);如果useHW抽动其他的idx = 1: samplesPerRead;overrunIdx = 1;结束真正如果useHW [加速,陀螺仪,MAG,吨,超限] = IMU();加速度= alignAccelAxes(加速度);陀螺= alignGyroAxes(陀螺仪);其他的accel = allAccel (idx:);陀螺= allGyro (idx:);杂志= allMag (idx:);t = allT (idx:);泛滥= allOverrun (overrunIdx:);idx = idx + samplesPerRead;overrunIdx = overrunIdx + 1;暂停(samplesPerRead / Fs)结束如果(isVerbose && > 0) fprintf('%d样本溢出... \ N'、泛滥);结束q = compFilt(accel, gyro);更新(调谐器,q);如果useHW如果toc > =运行时打破;结束其他的如果idx > numSamplesAccelGyro(结束)打破;结束结束结束

估计方位加速度计,陀螺仪,磁强计和

随着默认值AccelerometerGainMagnetometerGain在短期内,滤波器更相信陀螺仪的测量,但在长期内,滤波器更相信加速度计和磁强计的测量。这使得过滤器能够对快速的方向变化做出更大的反应,并防止方向估计值在更长的时间内漂移。对于特定的IMU传感器和应用目的,您可能需要调整滤波器的参数来提高方向估计的准确性。

compFilt = complementaryFilter(“SampleRate”Fs);调谐器= HelperOrientationFilterTuner (compFilt);如果useHW抽动结束真正如果useHW [加速,陀螺仪,MAG,吨,超限] = IMU();加速度= alignAccelAxes(加速度);陀螺= alignGyroAxes(陀螺仪);MAG = alignMagAxes(MAG);其他的accel = allAccel (idx:);陀螺= allGyro (idx:);杂志= allMag (idx:);t = allT (idx:);泛滥= allOverrun (overrunIdx:);idx = idx + samplesPerRead;overrunIdx = overrunIdx + 1;暂停(samplesPerRead / Fs)结束如果(isVerbose && > 0) fprintf('%d样本溢出... \ N'、泛滥);结束q = compFilt(accel, gyro, mag);更新(调谐器,q);如果useHW如果toc > =运行时打破;结束其他的如果idx > numSamplesAccelGyroMag(结束)打破;结束结束结束

摘要

这个例子演示了如何使用来自Arduino和补充过滤器的数据来估计IMU的方向。本例还展示了如何配置IMU,并讨论了调整互补滤波器参数的影响。