智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 9731|回复: 27
打印 上一主题 下一主题

这段互补滤波的代码你们能看懂么?

  [复制链接]

8

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1813
威望
1289
贡献
344
兑换币
146
注册时间
2013-9-7
在线时间
90 小时
跳转到指定楼层
1#
发表于 2013-11-30 21:57:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

#define Kp 2.0f                        // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki 0.005f                // integral gain governs rate of convergence of gyroscope biases
#define halfT 0.5f                // half the sample period

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

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

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

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az) {
        float norm;
        float vx, vy, vz;
        float ex, ey, ez;         

        // normalise the measurements
        norm = sqrt(ax*ax + ay*ay + az*az);      
        ax = ax / norm;
        ay = ay / norm;
        az = az / norm;      
把加计的三维向量转成单位向量。


        // estimated direction of gravity
        vx = 2*(q1*q3 - q0*q2);
        vy = 2*(q0*q1 + q2*q3);
        vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;


        // error is sum of cross product between reference direction of field and direction measured by sensor
        ex = (ay*vz - az*vy);
        ey = (az*vx - ax*vz);
        ez = (ax*vy - ay*vx);





        // integral error scaled integral gain
        exInt = exInt + ex*Ki;
        eyInt = eyInt + ey*Ki;
        ezInt = ezInt + ez*Ki;

        // adjusted gyroscope measurements
        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt;





        // 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;
}

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

8

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1813
威望
1289
贡献
344
兑换币
146
注册时间
2013-9-7
在线时间
90 小时
2#
 楼主| 发表于 2013-11-30 21:57:50 | 只看该作者
感觉和论坛里普通的互补滤波不太一样啊
回复 支持 反对

使用道具 举报

21

主题

896

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4068
威望
2252
贡献
1296
兑换币
1483
注册时间
2012-7-30
在线时间
260 小时
毕业学校
克莱德大学
3#
发表于 2013-11-30 22:23:58 | 只看该作者
不就是三维的,多了几个叉乘点乘么
回复 支持 反对

使用道具 举报

2

主题

48

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2603
威望
1282
贡献
807
兑换币
851
注册时间
2012-11-2
在线时间
257 小时
毕业学校
华电
4#
发表于 2013-11-30 23:01:36 | 只看该作者
这是 四元数算法 吧  四轴之类的飞控用的多
回复 支持 反对

使用道具 举报

1

主题

243

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4541
威望
2107
贡献
1180
兑换币
1179
注册时间
2012-5-24
在线时间
627 小时
5#
发表于 2013-11-30 23:51:24 | 只看该作者
这是四元数算法,不是互补滤波算法
回复 支持 反对

使用道具 举报

8

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1813
威望
1289
贡献
344
兑换币
146
注册时间
2013-9-7
在线时间
90 小时
6#
 楼主| 发表于 2013-12-1 11:44:59 | 只看该作者
rubick 发表于 2013-11-30 22:23
不就是三维的,多了几个叉乘点乘么

楼下的说这不是互补滤波,到底是不是啊??

感觉和你们常用的那种不一样啊
回复 支持 反对

使用道具 举报

8

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1813
威望
1289
贡献
344
兑换币
146
注册时间
2013-9-7
在线时间
90 小时
7#
 楼主| 发表于 2013-12-1 11:49:53 | 只看该作者
为丞而琳 发表于 2013-11-30 23:51
这是四元数算法,不是互补滤波算法

四元数仅仅是描述姿态的一种方式,不是算法
回复 支持 反对

使用道具 举报

11

主题

194

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4598
威望
2122
贡献
234
兑换币
1571
注册时间
2012-12-8
在线时间
1121 小时
8#
发表于 2013-12-1 15:03:07 | 只看该作者
这个是飞行姿态解算程序啊····四元数来的···不是滤波
回复 支持 反对

使用道具 举报

34

主题

1589

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6271

论坛元老奖章优秀会员奖章活跃会员奖章在线王奖章

威望
3267
贡献
1194
兑换币
2035
注册时间
2012-11-28
在线时间
905 小时
9#
发表于 2013-12-1 16:44:17 | 只看该作者
互补滤波是这样的:陀螺积分角度+=角速度*dt;融合角度=陀螺权值*陀螺积分角度+(1-陀螺权值)*加速度角度;还有一种叫最大梯度法的,就是你发的这段代码

  // integral error scaled integral gain
        exInt = exInt + ex*Ki;
        eyInt = eyInt + ey*Ki;
        ezInt = ezInt + ez*Ki;

        // adjusted gyroscope measurements
        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt;




大概是这样的: 陀螺积分角度+=角速度*dt;角度偏差=加速度角度-陀螺积分角度;融合角度=陀螺角度+衰减系数*角度偏差;用来矫正陀螺本身的静态漂移:角度偏差积分+=角度偏差;角速度=角速度+衰减系数*角度偏差积分;这个就可以一定程度上矫正陀螺的零漂。


回复 支持 反对

使用道具 举报

34

主题

1589

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6271

论坛元老奖章优秀会员奖章活跃会员奖章在线王奖章

威望
3267
贡献
1194
兑换币
2035
注册时间
2012-11-28
在线时间
905 小时
10#
发表于 2013-12-1 16:45:41 | 只看该作者
其实你这个是带有滤波功能的四元素算法!!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 19:38 , Processed in 0.341705 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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