请问得到四元数后怎么计算YAW ROLL PITCH

本文探讨了从四元数计算YAW、ROLL、PITCH姿态角的方法,基于一个AHRS更新算法示例,讨论了四元数的归一化处理及积分误差比例积分增益调整。

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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

请问得到四元数后怎么计算YAW,ROLL,PITCH? 

[复制链接]
  

24

主题

0

好友

139

积分

注册会员

Rank: 2

莫元
127
跳转到指定楼层
1楼
  发表于 2012-7-5 21:32:54  | 只看该作者  | 倒序浏览
我用这个程序得到了四元数,怎么进一步计算姿态YAW,ROLL,PITCH?
//----------------------------------------------------------------------------------------------------
// Header files

#include "AHRS.h"
#include <math.h>

//----------------------------------------------------------------------------------------------------
// Definitions

#define Kp 2.0f                        // 比例增益支配收敛率accelerometer/magnetometer
#define Ki 0.005f                // 积分增益执政速率陀螺仪的衔接gyroscopeases
#define halfT 0.5f                // 采样周期的一半

//---------------------------------------------------------------------------------------------------
// Variable definitions

float q0 = 1, q1 = 0, q2 = 0, q3 = 0;        // 四元数的元素,代表估计

方向
float exInt = 0, eyInt = 0, ezInt = 0;        // 按比例缩小积分误差

//====================================================================================================
// Function
//====================================================================================================

void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) {
        float norm;
        float hx, hy, hz, bx, bz;
        float vx, vy, vz, wx, wy, wz;
        float ex, ey, ez;

        // 辅助变量,以减少重复操作数
        float q0q0 = q0*q0;
        float q0q1 = q0*q1;
        float q0q2 = q0*q2;
        float q0q3 = q0*q3;
        float q1q1 = q1*q1;
        float q1q2 = q1*q2;
        float q1q3 = q1*q3;
        float q2q2 = q2*q2;   
        float q2q3 = q2*q3;
        float q3q3 = q3*q3;          
        
        // 测量正常化
        norm = sqrt(ax*ax + ay*ay + az*az);       
        ax = ax / norm;
        ay = ay / norm;
        az = az / norm;
        norm = sqrt(mx*mx + my*my + mz*mz);          
        mx = mx / norm;
        my = my / norm;
        mz = mz / norm;         
        
        // 计算参考磁通方向
        hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
        hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
        hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);         
        bx = sqrt((hx*hx) + (hy*hy));
        bz = hz;        
        
        //估计方向的重力和磁通(V和W)
        vx = 2*(q1q3 - q0q2);
        vy = 2*(q0q1 + q2q3);
        vz = q0q0 - q1q1 - q2q2 + q3q3;
        wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);
        wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);
        wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2);  
        
        // 错误是跨产品的总和之间的参考方向的领域和方向测量传感器
        ex = (ay*vz - az*vy) + (my*wz - mz*wy);
        ey = (az*vx - ax*vz) + (mz*wx - mx*wz);
        ez = (ax*vy - ay*vx) + (mx*wy - my*wx);
        
        // 积分误差比例积分增益
        exInt = exInt + ex*Ki;
        eyInt = eyInt + ey*Ki;
        ezInt = ezInt + ez*Ki;
        
        // 调整后的陀螺仪测量
        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt;
        
        // 整合四元数率和正常化
        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;
}

//====================================================================================================
// END OF CODE
//====================================================================================================
 
  

7

主题

1

好友

331

积分

中级会员

Rank: 3Rank: 3

莫元
315
2楼
  发表于 2012-7-6 08:13:22  | 只看该作者

这里有讲

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

 
 
  

7

主题

1

好友

331

积分

中级会员

Rank: 3Rank: 3

莫元
315
3楼
  发表于 2012-7-6 10:59:20  | 只看该作者
这段话很奇怪:
  1.         // 正常化四元
  2.         norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
  3.         q0 = q0 / norm;
  4.         q1 = q1 / norm;
  5.         q2 = q2 / norm;
  6.         q3 = q3 / norm;
复制代码
  • 既然精度都是float,为什么用sqrt?用sqrtf啊。
  • 除法一般比乘法慢很多,应该把除法移到第一句。
  • 单位化向量有“超级快速”的算法(刚刚才发现的),见平方根倒数速算法
 
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值