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

[复制链接]
楼主: zkcaptain
手机看帖
扫描二维码
随时随地手机跟帖
caojintao| | 2014-8-31 13:50 | 显示全部楼层
原来要注册登录才能看见图片和附件啊!

使用特权

评论回复
grace75| | 2014-8-31 20:44 | 显示全部楼层
很赞!

使用特权

评论回复
haolaishi| | 2014-8-31 23:17 | 显示全部楼层
这个东西给力

使用特权

评论回复
dwliangzhen| | 2014-9-10 10:37 | 显示全部楼层
mark  谢谢

使用特权

评论回复
diycainiao| | 2014-9-16 18:22 | 显示全部楼层
在来个原理图就好了,我等菜鸟也能跟着玩了就!

使用特权

评论回复
程序会不会| | 2014-9-25 22:49 | 显示全部楼层

最近在看楼主写的四轴程序,有很多不了解的地方  想请教大家
在初始化四元数的函数 void init_quaternion(void)里
里面有这几句
init_Roll = -atan2(init_ax, init_az);    //算出的单位是弧度,如需要观察则应乘以57.295780转化为角度
init_Pitch=  asin(init_ay);              //init_Pitch = asin(ay / 1);      
init_Yaw  =  atan2(init_mx*cos(init_Roll) + init_my*sin(init_Roll)*sin(init_Pitch) + init_mz*sin(init_Roll)*cos(init_Pitch),
                    init_my*cos(init_Pitch) - init_mz*sin(init_Pitch));//类似于atan2(my, mx),其中的init_Roll和init_Pitch是弧度        

请问这几句是什么意思呢?是有什么公式吗?
init_Roll。init_Pitch。init_Yaw这三个参数是原始状态的欧拉角吗?如果是的话是不是就是说 通过传感器读过来的数据就可以直接算出欧拉角了?如果能直接算出欧拉角的话,为什么下面还要用四元数来计算欧拉角呢?直接算欧拉角不就行了  想不明白,望指教 谢谢

使用特权

评论回复
zkcaptain|  楼主 | 2014-9-26 09:34 | 显示全部楼层
程序会不会 发表于 2014-9-25 22:49
最近在看楼主写的四轴程序,有很多不了解的地方  想请教大家
在初始化四元数的函数 void init_quaternion ...

飞机起飞前总要确定自己的方位,这段代码就是求起飞前方位的,让飞机知道自己起飞前处于什么状态,重点不是init_Roll。init_Pitch。init_Yaw,而是下面的q0 q1 q2 q3

使用特权

评论回复
程序会不会| | 2014-9-26 11:52 | 显示全部楼层
zkcaptain 发表于 2014-9-26 09:34
飞机起飞前总要确定自己的方位,这段代码就是求起飞前方位的,让飞机知道自己起飞前处于什么状态,重点不 ...

init_Roll这三个参数就是飞机起飞前的初始状态,应该就是初始的欧拉角,请楼主看看我提出的几个问题,麻烦您帮忙一一解答下!另外MPU6050的DMP好像能直接读出四轴的欧拉角,是不是就是说不需要用四元数法求出对应的欧拉角,直接从传感器读过来的欧拉角应该直接拿来进行运算了!

使用特权

评论回复
icelandwolf| | 2014-9-28 20:30 | 显示全部楼层
密切关注中

使用特权

评论回复
白丁野老| | 2014-9-29 07:46 | 显示全部楼层
Mark!

使用特权

评论回复
wo4wuhuiting| | 2014-9-30 09:25 | 显示全部楼层
这必须是技术贴啊,向楼主学习了》。。

使用特权

评论回复
lilyhei| | 2014-11-12 10:41 | 显示全部楼层
楼主,我用你的AHRS的代码其他一切都正常,只是Yaw角在变化后会回到260这个值上面,求解决方案

使用特权

评论回复
lilyhei| | 2014-11-12 10:56 | 显示全部楼层
楼主,我想问个问题:就是用你的AHRS代码后得出Yaw值,但Yaw在变化之后会回到一个固定值,请问是什么原因?

使用特权

评论回复
评论
无为之益 2017-9-14 17:41 回复TA
我也遇到同样的问题,请问你最后是怎样解决的啊?谢谢 
zkcaptain|  楼主 | 2014-11-12 14:21 | 显示全部楼层
lilyhei 发表于 2014-11-12 10:56
楼主,我想问个问题:就是用你的AHRS代码后得出Yaw值,但Yaw在变化之后会回到一个固定值,请问是什么原因? ...

仔细对照帖子还有我代码里的注释说明并检查初始化四元数和AHRS融合后的欧拉角计算公式是否正确,实在找不到原因可以上代码,并说明自己硬件的情况,轴向等。
你这种情况我没遇到过,需要你详细说明

使用特权

评论回复
评论
无为之益 2017-9-14 17:44 回复TA
不知道如何解决... 
无为之益 2017-9-14 17:43 回复TA
你的意思是,只要程序正确,就不会出现这个问题,是吗?可是我的项目也出现这个问题,只有yaw会回到某固定值,其他的都正常。 
zkcaptain|  楼主 | 2014-11-12 15:00 | 显示全部楼层
程序会不会 发表于 2014-9-26 11:52
init_Roll这三个参数就是飞机起飞前的初始状态,应该就是初始的欧拉角,请楼主看看我提出的几个问题,麻 ...

欧拉角有万向节锁死的特性,所以不能直接用欧拉角来表示物体旋转

mpu6050输出的欧拉角可以用

使用特权

评论回复
hechuan94| | 2014-11-20 20:55 | 显示全部楼层
mpu9150和mpu6050应该是一样,用DMP库就直接能得出欧拉角啊!难道是得出里面6050的欧拉角,其中航向角没有通过磁阻罗盘的修正?

使用特权

评论回复
hechuan94| | 2014-11-20 21:33 | 显示全部楼层
还有一个问题就是你这个磁阻罗盘的校准只是水平的校准,没有考虑倾斜角度的校准。校准三维的是一个球体,要加上加速度计一起校准。

使用特权

评论回复
whoyzf| | 2014-12-22 15:20 | 显示全部楼层
多谢楼主的帖子。  另外想问个问题,这个初始化欧拉角的公式的来源是?请问有哪些文献里有讲吗?

使用特权

评论回复
whoyzf| | 2014-12-22 16:55 | 显示全部楼层
楼主请问下,你的代码中:初始化欧拉角和四元数解算欧拉角前的正负号为什么是不一样的,以及这个正负号的确定原理?

//陀螺仪y轴为前进方向   
init_Roll = -atan2(init_ax, init_az);    //算出的单位是弧度,如需要观察则应乘以57.3转化为角度
init_Pitch=  asin(init_ay);              //init_Pitch = asin(ay / 1);      
init_Yaw  =  atan2(init_mx*cos(init_Roll) + init_my*sin(init_Roll)*sin(init_Pitch) + init_mz*sin(init_Roll)*cos(init_Pitch),
                   init_my*cos(init_Pitch) - init_mz*sin(init_Pitch));//类似于atan2(my, mx),其中的init_Roll和init_Pitch是弧度
if(init_Yaw < 0){init_Yaw = init_Yaw + 2*3.141593;}
if(init_Yaw > 360){init_Yaw = init_Yaw - 2*3.141593;}                        

///*由四元数计算出Pitch  Roll  Yaw
//乘以57.3是为了将弧度转化为角度*/
        Yaw   = -atan2(2*q1*q2 - 2*q0*q3, -2 * q1 * q1 - 2 * q3 * q3 + 1) * 57.3;  //偏航角,绕z轴转动        
    if(Yaw < 0 ){Yaw = Yaw + 360;}
        if(Yaw > 360 ){Yaw = Yaw - 360;}
        Pitch = asin(2*q2*q3 + 2*q0*q1) * 57.3; //俯仰角,绕x轴转动         
    Roll  = -atan2(-2*q0*q2 + 2*q1*q3, -2 * q1 * q1 - 2 * q2* q2 + 1) * 57.3; //滚动角,绕y轴转动

使用特权

评论回复
zkcaptain|  楼主 | 2014-12-22 17:01 | 显示全部楼层
whoyzf 发表于 2014-12-22 15:20
多谢楼主的帖子。  另外想问个问题,这个初始化欧拉角的公式的来源是?请问有哪些文献里有讲吗? ...

那个公式都是些基本的数**算,只需要空间想象能力,因为当机体放在地上静止时,你不能保证机体与地平面是绝对平行的,肯定是有一定的倾角,因此要计算初始化欧拉角,比如init_roll和init_pitch可以通过重力的不同分量计算出来:
另重力单位为g,重力方向垂直于地面,在机体静止时,init_roll和init_pitch可以通过重力在加速度计xyz轴上的3个分量计算出来。
而init_yaw仅指水平方向的角度,因此无法通过加速度计单独算出来,因为重力在水平方向分量为0,但是init_yaw可以通过加速度计和磁力计结合算出来,比如init_yaw=arctan(my/mx),那么由于机体不是绝对水平,因此my和mx肯定不是磁力计直接输出的那个my和mx,而是磁力计输出的my、mx与加速度计结合后的数值。

使用特权

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

本版积分规则