[小应用]GD32F103+MPU9150 四轴飞行器第一步:9DOF姿态融合

[复制链接]
楼主: zkcaptain
手机看帖
扫描二维码
随时随地手机跟帖
jayelva2003| | 2014-6-13 11:25 | 显示全部楼层
zkcaptain 发表于 2014-6-12 09:20
单步调DMP有时候是有问题,感觉起来好像是单步调会错过DMP内部的一些东西,最好设断点调,中间不要停顿, ...

楼主,我想问下对于转到90度产生奇异点的状况可以消除吗?

使用特权

评论回复
zkcaptain|  楼主 | 2014-6-13 11:31 | 显示全部楼层
jayelva2003 发表于 2014-6-13 11:25
楼主,我想问下对于转到90度产生奇异点的状况可以消除吗?

可以,但是我不会

使用特权

评论回复
bpp15802963098| | 2014-6-13 11:37 | 显示全部楼层
zkcaptain 发表于 2014-6-13 10:09
把你compass部分的代码贴出来吧

这部分代码我就没改,还是你传的那个

使用特权

评论回复
zkcaptain|  楼主 | 2014-6-13 12:37 | 显示全部楼层
bpp15802963098 发表于 2014-6-13 11:37
这部分代码我就没改,还是你传的那个

那你看见那个Dalay没有?看见后面的注释没有?
Delay(33000);                   //这俩句之间的延迟至少24000(72mhz下),至少33000(108Mhz下)

使用特权

评论回复
bpp15802963098| | 2014-6-13 21:06 | 显示全部楼层
zkcaptain 发表于 2014-6-13 12:37
那你看见那个Dalay没有?看见后面的注释没有?
Delay(33000);                   //这俩句之间的延迟至少24000(72mhz下) ...

楼主,我的是84M,Delay(54000)都不行
 i2cwrite(MPU9150_Addr, User_Ctrl, 1, data_write+6);//关闭MPU9150的I2C_MASTER模式,必须要有这句,写入0x00
Delay(54000);            //这俩句之间的延迟至少24000
i2cwrite(MPU9150_Addr, Bypass_Enable_Cfg, 1, data_write+7);

使用特权

评论回复
申继鹏| | 2014-6-14 10:47 | 显示全部楼层
楼主,可以具体讲讲pid算法么?看了你之前的帖子,说的比较笼统,看不明白。网上也有好多资料,也看的云里雾里的。现在就差pid控制这块了

使用特权

评论回复
bpp15802963098| | 2014-6-15 14:44 | 显示全部楼层
申继鹏 发表于 2014-6-14 10:47
楼主,可以具体讲讲pid算法么?看了你之前的帖子,说的比较笼统,看不明白。网上也有好多资料,也看的云里 ...

你用的是楼主的这个程序吗

使用特权

评论回复
zkcaptain|  楼主 | 2014-6-16 10:00 | 显示全部楼层
bpp15802963098 发表于 2014-6-13 21:06
楼主,我的是84M,Delay(54000)都不行

慢慢往上加,如果你磁力计没问题,I2C没问题,慢慢增加这个值磁力计读数就会通,像上面说的,这种方法比较笨,你还是用我上面给你贴的代码吧,那也是我现在用的

使用特权

评论回复
zkcaptain|  楼主 | 2014-6-16 10:17 | 显示全部楼层
申继鹏 发表于 2014-6-14 10:47
楼主,可以具体讲讲pid算法么?看了你之前的帖子,说的比较笼统,看不明白。网上也有好多资料,也看的云里 ...

这块目前我用的标准的PID,能飞,但是效果不好,还在慢慢改善,以后会发上来的。

以下解释只针对标准的PID:
标准的PID,就是围绕着一个核心来运算,那就是<“角度的期望值expect”和“传感器给出的姿态角measured”的差e(t)>
1.其中角度的期望值就是遥控给出的信号,这个信号你也可以理解为:一般都包含pitch、roll、yaw和油门,当然准确的来说不能这么表达,由于遥控给到MCU里面都是PWM高电平的持续时间t,所以要将t乘以一个你自己定义的系数,来将t转化为角度;

2.而传感器给出的姿态角就是欧拉角了;

由以上两条就能得出e(t)=expect-measured,然后对e(t)进行PID运算即可,具体的控制性能,就看你PID算法和PID参数怎么弄了

使用特权

评论回复
jayelva2003| | 2014-6-16 10:55 | 显示全部楼层
请问下楼主,你是否使用DMP来配置过姿态运动的中断?

使用特权

评论回复
zkcaptain|  楼主 | 2014-6-16 11:13 | 显示全部楼层
jayelva2003 发表于 2014-6-16 10:55
请问下楼主,你是否使用DMP来配置过姿态运动的中断?

没有

使用特权

评论回复
jayelva2003| | 2014-7-4 12:41 | 显示全部楼层
zkcaptain 发表于 2014-6-13 08:51
代码都给你了,还怎么说流程?

楼主,紧急求助啊!我之前在stm32f103上把DMP都调好了,角度也输出了。今天把板子拿出来再试一下的时候,发觉最初的初始化函数mpu_init有时通得过,有时通不过,通不过的时候我加断点看过,在执行到这个函数的i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, &(data[0])就失败了。即使mpu_init通过的情况,程序执行到dmp_load_motion_driver_firmware()也失败。
  我的程序没有改过,板子也没有动过,而且换了几块板子都是这样,请问下楼主这到底会是什么情况?

使用特权

评论回复
zkcaptain|  楼主 | 2014-7-4 15:12 | 显示全部楼层
jayelva2003 发表于 2014-7-4 12:41
楼主,紧急求助啊!我之前在stm32f103上把DMP都调好了,角度也输出了。今天把板子拿出来再试一下的时候, ...

加大I2C的延迟函数试试,你给的信息太笼统了

使用特权

评论回复
jayelva2003| | 2014-7-4 15:40 | 显示全部楼层
zkcaptain 发表于 2014-7-4 15:12
加大I2C的延迟函数试试,你给的信息太笼统了

已经解决了,是外部中断的问题。
还想问下,楼主配置过MPU9150的中断吗?就是有运动状态就产生中断

使用特权

评论回复
jayelva2003| | 2014-7-11 09:55 | 显示全部楼层
楼主,又打扰了不好意思。我想问下gyro_orientation是旋转矩阵吗?是用来确定板子的方位的吗?如果板子的方位不同是不是就要修改这个数组?具体的原理我不是很明白,我是直接用楼主代码里的设置,然后板子水平放置时候好像是可以的(Z轴朝天,Y轴朝前,X轴朝右),算出来的三个角度也正常。如果我现在把板子垂直放置(好比把手机竖直屏幕对着自己放置),这种情况下,gyro_orientation应该怎么设置?

使用特权

评论回复
zkcaptain|  楼主 | 2014-7-11 12:27 | 显示全部楼层
jayelva2003 发表于 2014-7-11 09:55
楼主,又打扰了不好意思。我想问下gyro_orientation是旋转矩阵吗?是用来确定板子的方位的吗?如果板子的方 ...

gyro_orientation只针对陀螺仪,可以改变陀螺仪xyz的方向,accel mag的方向需要自己手动去改。
gyro_orientation是3x3的矩阵,第一列代表x轴,第二列代表y轴,第三列代表z轴
{ 0, 1, 0,
-1, 0, 0,
  0, 0, 1};
就表示gyro的xy轴互换,且交换后的x'轴反向,也就是说将(x y z)变成了(y' -x' z),z轴不变

使用特权

评论回复
copar| | 2014-7-11 14:42 | 显示全部楼层
mark

使用特权

评论回复
kfliuyan| | 2014-7-28 11:46 | 显示全部楼层
收藏下

使用特权

评论回复
kfliuyan| | 2014-7-29 11:45 | 显示全部楼层
:lol膜拜呀

使用特权

评论回复
kyozc| | 2014-8-29 08:43 | 显示全部楼层
看到 这么好一篇关于四轴的帖子,真是谢谢楼主对我们新手的指导。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则