驱动LSM6DS3TR-C实现高效运动检测与数据采集(5)----上报匿名上位机实现可视化

news2024/12/21 18:54:19

概述

lsm6ds3trc包含三轴陀螺仪与三轴加速度计。
姿态有多种数学表示方式,常见的是四元数,欧拉角,矩阵和轴角。他们各自有其自身的优点,在不同的领域使用不同的表示方式。在四轴飞行器中使用到了四元数和欧拉角。
姿态解算选用的旋转顺序为ZYX,即IMU坐标系初始时刻与大地坐标系重合,然后依次绕自己的Z、Y、X轴进行旋转:
绕IMU的Z轴旋转:航向角yaw
绕IMU的Y轴旋转:俯仰角pitch
绕IMU的X轴旋转:横滚角row

在这里插入图片描述

横滚roll,俯仰pitch,偏航yaw的实际含义如下图:

在这里插入图片描述
由于需要解析姿态角,故将陀螺仪速度修改快一点。
在这里插入图片描述

欧拉角

横滚角φ:机体绕OBXB转动,轴Y’B与平面OBXBYB构成的夹角。
俯仰角θ:机体绕OBYB转动,轴Z’B与平面OBYBZB构成的夹角。
偏航角ψ:机体绕OBZB转动,轴X’B与平面OBXBZB构成的夹角。

在这里插入图片描述
将姿态角从机体坐标系转换到惯性坐标系中是为了便于分析无人机状态,反映无人机在惯性坐标系下的姿态运动状态,利用齐次线性变换可实现坐标系的转换,旋转矩阵就是在线性变化中产生的,用REB表示惯性坐标系{E}到机体坐标系{B}的变换。
例如,绕OBXB旋转必角,此时两个坐标系存在必的角度差,不再重合。点(x, y, z)的转换方程为:
在这里插入图片描述
可提取转换矩阵:
在这里插入图片描述

同理,绕口OBYB旋转θ角得:
在这里插入图片描述

而绕OBZB旋转ψ角得:
在这里插入图片描述

不同旋转顺序有不同的旋转矩阵,按照偏航,俯仰,横滚的顺序,即分别绕X-Y-Z旋转,就可计算出旋转矩阵REB,REB等于依次旋转所得的矩阵连乘,且顺序为从右向左排列。

在这里插入图片描述

万向节死锁

当俯仰角θ=±Π/2时,横滚运动与偏航运动的旋转轴重合,出现万向节死锁现象,在空间失去了一个自由度。如式所示,φ或ψ的变化具有相同的效果,因此不再具有唯一性啊。

在这里插入图片描述

四元数法

本文选择的是四元数法进行姿态解算。无人机姿态解算方法主要有四种,它们各自的优缺点如下图所示。欧拉角法不能用于计算飞行器的全姿态角,且难以实时计算而不易于工程应用。方向余弦法不会出现“奇点”现象,但计算量大,效率低。四元数法避免了复杂的三角函数运算,变为求解线性微分方程,算法简单易操作,且不存在角度奇异性问题,可以更好的线性化系统,是一种更实用的工程方法。

在这里插入图片描述

四元数的概念诞生在1843年的爱尔兰,是数学家哈密顿研究空间几何时提出。在如今的导航技术领域,四元数的优势逐渐被发现,得到了研究者们的广泛关注,并逐渐应用在姿态解算领域。

四元数是由四个元构成的数Q(q0,q1,q2,q3) = q0 + q1i + q2j + q3k;其中,q0,q1,q2,q3是实数,i,j,k既是互相正交的单位向量,又是虚单位根号-1。四元数即可看作四维空间中的一个向量,又可以看做一个超复数。对于后续有一个重要的变化需要记住:
Q=q0 + q1i + q2j + q3k
可视为一个超复数,Q 的共轭复数记为
Q’=q0 - q1i - q2j - q3k
Q°称为Q的共轭四元数。
同时,有
ij=k,jk=i,ki=j,ji=-k,kj=-i,ik=-j
i2 = j2 = k2 =ijk=-1
在这里插入图片描述
其中,i、j、k是相互正交的单位向量,其几何意义可理解为分别绕三个坐标轴的旋转,q0、q1、q2、q3为常数,有
在这里插入图片描述

通过四元数进行欧拉角求解,可以减少芯片运算负担,提高运算速度。
在这里插入图片描述

一个矢量V相对于坐标系OXYZ固定:V = xi + yj + zk;坐标系OXYZ转动了Q得到一个新坐标系OX’Y’Z’:V = x’i’ + y’j‘ + z’k’;设四元数Ve、Ve‘
Ve = xi + yj + zk;
Ve’ = x’i + y’j + z’k;
则Ve’ = Q* Ve * Q’;
设Q = q0 + q1i + q2j + q3k;则Q’ = q0 - q1i - q2j - q3k;
则Ve’ = Q* Ve * Q’=(q0 + q1i + q2j + q3k) * (0+xi + yj + zk) + (q0 - q1i - q2j - q3k)
可以算出
x’=(q0 ^2+q1 ^2-q2 ^2-q3 ^2)x+2(q1q2+ q1q3)y+2(q1q3-q0q2)z
y’ = 2(q1q2-q0q3)x+(q0 ^2-q1 ^2+q2 ^2-q3 ^2)y+2(q2q3+q0q1)z
z’ = 2(q1q3+q0q2)x+2(q2q3-q0q1)y+(q0 ^2-q1 ^2-q2 ^2+q3 ^2)z

在这里插入图片描述

结合
在这里插入图片描述
可以反推
在这里插入图片描述

        Pitch  = asin(2 * q2 * q3 + 2 * q0* q1)* 57.3; // pitch ,转换为度数
        Roll = atan2(-2 * q1 * q3 + 2 * q0 * q2, q0*q0-q1*q1-q2*q2+q3*q3)* 57.3; // rollv
        Yaw = atan2(2*(q1*q2 - q0*q3),q0*q0-q1*q1+q2*q2-q3*q3) * 57.3;   //偏移太大,

将加速度的三维向量转为单位向量

        // 测量正常化
        norm = sqrt(ax*ax + ay*ay + az*az);      
        ax = ax / norm;                   //单位化
        ay = ay / norm;
        az = az / norm;    

世界坐标系重力分向量是通过方向旋转矩阵的最后一列的三个元素乘上加速度就可以算出机体坐标系中的重力向量。

        // 估计方向的重力
        vx = 2*(q1*q3 - q0*q2);//由下向上方向的加速度在加速度计X分量 
        vy = 2*(q0*q1 + q2*q3);//由下向上方向的加速度在加速度计X分量 
        vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;//由下向上方向的加速度在加速度计Z分量

姿态解算

在这里插入图片描述

双环PI控制器

陀螺仪能够迅速响应设备的旋转,在短时间内误差较小且可靠。然而,因为温度漂移、零漂移和积分误差会随时间累积,陀螺仪的长时间精度受到影响。在静止状态下,加速度计的漂移很小,其倾角求解过程中不存在积分误差,但在飞行过程中,加速度计受到发动机和机架振动以及转动和运动加速度的干扰。磁罗盘测量的地磁向量在特定地理范围内可视为不变,但磁罗盘易受硬磁场和软磁场干扰。
因此,若系统外环采用九轴姿态传感器(包括三轴加速度计、三轴磁罗盘和三轴陀螺仪)进行数据融合,磁罗盘易受干扰可能导致融合后的数据仍有较大误差。为此,在内环使用六轴姿态传感器(包括三轴加速度计和三轴陀螺仪)进行数据融合,对融合后的传感器姿态偏差进行二次修正,以提高整体精度。
外环九轴姿态传感器数据融合,记在飞行器机体坐标系下an=[ax ay az]T和mn=[mx my mz]T分别为加速度计和磁罗盘实际测量得到的重力向量和地磁向量。
记vn=[vx vy vz]T和wn=[mx my mz]T是将地理坐标系下重力向量kb=[0 0 1g]T和地磁向量nb=[nx 0 nz]T(不考虑地理磁偏角因素,将机头固定向北)通过四元数坐标换算成机体坐标系下的重力向量和地磁向量。向量之间的误差为坐标轴的旋转误差,可以用向量的叉积en=[ex ey ez]T表示,如下所示。
在这里插入图片描述

由于我的LSM6DS3TR-C为六轴,不带三轴陀螺仪,故代码如下。

//这个叉积向量仍旧是位于机体坐标系上的,而陀螺积分误差也是在机体坐标系,而且叉积的大小与陀螺积分误差成正比,正好拿来纠正陀螺。
//(你可以自己拿东西想象一下)由于陀螺是对机体直接积分,所以对陀螺的纠正量会直接体现在对机体坐标系的纠正。

		ex = (ay*vz - az*vy);
        ey = (az*vx - ax*vz);
        ez = (ax*vy - ay*vx);

由于陀螺仪是对机体直接积分,所以,陀螺仪的误差可以体现为机体坐标的误差。因此修正坐标轴的误差可以达到修正陀螺仪误差的目的,从而将加速度计和磁罗盘进行修正陀螺仪,实现了九轴的数据融合。即如果陀螺仪按照叉积误差的轴,转动叉积误差的角度,就可以消除机体坐标上实际测量的重力向量和地磁向量和坐标换算后的重力向量和地磁向量之间的误差。
PI调节器的比例部分用于迅速纠正陀螺仪误差,积分部分用于消除稳态偏差。PI调节器的比例系数和积分系数自己去修正。陀螺仪经过外环PI控制器修正姿态误差后输出值为了gn =[gx gy gz]T
在这里插入图片描述

        // 积分误差比例积分增益,计算陀螺仪测量的重力向量与估计方向的重力向量之间的误差。
        exInt = exInt + ex*Ki;
        eyInt = eyInt + ey*Ki;
        ezInt = ezInt + ez*Ki;
 
        // 调整后的陀螺仪测量,使用叉积误差来进行比例-积分(PI)修正陀螺仪的零偏。将修正量乘以比例增益Kp,并加上之前计算的积分误差exInt、eyInt和ezInt。
        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt;
内环的六轴姿态传感器数据融合是将地理坐标系下的重力场向量与加速度计在机体坐标系下采集到的重力向量进行叉乘,求出两者向量误差。并通过PI控制器修正向量误差,从而达到修正外环九轴数据融合后的陀螺仪的偏差的目的。在每个姿态解算周期读取出机体坐标系下双环PI控制后的陀螺仪的角速率

在这里插入图片描述

整合四元数率和正常化,根据陀螺仪的测量值和比例-积分修正值,对四元数进行更新。
在这里插入图片描述

        // 整合四元数率和正常化,根据陀螺仪的测量值和比例-积分修正值,对四元数进行更新。根据微分方程的离散化形式,将四元数的每个分量加上相应的微分项乘以采样周期的一半(halfT)。
        q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
        q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
        q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
        q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  
 
        // 正常化四元数
        norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
        q0 = q0 / norm;
        q1 = q1 / norm;
        q2 = q2 / norm;
        q3 = q3 / norm;

偏航角

六轴传感器(包括三轴加速度计和三轴陀螺仪)可以用于估算设备在空间中的姿态,包括俯仰角(Pitch)、横滚角(Roll)和偏航角(Yaw)。然而,六轴传感器仅依赖陀螺仪和加速度计数据,可能无法准确测量偏航角(Yaw),原因如下:
无磁场参考:六轴传感器缺少磁罗盘,没有固定的参考方向。因此,在长时间内,陀螺仪的积分误差可能导致偏航角估计漂移。
陀螺仪误差累积:陀螺仪测量的是角速度,要得到偏航角,需要将角速度积分。由于陀螺仪存在零漂、噪声和温度漂移等误差,这些误差在积分过程中会累积,使得偏航角估计产生较大的漂移。
虽然六轴传感器可能无法准确测量偏航角,但可以通过将其与磁罗盘(三轴磁场传感器)结合,形成九轴传感器(包括三轴加速度计、三轴磁罗盘和三轴陀螺仪),以提高偏航角估计的准确性。九轴传感器融合了磁场信息,为偏航角提供了一个稳定的参考方向,有助于减小陀螺仪误差对偏航角估计的影响。

陀螺仪解析代码

 //加速度单位g,陀螺仪rad/s
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{

        float norm;
        float vx, vy, vz;
        float ex, ey, ez;  
 
        // 测量正常化,把加计的三维向量转成单位向量。
        norm = sqrt(ax*ax + ay*ay + az*az);      
        ax = ax / norm;                   //单位化
        ay = ay / norm;
        az = az / norm;      
 
        // 估计方向的重力,世界坐标系重力分向量是通过方向旋转矩阵的最后一列的三个元素乘上加速度就可以算出机体坐标系中的重力向量。
        vx = 2*(q1*q3 - q0*q2);//由下向上方向的加速度在加速度计X分量 
        vy = 2*(q0*q1 + q2*q3);//由下向上方向的加速度在加速度计X分量 
        vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;//由下向上方向的加速度在加速度计Z分量
 

//这个叉积向量仍旧是位于机体坐标系上的,而陀螺积分误差也是在机体坐标系,而且叉积的大小与陀螺积分误差成正比,正好拿来纠正陀螺。
//(你可以自己拿东西想象一下)由于陀螺是对机体直接积分,所以对陀螺的纠正量会直接体现在对机体坐标系的纠正。

		ex = (ay*vz - az*vy);
        ey = (az*vx - ax*vz);
        ez = (ax*vy - ay*vx);
 
        // 积分误差比例积分增益,计算陀螺仪测量的重力向量与估计方向的重力向量之间的误差。
		
        exInt = exInt + ex*Ki;
        eyInt = eyInt + ey*Ki;
        ezInt = ezInt + ez*Ki;				
 
        // 调整后的陀螺仪测量,使用叉积误差来进行比例-积分(PI)修正陀螺仪的零偏。将修正量乘以比例增益Kp,并加上之前计算的积分误差exInt、eyInt和ezInt。
        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt; 
 
        // 整合四元数率和正常化,根据陀螺仪的测量值和比例-积分修正值,对四元数进行更新。根据微分方程的离散化形式,将四元数的每个分量加上相应的微分项乘以采样周期的一半(halfT)。
        q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
        q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
        q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
        q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  
 
        // 正常化四元数
        norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
        q0 = q0 / norm;
        q1 = q1 / norm;
        q2 = q2 / norm;
        q3 = q3 / norm;
 
        Pitch  = asin(2 * q2 * q3 + 2 * q0* q1)* 57.3; // pitch ,转换为度数
        Roll = atan2(-2 * q1 * q3 + 2 * q0 * q2, q0*q0-q1*q1-q2*q2+q3*q3)* 57.3; // rollv
        Yaw = atan2(2*(q1*q2 - q0*q3),q0*q0-q1*q1+q2*q2-q3*q3) * 57.3;   //偏移太大,等我找一个好用的

}

上报匿名助手能正常进行解析。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot配置多数据源

SpringBoot配置多数据源 最近在做一个SpringBoot项目时需要关联两个数据库,于是乎我就研究了下关于springboot的多数据源配置,记录配置过程,分享一下 一、基础配置 (这里只展示主要配置) JDK1.8springBoot2.3.4.RELEASEmybatis2.1.0mysql-connector-java 8.0.21maven仓…

知乎家居产品种草营销怎么做?

近年来,家居产品种草营销已经成为了一种新型营销方式。知乎作为全球最大的中文问答社区,拥有着海量的用户和优质内容,逐渐成为了家居产品种草营销中不可忽视的平台。那么,在这个平台上如何进行家居产品种草营销呢?接下…

Python之函数【三】(高阶函数和闭包)

文章目录 前言一、高阶函数二、闭包(也称之为:闭包函数) 1、浅谈闭包函数 1.1、划重点1.2、注意点2、怎么判断是不是闭包函数呢? 2.1、那接下来,我们就细细的拆开解释2.2、对于这个作用域,在JavaSc…

【MySQL数据库基础】

MySQL数据库基础 1. 数据库的操作1.1 显示当前的数据库1.2 创建数据库1.3 使用数据库1.4 删除数据库 2. 常用数据类型2.1整数(xxxint)2.2日期时间类型2.3字符串型 3. 表的操作3.1 查看表结构3.2 创建表3.3 删除表 1. 数据库的操作 1.1 显示当前的数据库…

Es索引中时间字段是字符串Range查询的正确姿势

文章目录 [toc] 1. 问题2. Es索引的mapping模式2.1 dynamic动态宽松模式(动态映射)2.2 strict严格模式(静态映射) 3. text类型和keyword类型的区别3.1 text类型3.2 keyword类型 4.正确姿势5. 总结 1. 问题 由于之前搞了一个使用fl…

230616安装SqlServer2017Express

230616安装SqlServer2017Express 下载地址 选择语言 Microsoft SQL Server 2017 Express 下载地址: 简体中文 感谢下载 Microsoft SQL Server 2017 Express 我将下载的文件的名称加上了SHA256值, 一长串 是一个 .exe 的自解压文件, 双击后,默认解压到同根文件夹\同名文件夹下,…

那些可以当源码学习的优质开源项目分享

本篇收集的是自己平时逛 Github 发现的一些优质的开源项目,为什么收集它? 借助优质的开源项目,我们不仅可以拿来二次开发快速实现想要的功能,而且还可以学习里面优秀的代码,提高我们的编程能力。读(拆解&am…

vue实现elementUI table表格树形结构-使用懒加载时-解决子节点增删改后,不刷新子节点数据问题

问题发现 在使用element-ui的table组件时,使用树形结构,并使用了懒加载,可出现了一个问题,在对当前节点添加一个子节点数据,或删除一个子节点数据时,当前节点的子节点数据并不自动刷新出来。element-ui官方…

景联文科技:一文详解关键点标注

关键点标注是计算机视觉领域的一种任务,指的是在图像或视频序列中标注出特定目标的关键点,这些关键点通常是目标的重要特征点或轮廓点,包括但不限于人体关节、面部特征点、车辆零部件等。通过对关键点的标注,可以为后续的目标跟踪…

19. 算法之分治算法

1. 概念 分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果&#xff…

微信小程序开发(1)

10分钟入门 - 微信小程序开发 微信小程序详细教程 小程序简介 小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。 小程序技术发展史 WeixinJSBridge.invoke(imagePreview, { 2. current: http://i…

大数据之路书摘:走近大数据——从阿里巴巴学习大数据系统体系架构

文章目录 1.数据采集层2.数据计算层3.数据服务层4.数据应用层 在大数据时代,人们比以往任何时候更能收集到更丰富的数据。但是如果不能对这些数据进行有序、有结构地分类组织和存储,如果不能有效利用并发掘它,继而产生价值,那么它…

SNMP软件及性能监控

SNMP(Simple Network Management Protocol)是一种用于网络管理的协议。通过SNMP,我们可以监测和管理网络设备、服务器等重要设备的性能和状况,从而确保网络的正常运行。但在开始使用之前,需要进行配置,以便…

计算机未来五年最吃香的4个职位,对女生超级友好!

今年计算机毕业的学弟学妹对于找工作感觉到非常焦虑,不知道该哪个方向就业才有出路。很多同学感觉在学校好像什么都学了,又好像什么都没学到,先不说企业会不会招,自己就连投简历的勇气都没有,生怕大把的简历投出去就石…

怎么买美股?有哪些美股购买常见问题?

美股市场是全球最大的股票市场,也是全球最受投资者关注的市场之一。许多投资者都想参与其中,但不知道如何买美股。上文中已经扩列了美股购买的基本规则,继续为大家分享美股购买常见问题的相关知识要点。更深入的认识美股交易。 美股购买常见问…

组装电子产品,如何避免SMT虚焊?

组装电子产品的工厂,主要包括两条生产线:SMT表面组装和DIP插件组装。SMT是把电子元件通过设备,贴到PCB线路板上面,然后通过炉子(一般是指回流焊炉)加热,把元件通过锡膏焊接固定到PCB板上&#x…

【C++】STL的deque容器

目录 3.1deque构造函数 3.2deque赋值操作 3.3deque大小操作 3.4deque插入 3.5deque删除 3.6deque数据存取 3.7deque排序操作 deque(双端队列)是double-ended queue 的一个不规则缩写。deque是具有动态大小的序列容器,可以在两端&#…

遗传算法[GA]

遗传算法 遗传算法 (Genetic Algorithm,GA) 是模拟生物在自然环境中的遗传和进化的过程而形成的自适应 全局优化搜索算法。 遗传算法借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种并行、高效、全局搜索的方法, 它能在搜索过程中自动获取和积累…

centos直接部署express

centos直接部署express 以下是在CentOS上部署Express应用程序的一般步骤: 1.安装Node.js 在CentOS系统上安装Node.js。可以使用以下命令安装Node.js: sudo yum install nodejs2.安装npm 安装完Node.js后,还需要安装npm(Node.…

数据库原理与应用第7章作业

数据库原理与应用第7章作业 一. 单选题(共10题,40分)二. 填空题(共3题,15分)三. 简答题(共1题,15分)四. 论述题(共2题,30分) 一. 单选…