首页 > 试题

磁力把

更新时间:2022-11-16 21:03:10 阅读: 评论:0

同步月考测试卷必修一-她字的来历


2022年11月16日发(作者:dnf2017五一套)

MPU6050获取⾓度理论推导(三)---9轴融合算法

再接着上⼀篇:

姿态⾓解算---互补滤波补充(融合磁⼒计)

前⾯介绍了互补滤波法的算法流程和程序实现,但是仅仅只是融合了三轴加速度计和三轴陀螺仪的数据解算出姿态。

由于机体⽔平时,加速度计⽆法测量绕Z轴的旋转量,即偏航⾓yaw,并且磁⼒计也同样⽆法测得z轴的旋转量。

所以,我们考虑使⽤加速度计和磁⼒计同时对陀螺仪进⾏校正。这次介绍如何融合磁⼒计的数据进⾏姿态解算。

在介绍算法之前,想再提⼀点⾃⼰的感想。很多新⼿⼊门姿态解算算法时,最先接触的就是这个Mahony的互补滤波算法,也相对简单⼀

些。有的⼈觉得数学推导很⿇烦,也不愿意花时间研究代码,懵懵懂懂地把程序复制粘贴过去就随便填了⼏个参数,然后就去看现象。其实

⼤家都知道这种⽅法是不对的吧,没出问题还好,⼀旦出了错就不知所措了。很多时候,飞控出了问题,不⼀定是控制的问题,有时候问题

出在姿态解算上(“⾎与泪”的教训,我当初就是在这个地⽅被坑了很久)。得到了姿态⾓后,先看看波形,看看数据怎么样,滤波器有没

有⽤。(不想⾃⼰写程序和调试的,请⽆视这些。)

这⾥再推荐⼀个很实⽤的⼯具:匿名上位机。功能很强⼤,可以⾃⼰写程序上传数据,在上位机上看波形,⼀切OK之后再进⾏下⼀步的⼯

作。

这是匿名上位机的界⾯的截图,可以到匿名科创的官⽹上下载:

好了,开始介绍算法部分吧!

还是按照这张框图得流程来介绍:

⾸先,假设磁⼒计测量得到的三轴磁场数据为。

为⽅便运算,像此前⼀样,将数据归⼀化之后再进⾏运算。得到载体坐标系b下的标准磁场数据,

其中。

为表⽰简便,将归⼀化之后的数据还是表⽰为。

将这组载体坐标系b下测得的数据旋转到导航坐标系n下,得到。

坐标系的旋转相当于乘以⼀个旋转矩阵。

使⽤以前推导得到的结论,其为四元数表⽰的旋转矩阵:

得到:

假定理想情况下,让导航坐标系n中x轴指向正北⽅向,并设这个新的导航坐标系下磁⼒计数据为。

那么根据⾼中物理知识分析可以知道,Z轴⽅向分量(即重⼒⽅向分量)相等,⽔平⽅向分量相等。则容易得到:

若取y轴指向正北⽅向,则:

取x轴或y轴朝向正北,按照⾃⼰情况定义。我在程序中取的是x轴,所以后⾯使⽤x轴朝正北⽅向的结果来推导。

将磁⼒线在导航坐标系n中的理想输出再次旋转到载体坐标系b中,得到在b系中的理想输出:

将理想输出和原始输出作叉积得到误差e(w),将其作为补偿项送给陀螺仪进⾏校正:

这部分只是⽤来修正YAW轴的,还要加上加速度的校正补偿项,再送给陀螺仪:

附上代码:

#defineKp10.0f//proportionalgaingovernsrateofconvergencetoaccelerometer/magnetometer

#defineKi0.008f//integralgaingovernsrateofconvergenceofgyroscopebias

#definehalfT0.001f//halfthesampleperiod采样周期的⼀半

floatq0=1,q1=0,q2=0,q3=0;//quaternionelementsreprentingtheestimatedorientation

floatexInt=0,eyInt=0,ezInt=0;//scaledintegralerror

voidIMUupdate(floatgx,floatgy,floatgz,floatax,floatay,floataz,floatmx,floatmy,floatmz)

{

floatnorm;

floathx,hy,hz,bx,bz;

floatwx,wy,wz;

floatvx,vy,vz;

floatex,ey,ez;

//先把这些⽤得到的值算好

floatq0q0=q0*q0;

floatq0q1=q0*q1;

floatq0q2=q0*q2;

floatq0q3=q0*q3;

floatq1q1=q1*q1;

floatq1q2=q1*q2;

floatq1q3=q1*q3;

floatq2q2=q2*q2;

floatq2q3=q2*q3;

floatq3q3=q3*q3;

if(ax*ay*az==0)

return;

if(mx*my*mz==0)

return;

norm=sqrt(ax*ax+ay*ay+az*az);//acc数据归⼀化

ax=ax/norm;

ay=ay/norm;

az=az/norm;

norm=sqrt(mx*mx+my*my+mz*mz);//mag数据归⼀化

mx=mx/norm;

my=my/norm;

mz=mz/norm;

//mx=0;

//my=0;

//mz=0;

hx=2*mx*(0.5-q2q2-q3q3)+2*my*(q1q2-q0q3)+2*mz*(q1q3+q0q2);

hy=2*mx*(q1q2+q0q3)+2*my*(0.5-q1q1-q3q3)+2*mz*(q2q3-q0q1);

hz=2*mx*(q1q3-q0q2)+2*my*(q2q3+q0q1)+2*mz*(0.5-q1q1-q2q2);

bx=sqrt((hx*hx)+(hy*hy));

bz=hz;

//estimateddirectionofgravityandflux(vandw)估计重⼒⽅向和流量/变迁

vx=2*(q1q3-q0q2);//四元素中xyz的表⽰

vy=2*(q0q1+q2q3);

vz=q0q0-q1q1-q2q2+q3q3;

wx=2*bx*(0.5-q2q2-q3q3)+2*bz*(q1q3-q0q2);

wy=2*bx*(q1q2-q0q3)+2*bz*(q0q1+q2q3);

wz=2*bx*(q0q2+q1q3)+2*bz*(0.5-q1q1-q2q2);

//errorissumofcrossproductbetweenreferencedirectionoffieldsanddirectionmeasuredbynsors

//ex=(ay*vz-az*vy);//向量外积在相减得到差分就是误差

//ey=(az*vx-ax*vz);

//ez=(ax*vy-ay*vx);

ex=(ay*vz-az*vy)+(my*wz-mz*wy);

ey=(az*vx-ax*vz)+(mz*wx-mx*wz);

ez=(ax*vy-ay*vx)+(mx*wy-my*wx);

exInt=exInt+ex*Ki;//对误差进⾏积分

eyInt=eyInt+ey*Ki;

ezInt=ezInt+ez*Ki;

//adjustedgyroscopemeasurements

gx=gx+Kp*ex+exInt;//将误差PI后补偿到陀螺仪,即补偿零点漂移

gy=gy+Kp*ey+eyInt;

gz=gz+Kp*ez+ezInt;//这⾥的gz由于没有观测者进⾏矫正会产⽣漂移,表现出来的就是积分⾃增或⾃减

//integratequaternionrateandnormali//四元素的微分⽅程

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;

//normaliquaternion

norm=sqrt(q0*q0+q1*q1+q2*q2+q3*q3);

q0=q0/norm;

q1=q1/norm;

q2=q2/norm;

q3=q3/norm;

Q_ANGLE.z=atan2(2*q1*q2+2*q0*q3,-2*q2*q2-2*q3*q3+1)*57.3;//yaw

Q_ANGLE.y=asin(-2*q1*q3+2*q0*q2)*57.3;//pitch

Q_ANGLE.x=atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*57.3;//roll

}

注意:这⾥这个函数我们直接调⽤,的时候需要把原始数据处理⼀下才能使⽤。⾓度

转成弧度/秒

#defineGyro_R0.0010653f//即数据乘以该参数

调⽤该函数的时候:

IMUupdate(floatgx*Gyro_R,floatgy*Gyro_R,floatgz*Gyro_R,

floatax,floatay,floataz,

floatmx,floatmy,floatmz);

本文发布于:2022-11-16 21:03:10,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/33663.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:laif
标签:磁力把
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图