OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9183|回复: 10

STM32F030FX MPU6050姿态融合算法

[复制链接]

4

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2012-5-8
在线时间
19 小时
发表于 2020-5-29 01:16:34 | 显示全部楼层 |阅读模式
10金钱
测试了网上找到的姿态融合算法代码(如下所示),调试发现q0,q1,q2,q3四元数据始终为0,运算后的pitch,roll,yaw这3个姿态角也是0比较怀疑是不是 float q0 = 1, q1 = 0, q2 = 0, q3 = 0 初始值不对?另外IMUupdate函数参数((float gx, float gy, float gz, float ax, float ay, float az)
是直接读取的MPU6050的陀螺仪角度,加速度数据。


以下是测试的姿态融合解算代码:

#define Kp                         10.0f                        // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki                         0.008f                // integral gain governs rate of convergence of gyroscope biases
#define halfT         0.001f                // half the sample period采样周期的一半

float q0 = 1, q1 = 0, q2 = 0, q3 = 0;                // quaternion elements representing the estimated orientation
float exInt = 0, eyInt = 0, ezInt = 0;        // scaled integral error
float norm;

extern float pitch,roll,yaw;       

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{
        //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;

        if (ax*ay*az == 0)
                return;

        norm = sqrt(ax*ax + ay*ay + az*az);//acc数据归一化

        ax = ax/norm;
        ay = ay/norm;
        az = az/norm;

        // estimated direction of gravity and flux (v and w)估计重力方向和流量/变迁
        vx = 2*(q1q3 - q0q2);//四元素中xyz的表示
        vy = 2*(q0q1 + q2q3);
        vz = q0q0 - q1q1 - q2q2 + q3q3 ;

// error is sum of cross product between reference direction of fields and direction measured by sensors
        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;

        // adjusted gyroscope measurements
        gx = gx + Kp*ex + exInt;//将误差PI后补偿到陀螺仪,即补偿零点漂移
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt;//这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减

        // integrate quaternion rate and normalise   //四元素的微分方程
        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;
       
        // normalise quaternion
        norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
        q0 = q0 / norm;
        q1 = q1 / norm;
        q2 = q2 / norm;
        q3 = q3 / norm;

        yaw   = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1)* 57.3;                 // yaw
        pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;                                                                                                                                         // pitch
        roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;         // roll
}





还请做过的朋友们指点指点,多谢了~

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2016-4-9
在线时间
96 小时
发表于 2020-6-11 13:47:01 | 显示全部楼层
四元素初始值没问题,   IMu的数据传过来了吗
回复

使用道具 举报

4

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2012-5-8
在线时间
19 小时
 楼主| 发表于 2020-6-17 00:54:06 | 显示全部楼层
1723068930wm 发表于 2020-6-11 13:47
四元素初始值没问题,   IMu的数据传过来了吗

有传过来,直接读取的6050的寄存器的数值
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-7-13
在线时间
2 小时
发表于 2020-7-13 12:17:57 | 显示全部楼层
仿真,打断点看下数据
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2020-7-16
在线时间
16 小时
发表于 2020-7-28 09:43:26 | 显示全部楼层
楼主解决了吗?可以分享一下代码吗?
回复

使用道具 举报

4

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2012-5-8
在线时间
19 小时
 楼主| 发表于 2020-7-28 16:55:22 | 显示全部楼层
梦忆 发表于 2020-7-28 09:43
楼主解决了吗?可以分享一下代码吗?

没有呢..
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-6-1
在线时间
4 小时
发表于 2020-9-25 17:04:59 | 显示全部楼层
norm为0会不会导致分母为零出现非法数据
回复

使用道具 举报

2

主题

65

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2016-5-21
在线时间
238 小时
发表于 2020-9-28 00:57:17 | 显示全部楼层
为啥不用原子哥的程序?
回复

使用道具 举报

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
发表于 2021-1-20 21:17:15 来自手机 | 显示全部楼层
我也是这样楼主问题解决了么
回复

使用道具 举报

13

主题

66

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2021-1-9
在线时间
41 小时
发表于 2021-1-20 21:53:01 | 显示全部楼层
楼主问题解决了么,我也用这个代码,现象和你一样
回复

使用道具 举报

5

主题

133

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1765
金钱
1765
注册时间
2015-3-13
在线时间
269 小时
发表于 2022-10-10 17:12:13 来自手机 | 显示全部楼层
楼主的问题解决了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-11 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表