目录

一、硬件连接

二、创建传感器对象

2.1 创建一个对象并包含 I2C 库

2.2 创建 MPU-9250 传感器对象

2.3 补偿磁力计失真

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

2.5 调整过滤器参数

三、加速度计-陀螺仪-磁力计融合

四、加速度计-陀螺仪融合

五、  加速度计-磁力计融合

六、程序


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

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

一、硬件连接

将 MPU-9250 传感器的 SDA、SCL、GND 和 VCC 引脚连接到 Arduino® 硬件上的相应引脚。此示例使用具有以下连接的 Arduino Uno 板:

  • SDA - A4

  • 标准及校正实验所 - A5

  • 可变电压调节 - +3.3V

  • 接地 - 接地

确保与传感器的连接完好无损。建议使用原型屏蔽并将传感器焊接到其上,以避免在移动传感器时连接松动。

二、创建传感器对象

2.1 创建一个对象并包含 I2C 库

a = arduino('COM9', 'Uno', 'Libraries', 'I2C');

2.2 创建 MPU-9250 传感器对象

fs = 100; % Sample Rate in Hz
imu = mpu9250(a,'SampleRate',fs,'OutputFormat','matrix'); 

2.3 补偿磁力计失真

融合算法使用磁力计读数,需要补偿磁失真。通常,存在两种效应:硬铁变形和软铁变形。可以使用可通过以下步骤确定的校正值来校正这些失真:

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

  2. 使用magcal(导航工具箱)函数,如下图所示,获取校正系数。

ts = tic;
stopTimer = 50;
magReadings=[];
while(toc(ts) < stopTimer) % Rotate the sensor along x axis from 0 to 360 degree. % Take 2-3 rotations to improve accuracy. % For other axes, rotate along that axes. [accel,gyro,mag] = read(imu); magReadings = [magReadings;mag];
end [A, b] = magcal(magReadings); % A = 3x3 matrix for soft iron correction % b = 3x1 vector for hard iron correction 

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

此示例中使用的传感器融合算法使用东北向下 (NED) 作为固定的父坐标系。在NED参考系中,X轴指向北方,Y轴指向东,Z轴指向下方。根据算法的不同,北可以是磁北,也可以是真北。此示例中的算法使用磁北。此处使用的算法期望对象中的所有传感器的轴对齐,并符合NED惯例。

MPU-9250在同一块板上有两个设备,磁力计和加速度计陀螺仪。这些设备的轴彼此不同。磁力计轴与NED坐标对齐。加速度计陀螺仪的轴与MPU-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.陀螺仪

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

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

2.5 调整过滤器参数

本例中使用的算法经过适当调整后,可以估计方向,并且对环境噪声源具有鲁棒性。您必须考虑使用传感器的情况,并相应地调整过滤器。该示例演示了三种用于确定方向的算法。

三、加速度计-陀螺仪-磁力计融合

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

以下代码段使用 system 对象来确定传感器的方向,并创建一个图形,该图形会在您移动传感器时更新。在此示例开始之前,传感器必须是静止的。

% GyroscopeNoise and AccelerometerNoise is determined from datasheet.
GyroscopeNoiseMPU9250 = 3.0462e-06; % GyroscopeNoise (variance value) in units of rad/s
AccelerometerNoiseMPU9250 = 0.0061; % AccelerometerNoise(variance value)in units of m/s^2
viewer = HelperOrientationViewer('Title',{'AHRS Filter'});
FUSE = ahrsfilter('SampleRate',imu.SampleRate, 'GyroscopeNoise',GyroscopeNoiseMPU9250,'AccelerometerNoise',AccelerometerNoiseMPU9250);
stopTimer = 100;

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

% The correction factors A and b are obtained using magcal function as explained in one of the
% previous sections, 'Compensating Magnetometer Distortions'.
magx_correction = b(1);
magy_correction = b(2);
magz_correction = b(3);
ts = tic;
while(toc(ts) < stopTimer)[accel,gyro,mag] = read(imu);% Align coordinates in accordance with NED conventionaccel = [-accel(:,2), -accel(:,1), accel(:,3)];gyro = [gyro(:,2), gyro(:,1), -gyro(:,3)];mag = [mag(:,1)-magx_correction, mag(:, 2)- magy_correction, mag(:,3)-magz_correction] * A;rotators = FUSE(accel,gyro,mag);for j = numel(rotators)viewer(rotators(j));end
end

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

当传感器的设备 X 轴指向北方时,设备 Y 轴指向西方,设备 Z 轴指向上方。

四、加速度计-陀螺仪融合

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

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

displayMessage(['This section uses  IMU filter to determine orientation of the sensor by collecting live sensor data from the \slmpu9250 \rm' ...'system object. Move the sensor to visualize orientation of the sensor in the figure window. Keep the sensor stationery before you'...'click OK'],...'Estimate Orientation using IMU filter and MPU-9250.')
% GyroscopeNoise and AccelerometerNoise is determined from datasheet.
GyroscopeNoiseMPU9250 = 3.0462e-06; % GyroscopeNoise (variance) in units of rad/s
AccelerometerNoiseMPU9250 = 0.0061; % AccelerometerNoise (variance) in units of m/s^2
viewer = HelperOrientationViewer('Title',{'IMU Filter'});
FUSE = imufilter('SampleRate',imu.SampleRate, 'GyroscopeNoise',GyroscopeNoiseMPU9250,'AccelerometerNoise', AccelerometerNoiseMPU9250);
stopTimer=100;

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

% Use imufilter to estimate orientation and update the viewer as the sensor moves for time specified by stopTimer
tic;
while(toc < stopTimer)[accel,gyro] = read(imu);accel = [-accel(:,2), -accel(:,1), accel(:,3)]; gyro = [gyro(:,2), gyro(:,1), -gyro(:,3)]; rotators = FUSE(accel,gyro); for j = numel(rotators) viewer(rotators(j)); end
end 

该算法也可以与MPU6050一起使用,因为它不需要磁力计值。当传感器的设备 X 轴指向北方时,设备 Z 轴指向下方,设备 Y 轴指向东。

当传感器的设备 X 轴指向上方时,设备 Y 轴指向西方,设备 Z 轴指向南方。

五、  加速度计-磁力计融合

系统对象融合加速度计和磁力计数据。Ecompass 算法是一种无记忆算法,不需要参数调整,但极易受到传感器噪声的影响。可以使用球面线性插值 (SLERP) 来对噪声轨迹进行低通滤波。

displayMessage(['This section uses \slecompass \rmfunction to determine orientation of the sensor by collecting live sensor data from the \slmpu9250 ' ...'\rmsystem object. Move the sensor to visualize orientation of the sensor in the figure window. Keep the sensor stationery before you click OK'],...'Estimate Orientation using Ecompass algorithm.')
viewer = HelperOrientationViewer('Title',{'Ecompass Algorithm'});
% Use ecompass algorithm to estimate orientation and update the viewer as the sensor moves for time specified by stopTimer.
% The correction factors A and b are obtained using magcal function as explained in one of the
% previous sections, 'Compensating Magnetometer Distortions'.
magx_correction = b(1);
magy_correction = b(2);
magz_correction = b(3);
stopTimer = 100;
tic;
while(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);for j = numel(rotators)viewer(rotators(j));end
end 

六、程序

使用Matlab R2022b版本,点击打开。(版本过低,运行该程序可能会报错)

打开下面的“Estimate...MPU9250Example.mlx”文件,点击运行,就可以看到上述效果。

程序下载链接:https://download.csdn.net/download/weixin_45770896/87429182

基于Matlalb使用惯性传感器融合和MPU9250估计方向(附源码)相关推荐

  1. java计算机毕业设计ssm基于SSM框架的旅游订票系统s0s38(附源码、数据库)

    java计算机毕业设计ssm基于SSM框架的旅游订票系统s0s38(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstor ...

  2. C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码、有过程截图

    C++课程设计实训_基于多态书籍信息管理系统的设计与实现.附源码,有过程截图 书籍信息管理系统的设计与实现(基于多态) 学生姓名: 学 号: 指导老师: 所 在 系: 专 业: 班 级: C++课程设 ...

  3. 基于Matlab的单基地雷达模拟检测和跟踪仿真(附源码)

    目录 一.介绍 1.1 统计雷达模型 1.2 场景管理 1.3 扫描控制 二.场景-空中监视 2.1 雷达系统 2.2 参考目标和雷达环路增益 2.3 构建雷达 2.4 方案和目标 2.5 可检测性 ...

  4. 基于多篇经典论文综述Attention模型方法(附源码)

    来源:PaperWeekly 本文约4163字,建议阅读8分钟. 本文基于几篇经典的论文,对 Attention 模型的不同结构进行分析.拆解. 先简单谈一谈 attention 模型的引入.以基于 ...

  5. springboot项目文档源码_基于SpringBoot和Vue的企业级中后台项目(附源码)

    简介 SpringBoot和Vue,前后端分离,我们开源一套漂亮的代码和一套整洁的代码规范,让大家在这浮躁的代码世界里感受到一股把代码写好的清流!同时又让开发者节省大量的时间,减少加班,快乐工作,热爱 ...

  6. 基于 Android NDK 的学习之旅-----Java 调用C(附源码)

    基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1.  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...

  7. 基于 SpringMvc + OpenCV 实现的答题卡识别系统(附源码)

    点击关注公众号,实用技术文章及时了解 java_opencv 项目介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,它提供了一系列图像处理和计算机视觉方面很多通用算法.是研究图像 ...

  8. 毕业设计——基于小程序云开发的校园二手交易平台(附源码)

    本系统基于微信小程序云开发,采用小程序原生框架,不需要后端开发,数据库和CMS云开发全帮你搞定,对后端开发能力薄弱的同学超友好的有木有,只要你学过HTML+CSS+JS就能实现所有功能. 一.功能介绍 ...

  9. 基于 Vue 和 SpringBoot 实现的博客系统(附源码)

    今天给大家分享一个基于 Vue 和 SpringBoot 实现的博客系统! 源码在文章结尾处,大家自行下载即可,我设置的免积分下载! 一.主要功能 1.前端 后台管理系统采用Vue开发. 文章模块,支 ...

最新文章

  1. Facebook AI新研究:可解释神经元或许会阻碍DNN的学习
  2. Mybatis【一对多、多对一、多对多】知识要点
  3. 中国剩余定理(孙子定理)(精华详细版!)
  4. mysql字符集设置_mysql字符集设置
  5. 服务器时间维护制度,网络设备及服务器日常维护管理制度
  6. LeetCode 1030. 距离顺序排列矩阵单元格(排序Lambda表达式BFS)
  7. html 星空效果,html5 canvas炫酷旋转银河系星空背景特效
  8. N60E-O发布 不同CPU或将改变服务器市场?
  9. Qt 小项目 -- 颜色拾取器
  10. xlsx表格怎么做汇总统计_用excel表格统计数据-如何将多个EXCEL表格的数据进行汇总?...
  11. excel power bi 常用函数
  12. 计算机考研408难吗?学到什么程度才能考130?
  13. 三星固态sm863,pm863,sm865,sm865a颗粒
  14. 人之最美,纯朴初心,有所不为
  15. 电子计算机与其它计算机工具的本质区别是,电子计算机与其他计算工具的本质区别是...
  16. linux 三网卡 双网关,三网卡双机互联共享Internet
  17. 动画专业考一级计算机选什么语种,想成为一名出色的动画设计师吗?去美国纽约视觉艺术学院读计算机动画与视觉效果本科专业准没错!...
  18. 2018计算机专硕学硕,2018年考研要弄清学硕与专硕的区别
  19. c语言用fopen打开txt,C语言fopen不能打开.txt文件
  20. substrate node cli

热门文章

  1. 关于男人女人的经典感悟
  2. 判断三角形是何种三角形的测试用例
  3. 通往SDN之路:可编程网络的思想史
  4. 注意: yyyy-MM-dd 与 YYYY-MM-dd
  5. 【收藏】众多iOS开源资源库
  6. JAVA中文本字符反写
  7. ibatis java.util.Map作为parameterClass和resultClass(转)
  8. [算法学习no7]图的遍历
  9. 教你如何使用Python写游戏辅助脚本
  10. 使用 SysRq 查看系统信息