首页 > 其他分享 >陀螺仪LSM6DSOW开发(7)----融合磁力计进行姿态解算

陀螺仪LSM6DSOW开发(7)----融合磁力计进行姿态解算

时间:2024-08-04 19:28:05浏览次数:12  
标签:初始化 校准 ipKnobs 磁力计 ---- LSM6DSOW MFX MotionFX

陀螺仪LSM6DSOW开发.7--融合磁力计进行姿态解算

概述

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

需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV194421U7iw/

<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="49NIQz6F-1722579649793" src="https://player.bilibili.com/player.html?aid=1756286467"></iframe>

陀螺仪LSM6DSOW开发(7)----融合磁力计进行姿态解算

样品申请

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

源码下载

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32H503CB,陀螺仪为LSM6DSOW,磁力计为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度。
在这里插入图片描述
在这里插入图片描述

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

相关文章

  • ZeRO:一种去除冗余的数据并行方案
    ZeRO:一种去除冗余的数据并行方案目前训练超大规模语言模型主要有两条技术路线:TPU+XLA+TensorFlow/JAXGPU+Pytorch+Megatron+DeepSpeed前者由Google主导,由于TPU和自家云平台GCP深度绑定,对于非Googler来说并不友好后者背后则有NVIDIA、Meta、MS等大厂加持,社区氛围活......
  • C#:通用方法总结—第14集
    大家好,今天继续介绍我们的通用方法系列。下面是今天的通用方法:(1)这个通用方法为获取平面矢量///<summary>   ///获取平面矢量   ///</summary>   ///<paramname="c"></param>   ///<returns></returns>   publicstaticdouble[]GetVector(T......
  • vue filter 只能用于插值语法中吗,属性绑定可以用 filter 吗
    Vue过滤器不仅可以用于插值语法中,也可以用于属性绑定中。具体来说:插值语法中使用过滤器:过滤器可以用在双花括号插值中[1][5]。例如:{{message|capitalize}}属性绑定中使用过滤器:从Vue2.1.0版本开始,过滤器也可以用在v-bind表达式中[1][5]。例如:<divv-bi......
  • 认识C++
    C++简介C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。C++被认为是一种中级语言,它综合了高级语言和低级语言的特点。C++是由BjarneStroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的......
  • 使用vgg16 ————对乳腺超声图像进行分类(两种方法)
    文章目录一、对乳腺超声图像进行分类的重要性二、原始数据三、详细代码解释(方法1)导入库数据预处理和展示读取数据和标签数据集划分创建目录结构复制图像文件统计和显示各个数据集中不同类别的图像数量显示训练集中每个类别的样本图像使用ImageFolder创建训练、验证和测......
  • Java代码审计-SQL注入
    Java代码审计-SQL注入前言一、SQL注入简介二、Java主要执行SQL语句的方式三、JDBC方式产生的漏洞1.Statement方式2.PreparedStatement方式四、MyBatis方式产生的漏洞1.两种参数符号造成的SQL注入2.orderby、like、in引发注入五、Hibernate方式产生的漏洞1.简介2.原理......
  • Java代码审计-命令执行
    Java代码审计-命令执行前言一、漏洞简介二、命令连接符三、ProcessBuilder命令执行1.ProcessBuilder简介2.漏洞利用四、Runtimeexec命令执行1.Runtimeexec简介2.漏洞利用五、探索1.代码底层原理2.疑问3.小结六、总结参考前言今天来学一下java代码审计中的命令......
  • docker入门学习
    docker入门学习前言一、简介1.docker是什么2.docker特点及应用3.docker与虚拟机的区别4.docker相关概念理解5.docker网络二、docker安装1.安装2.配置镜像三、docker命令1.服务相关命令2.容器相关命令3.镜像相关命令四、搭建服务测试1.搜索tomcat镜像2.pulltomcat3.查......
  • 【学习笔记】Matlab和python双语言的学习(蒙特卡洛法)
    文章目录前言一、蒙特卡洛二、经典示例:计算圆周率π1.代码实现----Matlab2.代码实现----python三、示例2:三门问题1.代码实现----Matlab2.代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1E......
  • 用Manim在图形和坐标轴上画线条
     用Manim在图形和坐标轴上画线条.画图像函数的切线angle_of_tangent(x,graph,dx=1e-08)angle_of_tangent(x,graph,dx=1e-08)是Manim中用于计算图形在给定点的切线角度的函数。以下是对该函数参数的解释:参数说明x:这是你想要计算切线角度的x坐标。在这个坐标处,......