姿态解算(四)四元数 - 姿态解算步骤

本文详细介绍使用四元数进行无人机飞行姿态解算的过程。包括四元数获取、惯性单元测量值融合、误差消除、欧拉角转换及姿态控制等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四元数 - 姿态解算

在前面我们介绍了旋转的表示方法
以及,四元数的定义与几何意义

我们要获得无人机的飞行姿态必须把姿态传感器获取的数据,表示为我们上面说过的几种方式,我们在这里介绍用四元数来进行姿态解算的方法和相关知识:
我们首先来了解一下姿态解算的步骤:

1 获取四元数

  1. 首先我们要获取四元数,这里我们利用龙格库塔公式求四元数的q0~q3,需要这个周期的角速度gx,gy,gz和周期时间deltaT
    (注:四元数可以初始化为q0=1,q1、q2、q3=0):
    这里写图片描述
    这里是一阶龙格库塔公式更新四元数的理解:(为什么通过角速度gx,gy,gz和周期时间deltaT可以更新四元数)
    这里写图片描述
    这里写图片描述

2 惯性单元测量值融合

  1. 惯性单元测量值融合:四轴上安装陀螺仪,可以测量四轴倾斜的角度,由于陀螺仪输出的是四轴的角速度,不会收到四轴振动影响。因此该信号中噪声很小。四轴的角度又是通过对角速度积分而得,这可进一步平滑信号,从而使得角度信号更加稳定。因此四轴控制所需要的角度和角速度可以使用陀螺仪所得到的信号。通过上面的公式获取四元数的值是存在误差的,这个误差的主要来源于,三轴陀螺仪获取角速度信息,是要经过积分运算的,这个过程存在微小的误差,经过积分运算之后,就会形成积累误差。随时间延长而逐步增加,最终导致无法形成正确的角度信号;

3 如何消除误差呢?

  1. 如何消除误差呢?可以通过上面的加速度传感器获得的角度信息对此进行校正。利用加速度计所获得的角度信息与陀螺仪积分后的角度进行比较,叫比较的误差信号进过比例放大后与陀螺仪输出的角速度信号叠加之后在进行积分。对于加速度计给定的角度,经过比例、积分环节之后产生的角度必然等于加速度计所获得的角度。由于加速度计获得的角度信息不会存在积分误差,所以最终将输出角度中的积累误差消除了。但是加速度计所产生的角度信号中会叠加很强的四轴运动加速度噪声信号,为了避免给信号对于角度的影响,因此比例系数应该非常小。这样加速度的噪声信号经过比例、积分后,在输出角度信息中就会非常小了。由于存在积分环节,所以无论比例系数多么小,最终输出的角度必然与加速度计测量的角度相等,只是这个调节过程会随着比例系数的减小而延长。

4 得到欧拉角

  1. 进行完消除误差的处理之后,我们利用四元数的方向余弦矩阵和欧拉角的关系得到欧拉角。这里我们把程序的思路整理一下:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

5 欧拉角法和旋转矢量法介绍

  1. 为什么用四元数求解姿态呢?这里有一点关于欧拉角法和旋转矢量法的介绍:
    这里写图片描述

6 姿态控制

  1. 最后利用 PID 等相关控制算法进行无人机飞行姿态控制。(会在下一篇文章中介绍)。
    四元数的几何意义
获取四元数需要知道加速度和角速度的值,一般情况下,我们可以通过传感器获取加速度和角速度的值。以下是获取四元数的C语言代码示例: ```c #include <math.h> void getQuaternion(float q[4], float ax, float ay, float az, float gx, float gy, float gz) { // 加速度和角速度的值需要经过处理,例如进行单位转换等。 // 然后使用以下代码计四元数: float norm; float vx, vy, vz; float ex, ey, ez; float qa, qb, qc; // 计重力加速度的模长 norm = sqrt(ax * ax + ay * ay + az * az); // 将加速度三轴值归一化,得到加速度方向向量 ax /= norm; ay /= norm; az /= norm; // 计旋转向量 vx = 2.0f * (q[1] * gz - q[2] * gy); vy = 2.0f * (q[2] * gx - q[0] * gz); vz = 2.0f * (q[0] * gy - q[1] * gx); // 计误差向量 ex = (ay * vz - az * vy); ey = (az * vx - ax * vz); ez = (ax * vy - ay * vx); // 比例积分调节,计四元数微小变化 qa = q[0] + 0.5f * (-q[1] * gx - q[2] * gy - q[3] * gz); qb = q[1] + 0.5f * ( qa * gx + q[2] * gz - q[3] * gy); qc = q[2] + 0.5f * ( qa * gy - q[1] * gz + q[3] * gx); q[3] = q[3] + 0.5f * ( qa * gz + q[1] * gy - q[2] * gx); // 四元数归一化 norm = sqrt(qa * qa + qb * qb + qc * qc + q[3] * q[3]); q[0] = qa / norm; q[1] = qb / norm; q[2] = qc / norm; q[3] = q[3] / norm; } ``` 在上面的代码中,`q[4]`是四元数数组,`ax`、`ay`、`az`、`gx`、`gy`、`gz`是加速度和角速度的值。在计四元数之前,需要先进行加速度和角速度的处理,使其符合计要求。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值