【捷联惯导】 有点小成就,四轴起飞指日可待。
本帖最后由 qwe2231695 于 2013-4-27 11:20 编辑最近在写飞控程序,花了几天时间在坛里学习四元素和捷联惯导。
今天在stm32上写好了框架,坛里大侠的:捷联惯导心得帖子果然是有货的!移植好这个DMP fitter以后,仔细调了一下参数。
发现其实就是一个平衡滤波+PID+四元数的算法,短短30行的代码句句都是公式的精华。
写了一个简单的VB上位机,是以前本人做平衡车用剩的。发现效果比传说中的卡尔曼简单易用好调试。
图中绿色线是加速度测量曲线,在静止状态下做横滚测试,没有运动加速度,可以视为真实角度。可以发现:红色的滤波器输出曲线能反应出角度(贴合绿色线)
在后面部分,做了测试轴上的满量程运动加速度叠加,发现滤波器很好的过滤了运动加速度。 期待楼主给我们带来惊喜~ :) 楼主头像深深刺痛了我! 如果是运动起来以后,有加速、转弯、机体震动,那时候再看看这效果怎么样 关注,留个名先. 430504 发表于 2013-4-27 09:11 static/image/common/back.gif
楼主头像深深刺痛了我!
理解了捷联惯导之后就不用分了。这东西有点高深,俺没看懂 楼主说的 DMP fitter是不是论坛里的 imu.c 这个算法?? 济南电子爱好者 发表于 2013-5-1 10:36 static/image/common/back.gif
楼主说的 DMP fitter是不是论坛里的 imu.c 这个算法??
是的。就是imu.c qwe2231695 发表于 2013-5-1 11:32 static/image/common/back.gif
是的。就是imu.c
支持楼主,有个问题还望楼主指点迷津~
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
这个函数的参数
gx gy gz, 是陀螺仪直接读出来的数据,还是转换成了实际角速度数据?
ax ay az,是加速度计直接读出来3个轴的数据吗?
初次接触四轴,希望大神点拨~~ 关注下,以后应该能用到 关注下。 你好!我在做自动跟踪天线,想了解下捷联惯导,有偿求助,我QQ 490912416 谢谢 这个运动加速度 加速度计能检测出来吗,不是只能检测重力加速度吗 rantingting 发表于 2013-5-24 11:47 static/image/common/back.gif
这个运动加速度 加速度计能检测出来吗,不是只能检测重力加速度吗
这个是MEMS三轴加速度计,不是重力加速度计。要是真的有纯粹的重力加速度计就好了。 qwe2231695 发表于 2013-5-24 12:25 static/image/common/back.gif
这个是MEMS三轴加速度计,不是重力加速度计。要是真的有纯粹的重力加速度计就好了。 ...
是我搞错了吗,现在的加速度计不是只能通过检测重力加速度吗,要不怎么能计算角度呢,还请帮忙解释下 rantingting 发表于 2013-5-24 13:05 static/image/common/back.gif
是我搞错了吗,现在的加速度计不是只能通过检测重力加速度吗,要不怎么能计算角度呢,还请帮忙解释下 ...
当物体静止时可以得到角度,因为测量轴上只有重力加速度的值。但是运动的时候,会有运动加速度叠加进去。所以就不完全可信了。就像你带着他坐电梯(或者坐赛车),电梯(赛车)启动和停止的时候度数不再是重力值(测量轴不完全重合的时候是重力加速度的分量),而是和电梯的运动有关了。 qwe2231695 发表于 2013-5-24 13:18 static/image/common/back.gif
当物体静止时可以得到角度,因为测量轴上只有重力加速度的值。但是运动的时候,会有运动加速度叠加进去。 ...
好的,学习恶劣,我需要再详细了解了解,一直还是认为只能检测到重力加速度 qwe2231695 发表于 2013-5-24 13:18 static/image/common/back.gif
当物体静止时可以得到角度,因为测量轴上只有重力加速度的值。但是运动的时候,会有运动加速度叠加进去。 ...
非常正确。。。。。。。。 一直对楼主表示关注 济南电子爱好者 发表于 2013-5-1 10:36 static/image/common/back.gif
楼主说的 DMP fitter是不是论坛里的 imu.c 这个算法??
弱弱的问一句,这个imu.c是? 好帖子总是要顶顶家收藏的 楼主飞起来了吧?
imu.c代码是在哪个帖子呀?
9楼提的问题很有意思,我也很想知道
RE: 【捷联惯导】 有点小成就,四轴起飞指日可待。
aki_studio 发表于 2013-6-30 11:17 static/image/common/back.gif楼主飞起来了吧?
imu.c代码是在哪个帖子呀?
9楼提的问题很有意思,我也很想知道 ...
飞起来了,屌丝回去学习自控原理去了。学好挑战MIT。
IMU.c 大致就是这个: gx单位为度秒, ax单位为牛米平方秒
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{
float qq0=0, qq1=0, qq2=0, qq3=0;
float norm;
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;
halfT=(float)time; //得到采样时间
gx*=0.0174;gy*=0.0174;gz*=0.0174;//转换为弧度
// 单位化四元数 取模
norm = sqrtf(ax*ax + ay*ay + az*az);
ax = ax /norm;
ay = ay / norm;
az = az / norm;
// 估计方向的重力
vx = 2*(q1q3 - q0q2);
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3 ;
// 误差和方向传感器测量参考方向之间的交叉乘积的总和
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;
// 调整后的陀螺仪测量
gx = gx + Kp*ex + exInt;
gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt;
qq0=q0;qq1=q1;qq2=q2;qq3=q3;
q0 = qq0 + (-qq1*gx - qq2*gy - qq3*gz)*halfT;
q1 = qq1 + (qq0*gx + qq2*gz - qq3*gy)*halfT;
q2 = qq2 + (qq0*gy - qq1*gz + qq3*gx)*halfT;
q3 = qq3 + (qq0*gz + qq1*gy - qq2*gx)*halfT;
// // 整合四元数率和正常化
// 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;
//四元数与欧拉角转换公式
Q_ANGLE.Pitch= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;
Q_ANGLE.Rool = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;
Q_ANGLE.Yaw= atan2(2 * q2 * q1 + 2 * q0 * q3, -2 * q3 * q3 - 2 * q2* q2 + 1)* 57.3;
}
多谢分享,mark了
我炸了2套桨之后,就停滞不前了,改天再来看{:lol:} qwe2231695 发表于 2013-6-30 11:46 static/image/common/back.gif
飞起来了,屌丝回去学习自控原理去了。学好挑战MIT。
IMU.c 大致就是这个: gx单位为度秒, ax单位为牛 ...
这个源码,貌似在哪里看到过…… rantingting 发表于 2013-7-2 14:09 static/image/common/back.gif
这个源码,貌似在哪里看到过……
是的,哪里都有,平衡车,各种开源四轴。现在有升级版的了,还没有移植{:dizzy:} qwe2231695 发表于 2013-6-30 11:46 static/image/common/back.gif
飞起来了,屌丝回去学习自控原理去了。学好挑战MIT。
IMU.c 大致就是这个: gx单位为度秒, ax单位为牛 ...
你这个算法,航向角是会漂移的啊。没有磁力计的话,单纯用加速度计校正陀螺,只能校正俯仰、滚转方向的陀螺漂移。因为加速度计所反映的只是俯仰、滚转角信息,并不包括航向角。 rock1943 发表于 2013-7-4 11:48 static/image/common/back.gif
你这个算法,航向角是会漂移的啊。没有磁力计的话,单纯用加速度计校正陀螺,只能校正俯仰、滚转方向的陀 ...
是的,我使用磁阻在外面有修正一次了。 发现阿莫的帖子技术含量越来越高了 有用,楼主好人啊 qwe2231695 发表于 2013-6-30 11:46 static/image/common/back.gif
飞起来了,屌丝回去学习自控原理去了。学好挑战MIT。
IMU.c 大致就是这个: gx单位为度秒, ax单位为牛 ...
markimu.c代码 想问下楼主,为什么你滤波后的曲线会超前实际曲线呢?而且滤波后的角度有时居然比实际测的要大?
小伙仔小明 发表于 2013-8-1 11:14 static/image/common/back.gif
想问下楼主,为什么你滤波后的曲线会超前实际曲线呢?而且滤波后的角度有时居然比实际测的要大?
...
原因如下: 1,加速度开启了MPU6050传感器的低通滤波功能反应较慢。2,滤波参数整定没有达到最好,陀螺仪积分过冲。3,你后面那个框表示的两条线的差值,是由于一个轴加速度和角度之间存在三角函数关系。0度 ,90度的时候两条曲线可以吻合,在中间的时候,要经过sin-1计算才能吻合的。 qwe2231695 发表于 2013-8-1 13:00 static/image/common/back.gif
原因如下: 1,加速度开启了MPU6050传感器的低通滤波功能反应较慢。2,滤波参数整定没有达到最好,陀螺仪 ...
嗯我也觉得是参数没整定好。。。这样的波形误差感觉很大。。。 qwe2231695 发表于 2013-7-2 18:40 static/image/common/back.gif
是的,哪里都有,平衡车,各种开源四轴。现在有升级版的了,还没有移植...
楼主,升级版的能不能给个链接或者介绍一下哈? 我也被头像雷到了…… mark……
顶一个… 楼主飞起来了 吗 蓝色の理想 发表于 2013-9-3 19:53 static/image/common/back.gif
楼主飞起来了 吗
飞腻了{:lol:} mark一下 qwe2231695 发表于 2013-9-3 21:36 static/image/common/back.gif
飞腻了
四轴 上面加个倒立摆呢,有没有试过? 高手,请教啊{:loveliness:}{:loveliness:} 真心有用 标记了再说 楼主,你好,我也用的是捷联惯导,滤出的波形效果也和你的差不多,但是控制依然滞后是什么原因呢 好强悍。 网上传的基本上都是IMU.C markimu.c代码 多谢分享 qwe2231695 发表于 2013-6-30 11:46
飞起来了,屌丝回去学习自控原理去了。学好挑战MIT。
IMU.c 大致就是这个: gx单位为度秒, ax单位为牛 ...
楼主,为什么要把屏蔽掉的替换成这样.这两个不一样么??
qq0=q0;qq1=q1;qq2=q2;qq3=q3;
q0 = qq0 + (-qq1*gx - qq2*gy - qq3*gz)*halfT;
q1 = qq1 + (qq0*gx + qq2*gz - qq3*gy)*halfT;
q2 = qq2 + (qq0*gy - qq1*gz + qq3*gx)*halfT;
q3 = qq3 + (qq0*gz + qq1*gy - qq2*gx)*halfT;
// // 整合四元数率和正常化
// 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;
williamzhang533 发表于 2014-2-19 21:40
楼主,为什么要把屏蔽掉的替换成这样.这两个不一样么??
qq0=q0;qq1=q1;qq2=q2;qq3=q3;
结果是差不多的,运算差一步而已。两个都能用。 为什么我用楼主方法做出来的角度,和我用DMP(MPU6050传感芯片)做出来的, 角度值两个比较接近,就是正负相反.
楼主帮我看看哪里出了问题.谢谢!
/*******for angle cal************/
#define Kp 1.0f//2.0f // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki 0.001f//0.005f // integral gain governs rate of convergence of gyroscope biases
#define halfT 0.002f // half the sample period
//float halfT;
//#define qu301073741824.0f
float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;
float exInt = 0, eyInt = 0, ezInt = 0; // scaled integral error
float AcceRatio = 16384.0; //加速度计比例系数
float GyroRatio = 131.0;//16.4;//32.8;// //陀螺仪比例系数
void Get_Tiltangle(void) //4ms 中断调用
{
float norm;
float vx, vy, vz;
float ex, ey, ez;
// if(MPU6050_is_DRY())
// {
MPU6050_getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
gyrox= (gx-mpuoffsetx)/GyroRatio;//*mpukx; // gx单位为度秒, ax单位为牛米平方秒
gyroy= (gy-mpuoffsety)/GyroRatio;//*mpuky;
gyroz= (gz-mpuoffsetz)/GyroRatio;//*mpukz;
accx= ax/AcceRatio;
accy= ay/AcceRatio;
accz= az/AcceRatio;
gyrox*=0.0174;gyroy*=0.0174;gyroz*=0.0174;//转换为弧度
// normalise the measurements单位化四元数 取模
norm = sqrt(accx*accx + accy*accy + accz*accz);
accx = accx / norm;
accy = accy / norm;
accz = accz / 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 = (accy*vz - accz*vy);
ey = (accz*vx - accx*vz);
ez = (accx*vy - accy*vx);
// integral error scaled integral gain
// 积分误差比例积分增益
exInt = exInt + ex*Ki;
eyInt = eyInt + ey*Ki;
ezInt = ezInt + ez*Ki;
// adjusted gyroscope measurements
// 调整后的陀螺仪测量
gyrox = gyrox + Kp*ex + exInt;
gyroy = gyroy + Kp*ey + eyInt;
gyroz = gyroz + Kp*ez + ezInt;
// integrate quaternion rate and normalise
// 整合四元数率和正常化
q0 = q0 + (-q1*gyrox - q2*gyroy - q3*gyroz)*halfT;
q1 = q1 + (q0*gyrox + q2*gyroz - q3*gyroy)*halfT;
q2 = q2 + (q0*gyroy - q1*gyroz + q3*gyrox)*halfT;
q3 = q3 + (q0*gyroz + q1*gyroy - q2*gyrox)*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;
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
Yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;
} williamzhang533 发表于 2014-2-21 14:27
为什么我用楼主方法做出来的角度,和我用DMP(MPU6050传感芯片)做出来的, 角度值两个比较接近,就是正负相反.
...
很正常· 加个符号反过来就行了。也可以将传感器数据反过来,也可以把传感器焊背面{:lol:} qwe2231695 发表于 2014-2-21 16:49
很正常· 加个符号反过来就行了。也可以将传感器数据反过来,也可以把传感器焊背面...
{:lol:} ,非常感谢。我知道,软件加个负号修正,控制板方向方过来安装,都可以解决问题。我只是奇怪怎么就反了呢!研究了很久,没整明白根源。{:handshake:} williamzhang533 发表于 2014-2-21 23:08
,非常感谢。我知道,软件加个负号修正,控制板方向方过来安装,都可以解决问题。我只是奇怪怎么 ...
你把那段程序一个不漏读懂就知道啦,就是四元数坐标转换欧拉角的公式上,自由度很大。所以不要纠结。 今晚继续调试楼主的算法. 在桌面上做水平运动加速的时候,运动方向的倾角有+ -3度的波动误差. 水平运动时,运动方向的倾角应该是保持不变化才合理.
附上调试图:
绿色的是沿X轴运动加速,对应的PITCH有 上下3度波动. 红色是沿Y轴,对应ROLL角波动. 调整KI,KP,HalfT参数,都没效果.不知道楼主是怎么处理这种波动的.
还望指点,非常感谢! williamzhang533 发表于 2014-2-22 19:53
今晚继续调试楼主的算法. 在桌面上做水平运动加速的时候,运动方向的倾角有+ -3度的波动误差. 水平运动时,运 ...
减小内部PI滤波的P,并且一定要保证陀螺仪数据的质量。 qwe2231695 发表于 2014-2-22 20:19
减小内部PI滤波的P,并且一定要保证陀螺仪数据的质量。
非常感谢!楼主的算法很棒,静态误差在0.02以内,动态误差已经减小到+-0.8了.
markimu.c代码 williamzhang533 发表于 2014-2-22 19:53
今晚继续调试楼主的算法. 在桌面上做水平运动加速的时候,运动方向的倾角有+ -3度的波动误差. 水平运动时,运 ...
熟悉的Labview 界面= =后来通过调整P I 参数把运动加速度的影响减小了? 含金量很高的帖子,感谢,收走了{:smile:} 我特别喜欢航模,交流一下 mark!以后慢慢研究 不错,学习了 厉害,我落后了很多啊 我是来学习的。顺便帮楼主顶 楼主有试过不用加速度校正陀螺仪数据,直接用陀螺仪数据去更新四元数?我试着把校正的代码注释了,和没注释的基本一致,开动电机不抖也不漂(过了好几分钟)。。。用的是MPU6050,我还把低通滤波都关了 学习一下,虽然什么都不懂。纯顶! 学习,imu.c 看了一遍,没有看懂,先收藏 {:handshake:} 好贴,必须顶! 为什么我的加速度曲线上下波动很大,没楼主光滑。我也做了平均滤波了。
还有怎么看曲线响应的很好了呢? halfT=(float)time; //得到采样时间
gx*=0.0174;gy*=0.0174;gz*=0.0174;//转换为弧度
请问楼主:为什么陀螺仪角度在这里要转换成弧度呢?? 不明觉厉,顶! 祝一切顺利。。。。 搂住太厉害了,有思路了 马住关注一下,imu,楼主加油 期望自己的四轴早早飞起来 值得学习,谢谢楼主。 楼主的这个IMU算法我也在用,但有个疑问,6050出来的数据是直接进这个函数呢还是滤一下波(均值、卡尔曼之类的),我直接进这个函数,但效果不好 williamzhang533 发表于 2014-2-24 17:39
非常感谢!楼主的算法很棒,静态误差在0.02以内,动态误差已经减小到+-0.8了.
...
你好 你是用imu.c的程序调的么?你是如何提高动态精度的? 捷联导航,留个记号 楼主真厉害,几天就能搞定! 楼主能不能传一份6050完整的代码,调了好几天始终有问题,谢谢了 学习一下 !!! 好贴,学习,帮顶!!! 有没有用mpu6050做惯性动捕的?
页:
[1]