三轴陀螺仪解算姿态(四元数)

这篇具有很好参考价值的文章主要介绍了三轴陀螺仪解算姿态(四元数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理

三轴陀螺仪可以测量载体在三个轴上的角速度分量,对这些角速度进行积分就可以得到旋转的角度,应用到载体上就可以得到载体的姿态。

方法

假设导航坐标系为东北天,载体坐标系为右前上。

初始载体坐标系和导航坐标系重合,对应的四元数为q=[1,0,0,0],使用此四元数表示载体在导航坐标系下的旋转

三轴陀螺仪测量的三个角速度分量可以合成一个角速度向量,可以理解为载体绕着这个角速度向量进行旋转,旋转的角度为角速度向量模的积分。

g y r o → = [ ω x b ω y b ω z b ] \overrightarrow{gyro}=\begin{bmatrix} \omega_{xb} \\ \omega_{yb} \\ \omega_{zb} \end{bmatrix} gyro = ωxbωybωzb 为陀螺仪测得的载体旋转的角速度向量,时间间隔为 d t dt dt,则旋转向量为

ω b → = [ ω x b ω y b ω z b ] ⋅ d t \overrightarrow{\omega_{b}} =\begin{bmatrix} \omega_{xb} \\ \omega_{yb} \\ \omega_{zb} \end{bmatrix} \cdot dt ωb = ωxbωybωzb dt

将其转换到导航坐标系
ω n → = q ⊗ ω b → ⊗ q ∗ \overrightarrow{\omega_{n}}=q\otimes\overrightarrow{\omega_{b}}\otimes q^{*} ωn =qωb q

其中 ω n → \overrightarrow{\omega_{n}} ωn 为旋转轴, ∣ ω n → ∣ \left | \overrightarrow{\omega_{n}} \right | ωn 为旋转的角度 θ \theta θ,转换成四元数为

q ′ = [ sin ⁡ ( θ 2 ) ω → ⋅ sin ⁡ ( θ 2 ) ] q^{'}= \begin{bmatrix} \sin(\frac{\theta}{2}) & \overrightarrow{\omega} \cdot \sin(\frac{\theta}{2})\\ \end{bmatrix} q=[sin(2θ)ω sin(2θ)]

其中 ω n → \overrightarrow{\omega_{n}} ωn 需要归一化,将其应用到初始四元数即可得到当前姿态的四元数
q = q ′ ⊗ q q = q^{'} \otimes q q=qq

以下是使用Eigen3的代码示例

#include "Eigen/Core"
#include "Eigen/Geometry"
#include <cmath>

// 陀螺仪测量数据
float gyro[3];

// 初始四元数
Eigen::Quaternionf quaternion = Eigen::Quaternionf(1.0f, 0.0f, 0.0f, 0.0f);

while (1) {
	// 读取陀螺仪数据,单位mdegree/s
	read_data(gyro);

	// 转为向量,单位degree/s
	Eigen::Vector3f gyroscope = Eigen::Vector3f(gyro[0] / 1000.0f, gyro[1] / 1000.0f, gyro[2] / 1000.0f);

	// 时间间隔dt,单位s
    float dt = get_dt() / 1000.0f;
    
    // 角速度向量,单位rad/s
    Eigen::Vector3f omega = gyroscope * M_PI / 180.0f * dt;
    
    // 转换到导航坐标系
    omega = quaternion.toRotationMatrix() * omega;
    
    // 旋转角度
    float theta = omega.norm();
	// 旋转对应的四元数
    omega = omega.normalized() * std::sin(theta / 2.0f);
    Eigen::Quaternionf q = Eigen::Quaternionf(std::cos(theta / 2.0f), omega.x(), omega.y(), omega.z());

	// 应用旋转
    quaternion = (q * quaternion).normalized();
}

陀螺仪可以解算出载体的俯仰角、滚转角和偏航角,但是因为积分的原因,误差会进行积累,时间一长姿态就会不准确。文章来源地址https://www.toymoban.com/news/detail-451321.html

到了这里,关于三轴陀螺仪解算姿态(四元数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 陀螺仪与加速度计的姿态融合——互补滤波

    本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。 阅读本文需有一定的知识基础,可以参见作者以前MPU6050的两篇文章:《MPU6050陀螺仪和加速度计数据的获取和校准》、《MPU6050官方DMP的移植和使用》,以及了解

    2024年02月03日
    浏览(37)
  • 【QT】OpenGL显示六轴陀螺仪3D实时姿态

    https://blog.csdn.net/qq_35629971/article/details/126203543?spm=1001.2014.3001.5506 新建一个qt的空白工程,附带UI界面,我的工程名称就叫my_3d UI界面可以可以放一些自己想要的按键、文本或者其他控件。这个不影响3D效果的展示,这些控件都会展示在3D效果图的上层,不会被3D效果覆盖 首先我们

    2024年02月02日
    浏览(35)
  • [Android]将实时获取的加速度计、陀螺仪、磁场数据通过卡尔曼滤波,转换为手机的姿态角

    由于需要实时获取传感器数据,我们可以使用Android系统提供的SensorManager类来获取加速度计、陀螺仪和磁场传感器的数据。然后,我们可以将这些数据传递给一个卡尔曼滤波器对象进行滤波。 以下是一段示例代码: 在这个示例代码中,我们注册了对加速度计、陀螺仪和磁场传

    2024年02月17日
    浏览(39)
  • STM32无人机-四轴四元数姿态解算与卡尔曼滤波

    MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。 什么是四元数 这部分很难,新手知道四元数的功能是将 6 轴传感器数据转化为三轴姿态角度数据即可。 四元数解算程序店家已经封装成一个函数,输入 MPU6050 数值,解算周

    2024年02月03日
    浏览(35)
  • 【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

     效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

    2024年04月14日
    浏览(62)
  • Android使用陀螺仪

    在Android应用中使用陀螺仪可以帮助实现各种功能,比如游戏控制、虚拟现实体验、运动追踪等。以下是使用Android陀螺仪的基本步骤: 获取传感器服务 : 首先,需要获取设备上的陀螺仪传感器服务。可以通过 SensorManager 类来获取。 注册监听器 : 使用 SensorManager 注册一个陀

    2024年04月26日
    浏览(27)
  • 平衡小车——陀螺仪

    可以通过MPU6050获取加速度信息 可以通过DMP库获取角度信息 MPU6050 MPU6050是一种常用的集成电路(IC),结合了3轴陀螺仪和3轴加速度计。它用于各种需要运动跟踪和感应的电子项目和设备。MPU6050由英飞凌科技公司(InvenSense)制造,现在已被TDK收购。它的一些主要特点包括:

    2024年02月02日
    浏览(32)
  • 陀螺仪MPU6050(IIC&源码)

    1. 陀螺仪 1.1   什么是陀螺仪? 检测角度变化的一个装置。 1.1.1  有什么用?? 用于检测角度变化,用角度变化的值判断物体的运动轨迹。 1.1.2  我们怎么用? 我们是使用这个装置(或者说设备)获取到数据,再使用这个数据得到我们想要的信息。 这里我使用陀螺仪获取板

    2024年02月13日
    浏览(34)
  • 陀螺仪小车(Forerake-Car)

    项目简介:搭建一辆有arduino UNO 与rnf24l01组成的小车;手部安装由arduino nano开发板、nrf24l01、imu构成的手势控制器,利用手势控制器检测手部状态、发送信号对小车进行前进,实现基于卡尔曼滤波的MPU6050姿态结算。 如果你想搭建一辆有Arduino UNO和nRF24L01组成的小车,并使用手势

    2024年02月14日
    浏览(72)
  • 课题学习(十九)----Allan方差:陀螺仪噪声分析

       Allan方差是一种分析时域数据序列的方法,用于测量振荡器的频率稳定性。该方法还可用于确定系统中作为平均时间函数的本征噪声。该方法易于计算和理解,是目前最流行的识别和量化惯性传感器数据中存在的不同噪声项的方法之一。该方法的结果与适用于惯性传感器

    2024年01月22日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包