终于特么的考完试了。。。。终于大三也结束了。。。终于特么地变成大四狗了......
看来好多直播的帖子。。。各种详细的焊接步骤、程序代码都有
所以我很惆怅我该写些什么,想了想,一方面因为我焊了三年东西了。。。这种直插焊接过于简单。。略了。。
另一方面因为STM32实在过于熟悉。。。所以那些个什么工程建立。。PWM驱动程序。。也略了。。
所以我想写一点数学,但是数学估计没人想看,而且我这个人又懒,什么东西就算学会了,也真的懒得总结出来,算了,能坚持到什么时候就什么时候吧
四轴的一个难点在于姿态检测,说到这就不得不提到卡尔曼滤波。
早在1795年,C.F.Gauss为测定行星运行轨道,提出了最小二乘法,最小二乘法的最优指标是估计量测的均方误差最小,没有考虑到被估参数的统计特性;R.A.Fisher于1912年提出最大似然估计法,他从概率密度的角度考虑估计问题,但这种方法没有考虑到先验信息;上世纪40年代,N.Wiener为解决火力控制系统的精确跟踪问题,提出了一种频域设计方法——维纳滤波,该方法的适用范围有限,要求信号一维平稳;1960年,R.E.Kailman提出卡尔曼滤波器,它是一种时域滤波方法,采用状态空间描述系统,算法采用递推机制,数据存储量小,可以处理多维和非平稳过程。
总之,卡尔曼滤波是在离散空间下的最小均方误差准则滤波器,其滤波需要建立较准确的系统和观测模型(最初的卡尔曼滤波不仅要求系统是线性的,并且要求量测方程也是线性的,后人研究了其在非线性条件下的推广,提出了EKF、UKF和CMKF),在每个递推周期中,卡尔曼滤波器需要完成对被估计量的时间更新和量测更新两个过程,时间更新方程旨在实现对系统状态的先验估计,测量方程用于组合先验估计和量测值以获得后验估计,这点有点像贝叶斯估计,即系统决策依赖于后验,而后验又取决于先验和样本。
下面我们用板子采集MPU6050的六轴数据,看看效果,顺便发个冷知识,估计知道的人不多,就是怎么通过仿真器把数据从ARM抓到PC上,这样就免去串口这种又慢又麻烦的方法了。
在DEBUG下,当数据已经采集到ARM的内存中后,暂停CPU运行,点击DEBUG->FUNCTION EDITOR
出现INI的编译窗口,
我们处理数据由于是在MATLAB下进行的,所以直接printf按照MATLAB格式输出到txt文件 复制到MATLAB直接用
FUNC void SaveData(void) { int idx; int N; exec("log > MyData.log"); N=1024; printf("T_X = ["); for (idx = 0; idx < N; idx++) { printf("%d,",T_X[idx]); } printf("];\n"); printf("T_Y = ["); for (idx = 0; idx < N; idx++) { printf("%d,",T_Y[idx]); } printf("];\n"); printf("T_Z = ["); for (idx = 0; idx < N; idx++) { printf("%d,",T_Z[idx]); } printf("];\n"); printf("G_X = ["); for (idx = 0; idx < N; idx++) { printf("%d,",G_X[idx]); } printf("];\n"); printf("G_Y = ["); for (idx = 0; idx < N; idx++) { printf("%d,",G_Y[idx]); } printf("];\n"); printf("G_Z = ["); for (idx = 0; idx < N; idx++) { printf("%d,",G_Z[idx]); } printf("];\n"); exec("log off"); }
按照已经建立好的状态空间模型,我们在MATLAB中处理这段6轴数据,得到融合角度。
P=[0 0;0 0]; H=[1 dt;0 1]; T=[dt 0;0 dt]; Q=[0.01 0;0 0.001]; R=[0.03 0;0 0.03]; Klm_Angle_X(i) = Klm_Angle_X(i-1) + bias(i-1) * dt; %先验计算 bias(i) = GYR_X(i); P=H*P*H'+T*Q*T'; K=P/(P+R); %卡尔曼增益计算 Klm_Angle_X(i)=Klm_Angle_X(i)+K(1,1)*(Angle_X_Acc(i)-Klm_Angle_X(i))+K(1,2)*(GYR_X(i)-bias(i)); %状态预测 bias(i)=bias(i)+K(2,1)*(Angle_X_Acc(i)-Klm_Angle_X(i))+K(2,2)*(GYR_X(i)-bias(i)); P=P-K*P;
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |