首页 > 其他分享 >驱动LSM6DS3TR-C实现高效运动检测与数据采集(10)----融合磁力计进行姿态解算

驱动LSM6DS3TR-C实现高效运动检测与数据采集(10)----融合磁力计进行姿态解算

时间:2024-07-21 15:55:58浏览次数:9  
标签:10 校准 ipKnobs 磁力计 LSM6DS3TR 初始化 MFX MotionFX

驱动LSM6DS3TR-C实现高效运动检测与数据采集.10--融合磁力计进行姿态解算

概述

MotionFX库包含用于校准陀螺仪、加速度计和磁力计传感器的例程。 将磁力计的数据与加速度计和陀螺仪的数据融合,可以大幅提高姿态估计的精度。三轴加速度计提供设备的倾斜信息,陀螺仪提供角速度信息,而磁力计提供方位信息,三者结合可以提供更加准确和稳定的三维方向和姿态信息。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32H503CB,陀螺仪为LSM6DS3TR-C,磁力计为LIS2MDL。
在这里插入图片描述

DataLogFusion

这里参考ST提供的DataLogFusion程序,DataLogFusion示例应用展示了如何使用STMicroelectronics开发的MotionFX中间件库进行实时运动传感器数据融合。
DataLogFusion的主要执行流程包括初始化硬件和传感器、中间件库(MotionFX)的配置与初始化、传感器数据的采集、实时数据融合以及结果的输出。

在这里插入图片描述

磁力计校准过程

MotionFX库的磁力计校准库用于补偿硬铁失真。磁力计校准可以以比传感器融合输出数据速率更慢的频率进行(例如25 Hz)。
● 初始化磁力计校准库:
● 调用 MotionFX_MagCal_init 或 MotionFX_CM0P_MagCal_init 函数。
● 定期调用校准函数:
● 调用 MotionFX_MagCal_run 或 MotionFX_CM0P_MagCal_run 函数,直到校准成功完成。
● 检查校准是否成功:
● 调用 MotionFX_MagCal_getParams 或 MotionFX_CM0P_MagCal_getParams 函数。如果函数返回 mag_data_out.cal_quality = MFX_MAGCALGOOD 或 MFX_CM0P_CALQSTATUSBEST,则校准成功。

在这里插入图片描述

初始化磁力计

调用 MotionFX_MagCal_init 或 MotionFX_CM0P_MagCal_init 函数。这里通过调用 MotionFX_MagCal_init,确保磁力计校准模块处于准备就绪状态,能够正确处理和校准磁力计数据。
通过初始化磁力计校准库,并定期调用校准函数,可以确保磁力计数据的准确性,从而提高姿态估计的精度。

在这里插入图片描述

频率定义。

#define ALGO_FREQ  100U /* Algorithm frequency 100Hz */
#define ALGO_PERIOD  (1000U / ALGO_FREQ) /* Algorithm period [ms] */

添加到初始化中进行调用。

在这里插入图片描述

文档中提到的磁力计数据要除以50,这是因为MotionFX库使用的单位是微特斯拉(µT)/50。

在这里插入图片描述

在lsm6ds3tr-c_app.h中添加定义。

#define FROM_MGAUSS_TO_UT50     (0.1f/50.0f)

MFX_Arithmetic_Init

MFX_Arithmetic_Init 的作用是初始化 MotionFX 算法库,并进行相关参数设置和配置。
由于现在是9轴解析,需要新定义用于保存 MotionFX 算法状态的数组。

static uint8_t mfxstate_9x[FX_STATE_SIZE];

函数功能:
● 初始化 MotionFX 算法库。
● 配置传感器的偏置值和方向。
● 设置输出参考模式。
● 启用或禁用 6 轴和 9 轴 MotionFX 引擎。

void MFX_Arithmetic_Init(void)
{
	MFX_knobs_t iKnobs;
	MFX_knobs_t *ipKnobs = &iKnobs;


	/* 初始化 MotionFX 算法库,参考自 AlgoBuilded 生成代码 */
	/* 初始化 MotionFX 引擎 */
	MotionFX_initialize((MFXState_t *)mfxstate_9x);

	/* 获取当前的内部结构参数 */
	MotionFX_getKnobs(mfxstate_9x, ipKnobs);

	/* 设置传感器 */
	ipKnobs->gbias_acc_th_sc = GBIAS_ACC_TH_SC_9X;
	ipKnobs->gbias_gyro_th_sc = GBIAS_GYRO_TH_SC_9X;
	ipKnobs->gbias_mag_th_sc = GBIAS_MAG_TH_SC_9X;

	/* 未知作用操作,数据定向? */
	ipKnobs->acc_orientation[0] = ACC_ORIENTATION_X;
	ipKnobs->acc_orientation[1] = ACC_ORIENTATION_Y;
	ipKnobs->acc_orientation[2] = ACC_ORIENTATION_Z;

	ipKnobs->gyro_orientation[0] = GYR_ORIENTATION_X;
	ipKnobs->gyro_orientation[1] = GYR_ORIENTATION_Y;
	ipKnobs->gyro_orientation[2] = GYR_ORIENTATION_Z;

	ipKnobs->mag_orientation[0] = MAG_ORIENTATION_X;
	ipKnobs->mag_orientation[1] = MAG_ORIENTATION_Y;
	ipKnobs->mag_orientation[2] = MAG_ORIENTATION_Z;  

	/* 设置输出参考模式,数据参考系 */
	ipKnobs->output_type = MFX_ENGINE_OUTPUT_ENU;
	ipKnobs->LMode = 1;
	/* modx 代表 MotionFX_update 函数调用频率,
	 *	modx = 1,每调用 MotionFX_propagate 函数一次,可调用 MotionFX_update 函数一次,适用于STM32F4系列处理器,
	 *	modx = 2,每调用 MotionFX_propagate 函数两次,可调用 MotionFX_update 函数一次,适用于STM32F1系列处理器。
	 */
	ipKnobs->modx = 1;

	/* 设置内部结构参数 */
	MotionFX_setKnobs(mfxstate_9x, ipKnobs);

	/* 使能6轴 MotionFX 引擎*/
	MotionFX_enable_6X(mfxstate_9x, MFX_ENGINE_DISABLE);
	/* 关闭9轴 MotionFX 引擎*/
	MotionFX_enable_9X(mfxstate_9x, MFX_ENGINE_ENABLE);
}

卡尔曼滤波算法

运行卡尔曼滤波传播算法MotionFX_propagate。
根据需要更新卡尔曼滤波器MotionFX_update。
需要注意的是这2各算法非常吃资源,需要注意MCU算力分配。

在这里插入图片描述

函数结构如下所示。

在这里插入图片描述

演示

和指南针一个方向。

在这里插入图片描述

在这里插入图片描述

偏移90度。

在这里插入图片描述

在这里插入图片描述

偏移180度。
在这里插入图片描述

在这里插入图片描述

偏移270度。
在这里插入图片描述
在这里插入图片描述

标签:10,校准,ipKnobs,磁力计,LSM6DS3TR,初始化,MFX,MotionFX
From: https://blog.csdn.net/qq_24312945/article/details/140589118

相关文章

  • YOLOv10改进 | 独家创新- 注意力篇 | YOLOv10引入结合SimAM和SKAttention形成全新的SK
    1.SKAM介绍     SKAM(SimAMandSKAttentionModule)注意力机制结合了SimAM和SKAttention的优点,能够在图像特征提取中表现出更为优异的性能。     SimAM注意力机制     SimAM(SimplifiedAttentionModule)是一种简单但有效的注意力机制,旨在增强......
  • YOLOv10改进 | 独家创新- 注意力篇 | YOLOv10引入结合EMAttention和NAMAttention形成
    1. EAMA注意力机制     EAMA注意力模块比NAMAttention和EMAttention在图像特征提取方面更强,其优势主要体现在以下几个方面:     (1).综合利用通道和空间信息:     EAMA结合了EMAttention和NAMAttention两种注意力机制,充分利用了通道和空间信......
  • win10删除鼠标右键选项
    鼠标右键菜单时,发现里面的选项特别多,找一下属性,半天找不到。删除一些不常用的选项,让右键菜单变得干净整洁。1、按下键盘上的“win+R”组合按键,调出“运行”对话框,输入“regedit”命令,点击“确定”按钮;2、展开“HKEY_CLASSES_ROOT\”3、找到“Directory”文件夹,进入下......
  • 第 10 节 函数的基础3
    函数1.生成式列表生成式即ListComprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。#需求:生成一个1~10的整数列表list1=list(range(1,11))print(list1)#[1,2,3,4,5,6,7,8,9,10]#需求:生成列表:[1*1,2*2,3*3,4*4,5*5,6*6,7*......
  • Tenable Nessus 10.7.5 (macOS, Linux, Windows) 发布 - #1 漏洞评估解决方案
    TenableNessus10.7.5(macOS,Linux,Windows)发布-#1漏洞评估解决方案发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu24.04请访问原文链接:https://sysin.org/blog/nessus-10/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgNessus......
  • 2024杭电1003 HDOJ7435 树
    本文同步发布于我的网站Problem给一棵根为1的有根树,点\(i\)具有一个权值\(A_i\)。定义一个点对的值\(f(u,v)=\max\left(A_u,A_v\right)\times\left|A_u-A_v\right|\)。你需要对于每个节点\(i\),计算\(ans_i=\sum_{u\in\operatorname{subtree}(i),v\in\op......
  • 1029、基于单片机的闹钟(存储)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能单片机期末考试任务书设计一个程序,实现以下功能:具有4个以上按键,具有确定键,返回键,上移键,下移键,可以通过按键设定时间的时钟,分钟设......
  • 1028、基于单片机的流水灯(5个按键)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能花样流水灯1、扩展32个LED灯,低电平驱动2、使用5个按键切换5种花样二、proteus仿真三、原理图四、程序源码五、......
  • Windows 10 专业版 安装nvidia 显卡 nvidia安装程序无法继续,此NVIDIA驱动程序与此Win
    1win10系统全新安装,安装nvidai显卡驱动报错:nvidia安装程序无法继续,此NVIDIA驱动程序与此Windows版本不兼容2查看win10系统版本:运行--输入winver3升级补丁更新系统#补丁更新完成,重新启动win10,再次打开windows更新,升级到22h2#再次查看系统版本,已更新成功4......
  • 《痞子衡嵌入式半月刊》 第 105 期
    痞子衡嵌入式半月刊:第105期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。本期刊是开源项目(GitHub:JayHeng/pzh-mcu-bi-weekly),欢迎提交issue,投稿或推荐你知道的嵌入式那些事儿。上期回顾:《痞子衡嵌入式半月......