完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我看很多资料多数是四元数处理。例子如下
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az) { float norm; //int16_t Xr,Yr; 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; if(ax*ay*az==0) return; norm = Q_rsqrt(ax*ax + ay*ay + az*az); //acc?????é???? ax = ax *norm; ay = ay * norm; az = az * norm; // estimated direction of gravity and flux (v and w) ????????·??ò???÷??/±??¨ vx = 2*(q1q3 - q0q2);//????????xyz??±í?? vy = 2*(q0q1 + q2q3); vz = q0q0 - q1q1 - q2q2 + q3q3 ; // error is sum of cross product between reference direction of fields and direction measured by sensors ex = (ay*vz - az*vy) ; //?ò?????????à????????·??????ó?? ey = (az*vx - ax*vz) ; ez = (ax*vy - ay*vx) ; exInt = exInt + VariableParameter(ex) * ex * Ki; //???ó????????·? eyInt = eyInt + VariableParameter(ey) * ey * Ki; ezInt = ezInt + VariableParameter(ez) * ez * Ki; // adjusted gyroscope measurements gx = gx + Kp * VariableParameter(ex) * ex + exInt; gy = gy + Kp * VariableParameter(ey) * ey + eyInt; gz = gz + Kp * VariableParameter(ez) * 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 = Q_rsqrt(q0q0 + q1q1 + q2q2 + q3q3); q0 = q0 * norm; q1 = q1 * norm; q2 = q2 * norm; q3 = q3 * norm; qa0 = q0; qa1 = q1; qa2 = q2; qa3 = q3; angle.roll = atan2(2*q2q3 + 2*q0q1, -2*q1q1 - 2*q2q2 + 1); // roll angle.pitch = asin(-2*q1q3 + 2*q0q2); // pitch /* ???????????????????????? */ /*???? http://baike.baidu.com/view/1239157.htm?fr=aladdin */ //Xr = X_HMC * COS(angle.pitch/AtR) + Y_HMC * SIN(-angle.pitch/AtR) * SIN(-angle.roll/AtR) - Z_HMC * COS(angle.roll/AtR) * SIN(-angle.pitch/AtR); //Yr = Y_HMC * COS(angle.roll/AtR) + Z_HMC * SIN(-angle.roll/AtR); //angle.yaw = atan2((double)Yr,(double)Xr) * RtA; // yaw angle.yaw = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * RtA; angle.roll *= RtA; angle.pitch *= RtA; } 但是我发现YAW角度一只在漂移,平均每5秒偏向0.1度左右,我查过很多资料说是MPU6050的一个硬件缺陷,应该用地磁来补偿误差例如HWM5883l,大家的看法的看法是怎么样的? |
|
相关推荐
7个回答
|
|
|
感觉YAW直接用陀螺仪数据积分会挺好的(小四轴)。
|
|
|
|
|
|
mpu6000本来就不是计算航向的,这不算是它的缺陷,陀螺仪本就有温漂。
|
|
|
|
|
|
YAW,那是累计误差吧?要用磁传感器修正的。
|
|
|
|
|
|
mpu6000矫正得好,航向漂移做个业余的完全可以接受。航向要是矫正不好或者处理不完善的话还不如不要磁航向。当然,能处理好,当然是最好了。
|
|
|
|
|
|
额。。一般小四不用罗盘,效果不好。。。
|
|
|
|
|
|
用磁力计又很容易受软磁、硬磁干扰 好难矫正
|
|
|
|
|
|
这个我也没有研究了,呵呵。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
请问下图大疆lightbridge2遥控器主板电源芯片型号是什么?
4871 浏览 1 评论
使用常见的二极管、三极管和mos做MCU和模组的电平转换电路,但是模组和MCU无法正常通信,为什么?
812浏览 2评论
为了提高USIM卡电路的可靠性和稳定性,在电路设计中须注意的点有哪些?
876浏览 2评论
962浏览 2评论
845浏览 2评论
2168浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 00:45 , Processed in 1.193165 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1618