0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

驱动LSM6DS3TR-C实现高效运动检测与数据采集(5)----姿态解算

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-11-14 10:11 次阅读

概述

lsm6ds3trc包含三轴陀螺仪与三轴加速度计。

姿态有多种数学表示方式,常见的是四元数,欧拉角,矩阵和轴角。他们各自有其自身的优点,在不同的领域使用不同的表示方式。在四轴飞行器中使用到了四元数和欧拉角。

姿态解算选用的旋转顺序为ZYX,即IMU坐标系初始时刻与大地坐标系重合,然后依次绕自己的Z、Y、X轴进行旋转:

绕IMU的Z轴旋转:航向角yaw

绕IMU的Y轴旋转:俯仰角pitch

绕IMU的X轴旋转:横滚角row

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

由于需要解析姿态角,故将陀螺仪速度修改快一点。

视频教学

[https://www.bilibili.com/video/BV1MP411i7gy/]

样品申请

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

完整代码下载

[https://download.csdn.net/download/qq_24312945/87942703]

欧拉角

横滚角φ:机体绕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;   //偏移太大,等我找一个好用的

}

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据采集
    +关注

    关注

    38

    文章

    4523

    浏览量

    112313
  • 运动检测
    +关注

    关注

    0

    文章

    25

    浏览量

    12522
  • 姿态解算
    +关注

    关注

    0

    文章

    48

    浏览量

    8191
收藏 人收藏

    评论

    相关推荐

    驱动LSM6DS3TR-C实现高效运动检测数据采集(1)----获取ID

    本文将介绍如何驱动和利用LSM6DS3TR-C传感器,实现精确的运动感应功能。LSM6DS3TR-C是一款先进的6轴惯性测量单元(IMU),
    的头像 发表于 11-13 15:45 986次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(1)----获取ID

    lsm6ds3tr-c传感器集合模式无法使用的原因?

    _FUNC_CFG_ACCESS, 0x80, 2);//第一外部I2C从接口的地址,写0x58,读0x59bsp_spi_write(LSM6DS3TR_SLV0_ADD, 0x58, 2);//即将写入_读取的寄存器
    发表于 03-07 06:26

    LSM6DS3TR-C使用时工作电流比datasheet上大很多是什么原因?

    使用场景是LSM6DS3TR-C通过SPI一拖四连接单片机,一共有四路这样的一拖四。 测试时发现电流很大,感觉有点不对,编写程序使LSM6DS3TR-C间隔5s一个一个使能,会发现稳压源的输出电流从
    发表于 03-07 08:08

    请问LSM6DS3TRLSM6DS3TR-C两个型号能否完全兼容?

    LSM6DS3TR停产买不到了,准备切换LSM6DS3TR-C型号使用。 请问两者有什么差别?能否直接替换?有成功替换案例吗?
    发表于 03-14 06:40

    LSM6DS3TR-C数据读取异常是安利的问题?怎么处理?

    我在使用lsm6ds3tr-c 6轴传感器时发现,读取的温度以及角速度值异常,配置为官方lsm6ds3tr_c_read_data_polling.c文件中
    发表于 03-19 08:15

    LSM6DS3TR-C长时间读取后角速度输出为0是什么原因造成的?

    LSM6DS3TR-C 长时间读取后角速度输出为0
    发表于 03-20 06:28

    LSM6DS3TR-C角速度输出为0是什么原因导致的?

    LSM6DS3TR-C在长时间休眠后(6小时以上),角速度输出为0,短时间休眠输出正常,这是什么问题?
    发表于 03-21 06:27

    LSM6DS3TR-C的FIFO读取数据出错是什么原因造成的?怎么解决?

    使用LSM6DS3TR-C的FIFO,先获取了FIFO的WaterM标志,该标志置位之后再去获取当前存在FIFO缓存的数据长度,再去读取FIFO中对应长度的数据,会出现读取数据出错的现
    发表于 03-27 06:05

    怎么使用LSM6DS3进行活动检测

    你好我正在使用LSM6DS3进行活动检测.WAKE_UP_SRC寄存器的SLEEP_STATE_IA位用于监视活动/不活动,但我注意到该位的值保持不变(即,当检测到睡眠
    发表于 05-10 15:11

    LSM6DS3TR-C的低功耗模式和高性能模式有什么区别

    如果我只在 12.5Hz 下操作加速度计,LSM6DS3TR-C 的低功耗模式和高性能模式有什么区别?
    发表于 12-09 06:47

    MEMS LSM6DSD/LSM6DS3/LSM6DSO是否比LSM6DSR具有更好的“抗冲击性”?

    DSO数据表中“对机械冲击的高鲁棒性使得LSM6DS3TR-C 系统首选设计师创造和制造可靠的产品..”测试时,我们观察到 LSM6DSD 和 LSM6DS3 的“抗冲击性”优于
    发表于 02-02 09:21

    LSM6DS3的应用笔记

    专门设计,可在硬件上实现大幅运动检测、倾斜度检测、硬件计步功能、时间戳,并支持对外部磁力计的数据采集,且支持铁磁校准 (硬铁修正,软铁修正)。LSM
    发表于 09-13 08:23

    驱动LSM6DS3TR-C实现高效运动检测数据采集(2)----配置滤波器

    LSM6DS3TR-C中,加速度计和陀螺仪可以独立地开启/关闭,并且可以拥有不同的ODR和功耗模式。 LSM6DS3TR-C有三种可用的操作模式: ● 仅加速度计活动,陀螺仪处于断电状态 ● 仅陀螺仪活动,加速度计处于断电状态 ● 加速度计和陀螺仪传感器同时活动
    的头像 发表于 11-14 09:45 378次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(2)----配置滤波器

    驱动LSM6DS3TR-C实现高效运动检测数据采集(3)----获取传感器数据

    一旦传感器被正确初始化,可以通过SPI或I2C接口向传感器发送读取命令,并接收传感器返回的数据。这个读取过程包括获取LSM6DS3TR传感器提供的加速度计和陀螺仪数据,以及传感器对应的温度信息。
    的头像 发表于 11-14 09:59 292次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(3)----获取传感器<b class='flag-5'>数据</b>

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

    LSM6DS3TR-C是单芯片“3轴陀螺仪 + 3轴加速度计”的惯性 测量单元(IMU), 五种种可选满量程的陀螺仪(125/250/500/1000/2000 dps)和加速度计(2/4/8/16
    的头像 发表于 11-14 10:05 370次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(4)----上报匿名上位机<b class='flag-5'>实现</b>可视化