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

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

原理

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

方法

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

初始载体坐标系和导航坐标系重合,对应的四元数为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日
    浏览(46)
  • 【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日
    浏览(42)
  • [Android]将实时获取的加速度计、陀螺仪、磁场数据通过卡尔曼滤波,转换为手机的姿态角

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

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

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

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

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

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

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

    2024年02月02日
    浏览(38)
  • Android使用陀螺仪

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

    2024年04月26日
    浏览(31)
  • 陀螺仪MPU6050(IIC&源码)

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

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

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

    2024年02月14日
    浏览(78)
  • MPU6050六轴陀螺仪外围电路分析

    MPU6050六轴陀螺仪常用的外围电路设计分析 AUX_DA引脚:用于传输辅助数据。通过该引脚,MPU6050可以与外部设备或其他传感器进行数据交换。可以将其他传感器(如磁力计)连接到AUX_DA引脚,以获取额外的数据或实现其他特殊功能。 AUX_CL引脚:用于提供辅助时钟信号。MPU6050可

    2024年01月25日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包