打印

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

[复制链接]
楼主: zkcaptain
手机看帖
扫描二维码
随时随地手机跟帖
361
采用AHRSupdate进行解算,貌似在大角度动作。比如把机子翻转过来后,发现收敛好慢,就是要过一会才能到达实际的角度。难道也是磁力计不好用的原因吗?

使用特权

评论回复
362
whoyzf| | 2015-4-5 13:02 | 只看该作者
我做的是小四轴,我感觉我开动电机,磁力计的数据就有手套的变化,导致解算出来的姿态就有好大的变动,貌似不能用了。

使用特权

评论回复
363
zkcaptain|  楼主 | 2015-4-7 09:00 | 只看该作者
whoyzf 发表于 2015-4-4 11:06
init_Pitch=  asin(init_ay);              //init_Pitch = asin(ay / 1);      
那这个式子可能是有问题 ...

重力加速度的误差还是那句话,根据个人需求来,在别人的基础上针对自己的情况做改进是更好的。

电机离传感器近,对磁力计有影响,需要滤波或算法补偿,要不然就不用磁力计

使用特权

评论回复
364
shenmu2012| | 2015-4-9 20:11 | 只看该作者
MPU9150(INVENSENSE公司的,单芯片内集成了加速度计、陀螺仪和磁力计,并且内置DMP用于姿态融合,不过只融合了加速度计和陀螺仪,具有自校准功能。

使用特权

评论回复
365
comeon201208| | 2015-4-10 21:38 | 只看该作者
该分享非常不错的。

使用特权

评论回复
366
bingo2015| | 2015-4-21 20:52 | 只看该作者
楼主,我有个问题想问。
最近在做毕业设计,用惯性传感器(9轴数据)来检测物体运动轨迹,也就是得到姿态矩阵后进行加速度变换,从b系到n系。a-v-s(积分积分)
四元数求解用的四阶龙格库塔法,姿态矩阵求解应该没问题,感觉问题出在了加速度变换上面,加速度变换后出错(很离谱,静止放置时b系加速度在0左右,变换后蹭蹭蹭往上长),导致位移计算不出来,楼主大概知道是哪方面的原因吗?
我用的matlab处理的数据,诚心求解。

使用特权

评论回复
367
as3016007| | 2015-4-29 19:27 | 只看该作者
这个帖子写得太好了,找了好久这样的好帖,赞

使用特权

评论回复
368
xiuhao| | 2015-5-5 20:45 | 只看该作者
zhangxuefei 发表于 2015-2-11 10:28
我用的MPU6050+HMC5883L做姿态采集,不做飞行器,卡尔曼滤波,目前还没做完,谢谢您的分享,学习了 ...

你好 我现在在做航向角仪 请问你用卡尔曼滤波的航向角如何?能否分享一下代码?

使用特权

评论回复
369
xiuhao| | 2015-5-5 21:16 | 只看该作者
楼主你好,我现在在用mpu9150在做姿态,然后我的陀螺仪和加计读数读正确,但磁力计读数感觉有问题,Id能读出,低8位数据读出来也会随着转动而变化,但高8位要么是0要么是255,感觉这不对。我的磁力计代码如下:
void READ_AK8975(void)
{       
       
  Single_Write(MPU6050_Addr,USER_CTRL, 0x00);
delay_ms(3);       
  Single_Write(MPU6050_Addr,INT_PIN_CFG, 0x02);

Single_Write(AK8975_I2C_ADDR,AK8975_CNTL, 0x01); //不加这句无法连续读数
                 
BUF[0]=Single_Read(AK8975_I2C_ADDR,AK8975_HXL);
BUF[1]=Single_Read(AK8975_I2C_ADDR,AK8975_HXH);
MX=(BUF[1]<<8)|BUF[0];
         
BUF[2]=Single_Read(AK8975_I2C_ADDR,AK8975_HYL);
BUF[3]=Single_Read(AK8975_I2C_ADDR,AK8975_HYH);
MY= (BUF[3]<<8)|BUF[2];
         
BUF[4]=Single_Read(AK8975_I2C_ADDR,AK8975_HZL);
BUF[5]=Single_Read(AK8975_I2C_ADDR,AK8975_HZH);
MZ=(BUF[5]<<8)|BUF[4];
         
Single_Write(MPU6050_Addr,USER_CTRL, 0x20);
delay_ms(3);
Single_Write(MPU6050_Addr,INT_PIN_CFG, 0x00);          
}

按照这个写的:
读取顺序:
1.关闭MPU9150的I2C_MASTER模式
2.延迟2ms左右
3.开启bypass

4.读取compass数据

5.开启MPU9150的I2C_MASTER模式
6.延迟2ms左右
7.关闭bypass

以上这个顺序我试了很多遍,少1条都不行,不知道为什么,有时候虽然

少其中1条可以读,但是过一会或者晃一晃数据就不变了。。

第2、6条这个延迟你可以试,找到最小的延迟时间。官方库里给的是3ms

延迟,但是我觉得1.5ms就够了,2ms比较安全

延时我也试着增大,但不管用。

使用特权

评论回复
370
zkcaptain|  楼主 | 2015-5-6 13:02 | 只看该作者
xiuhao 发表于 2015-5-5 21:16
楼主你好,我现在在用mpu9150在做姿态,然后我的陀螺仪和加计读数读正确,但磁力计读数感觉有问题,Id能读 ...

你这个方法跟我最开始用的方法一样,中间那个延迟要大概2ms以上才行,后来我觉得这个方法不安全,而且读取磁力计的速率慢,我就换了另外一种方法,见楼主位代码。
我个人也感觉mpu9150集成的这个磁力计有问题,同样的代码不同的mpu9150很有可能读数据出错,不知道为啥。它这个磁力计是一个裸die叠封进去的,不知道会不会有影响,他们公司之后的产品我就没关注过了。

使用特权

评论回复
371
zkcaptain|  楼主 | 2015-5-6 13:03 | 只看该作者
bingo2015 发表于 2015-4-21 20:52
楼主,我有个问题想问。
最近在做毕业设计,用惯性传感器(9轴数据)来检测物体运动轨迹,也就是得到姿态矩 ...

你这个问题我也不会。

使用特权

评论回复
372
xiuhao| | 2015-5-6 13:17 | 只看该作者
zkcaptain 发表于 2015-5-6 13:02
你这个方法跟我最开始用的方法一样,中间那个延迟要大概2ms以上才行,后来我觉得这个方法不安全,而且读 ...

我今天改成了这个,然后还是高8位数据要么是0,要么是是255,也不知道数据是对是错(要怎样检验读出来的数据呢?),然后我沿一个轴(mpu9150的z轴)转动,发现只有x轴数据在0到+-200多之前变动,y 和z 基本是在一个很小的范围内波动(这种情况理论下不是应该xy轴的数据变化,而z不变的么?).还有,没有公式可以将数据转化为角度的(不融合数据)?我用时hmc5883是用这公式:angle=atan2((double)MZ,(double)MX) * (180 / 3.14159265) + 180,算出来还是挺准的; 现在用ak9875用这条公式就行不通了。

void READ_AK8975(void)
{       
        char temp[1];
        Single_Write(AK8975_I2C_ADDR,AK8975_CNTL, 0x01);
        delay_ms(10);
        temp[0]=Single_Read(AK8975_I2C_ADDR,AK8975_ST1);
        if(temp[0] == 1)
        {
         BUF[14]=Single_Read(AK8975_I2C_ADDR,AK8975_HXL);
         BUF[15]=Single_Read(AK8975_I2C_ADDR,AK8975_HXH);
         MX=(BUF[15]<<8)|BUF[14];
         BUF[16]=Single_Read(AK8975_I2C_ADDR,AK8975_HYL);
         BUF[17]=Single_Read(AK8975_I2C_ADDR,AK8975_HYH);
         MY= (BUF[17]<<8)|BUF[18];
         BUF[18]=Single_Read(AK8975_I2C_ADDR,AK8975_HZL);
         BUF[19]=Single_Read(AK8975_I2C_ADDR,AK8975_HZH);
         MZ=(BUF[19]<<8)|BUF[18];
}
         Single_Write(AK8975_I2C_ADDR,AK8975_CNTL, 0x01);
       
}

使用特权

评论回复
373
xfjade| | 2015-5-7 14:09 | 只看该作者
本帖最后由 xfjade 于 2015-5-7 14:26 编辑
zkcaptain 发表于 2015-5-6 13:02
你这个方法跟我最开始用的方法一样,中间那个延迟要大概2ms以上才行,后来我觉得这个方法不安全,而且读 ...

楼主您好,看帖子您讨论了磁力计校正的方法,后续有没有再关注跟进磁力计更好的校准方法呢?我按空间绕8字多次,得到的X,Y,Z轴数据最大最小值差异很大,每次得到的差值也不一样,怎么能够判断磁力计旋转时得到了最大最小值?是否完全校准?非常感谢

使用特权

评论回复
374
xiuhao| | 2015-5-20 16:46 | 只看该作者
lz 想问下你是如何消除加速度计的外力加速度的?也就是机体会振动,还会向其他方向有加速度,这时候解算出来的pitch roll 误差会很大吧?不知lz有没有使用什么算法来解决这么问题呢?

使用特权

评论回复
375
whoyzf| | 2015-5-20 19:04 | 只看该作者
楼主,你有做到气压定高吗?

使用特权

评论回复
376
as_733| | 2015-6-2 16:30 | 只看该作者
我看这个手册,精度蛮好的,可是实际做出来的精度是多少,不知道大家测过没有。
加速度的精度,
陀螺仪的精度,
电子罗盘的精度,
或者说得出的欧拉角的精度是多少??

使用特权

评论回复
377
whoyzf| | 2015-6-9 11:06 | 只看该作者
zkcaptain 发表于 2014-4-1 10:32
这些方法我现在不用了,到时候更新代码的时候再一起放上来。
灵敏度和偏置都要校准,并且要空间上校准 ...

楼主你好,你的磁力计校正方法来自哪个文献呢?

使用特权

评论回复
378
方小川99| | 2015-6-11 19:50 | 只看该作者
楼主你好,我现在9150独处raw data后ahrs结算之后的yaw一开始就是130+,有时170+,没办法我只好让它先结算个15s,然后把这时的欧拉角当作target,请问该怎么解决这个问题?

使用特权

评论回复
379
czq624589971| | 2015-6-13 16:15 | 只看该作者
非常感谢楼主的分享:lol

使用特权

评论回复
380
此胜不幻| | 2015-7-4 20:23 | 只看该作者
谢谢楼主分享

使用特权

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

本版积分规则