MPU9250调试。做姿态、指南针(融合磁力计计算Yaw)

2023-11-08 18:20

本文主要是介绍MPU9250调试。做姿态、指南针(融合磁力计计算Yaw),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

底部 附工程源码链接

--2022-10-5

===================

近期调了一个姿态传感器,使用了MPU9250,主要是算法库不太好找,自己写是不太可能的,欧拉角、四元素计算反正我是没看懂,也贪图快,想一步到位调出来。

硬件工程师使用了IIC接口。

1. 最早调试使用了官方提供的mpl例程,移植完后俯仰和翻滚都没有问题,主要是YAW 方向角,每次芯片重启Yaw都是0,转动芯片吧这个值也变,就是置0不大对,毕竟9250是9轴有磁力计,每次重启计算出来的YAW应该和重启前一至是正北的角度偏移才对。

2. 后来翻了下mpl文档,发现需要对磁力计8字校准,mpl才会把磁力计融合进Yaw,否者Yaw是6轴融合的结果。试了下8字校准,不知道是不是环境内磁场干扰的关系,特别难校准,校准后的确融合了磁力计,得到了理想的Yaw。不过似乎这个校准值可以被存储下来,再次启动时传给mpl继续使用。我没有实现,因为产品需要,我想找一个校准简便的方式,但是这样一来mpl库就无法使用了。

3. 开始了漫长的找库过程,主要是找能够融合磁力计的计算方法,搜遍了大小论坛,基本上就是copy的mpl库。特别是某莫,交了几百块钱,反正没翻到有价值的东西,后来听说还改版了,钱也打了水漂,这都是后话了。

4. 在git找到了救命稻草。

GitHub - kriswiner/MPU9250: Arduino sketches for MPU9250 9DoF with AHRS sensor fusion

移植了这个例程,主要还是免费的,开源就是伟大。

例程比较简洁,开始会先进行校准,陀螺仪、重力。磁力计校准没有细看,这里换了自己的校准方式。

我的磁力计的校准思路是 :校准时进行三个轴面采样,每个轴面校准两个磁力计轴向。比如水平面采集X Y;每个平面划分成4个象限(要求高可以分为8个),判断每个象限采集足够的点之后判定为采集完成。采集过程记录点的最大值和最小值即可找到中心点。中心点值即为磁力计补偿值。

关于象限的判断,比如水平面采样,Z不使用。计算方法:atan2(X,Y)/(2*acos(-1))*360 方位角转度数,进而判断象限。校准完这些值可以做个结构体写flash,下次还用它。

最后

例程似乎有个bug,在选择坐标系时磁力计的坐标系与其他6轴不能吻合,也不符合右手定理。

当时把磁力计的Z轴反转了下,没有使用例程。计算的Yaw比较稳定,方向和手机磁力计大致相同。

使用的坐标系:

原例程磁力计是mag[1] mag[0] mag[2]。

这个库还算稳定,Yaw有小范围漂移,漂到一定范围自己修正。对比官方的mpl计算值的确差点,不过自己产品对Yaw要求不是特别高,区分东西南北绰绰有余。

在git评论区看到有同样疑问,作者还没有回复,或许是个bug。

附件:

https://download.csdn.net/download/Yangquot/86735853

代码入口mpu_9250_9axis,先初始化再进行计算。磁力计校验后存了下flash,校验时是按区域采点数做判断。

==========================>

同时自己做了一套最小系统评估板,宝上淘了几次9250发现都是翻新的,磁力计无法读取到;后面采购了些原装9250做了一套最小系统。并且基于STM32F103调试了一个简易的、可视化的磁力计校准方法。

评估板实测:

“简易式”磁力计校准:

在要求轴面转动,软件采集平面上8个区间上的点。并以“可视化”方式显示8个区间采集进度。

mpu9250

淘链接:

https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.1d293d0dnCTcxQ&ft=t&id=735135647199

<<END

这篇关于MPU9250调试。做姿态、指南针(融合磁力计计算Yaw)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/371661

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa