直立车模控制中三种滤波算法简单分析(清华卓晴)

article/2025/9/23 2:29:31

摘自:https://mp.weixin.qq.com/s/WbCh0NFAnsf9y2blQenf7g

让我想起余义的一篇文章也是说到平衡车有三种滤波,我想和卓晴说的是一样的吧。

https://blog.csdn.net/u011992534/article/details/53557984

 

直立车模控制中三种滤波算法简单分析

原创 卓晴 TsinghuaJoking 今天

前几天,有参加智能车竞赛的同学在公众号上询问一个关于直立车模控制中角度融合算法的问题。感觉这是所有初次准备智能车模竞赛的同学都会碰到的问题。

卓大大,请问您可以针对卡尔曼滤波、互补滤波、清华滤波的原理与异同做一个推送吗?最近在查阅相关的资料学习滤波算法,感觉好难理解呀/::<

▲ 平衡双轮自行车

01惯性传感器


在车模直立控制中被广泛使用的惯性传感器通常是由加速度计和陀螺仪组成。价格比较便宜的惯性测量传感器,输出的信号往往包含有各种噪声。陀螺仪输出车模倾角

的变化率(角速度)信号。它通常包括缓慢变化的偏移量和高斯白噪声

其中偏移量的导数是随机的,通常描述为一个白噪声信号:

在重力场中,加速度传感器正交的两个输出,通过求反正切可以传感器相对于重力加速度的倾角。但传感器的运动所产生的加速度也会叠加在输出信号中,进而产生干扰信号。$$\theta _M  = \theta T  + n\theta$$

▲ 采集数据及其显示

通过滤波器算法将陀螺仪和加速度计所得到的角度信息进行融合,最大限度抑制噪声对测量角度的影响。

前面提问中所提到的三种滤波算法,分别利用传感器噪声不同特点来抑制噪声的影响。看似这些方法原理相差很大,借助于以下条件,能够便于我们进行分析和比较:

  • 这三种算法都属于线性滤波算法;

  • 在稳态下,可以借助于输入输出之间的传递函数来比较算法的特性;

  • 针对车模直立控制,所涉及到的角度只有一个;

02三种滤波算法


1.参考滤波方案

在2012年直立车模组别首次引入智能车竞赛的,竞赛秘书处给出了一个 参考设计方案[1] 。它是在对陀螺仪信号进行积分的基础上,使用加速度计得到的角度信号对输出进行负反馈调节,从而抑制积分中存在的发散问题。下图是参考设计方案中相应的原理框图和程序实现。

▲ 参考滤波方案软件实现

加速度传感器的Z周输出电压,经过偏移量,比率调整之后,形成算法的输入:

陀螺仪的输出电压经过偏移量,比率调整之后,形成算法输入:

算法的输出为角度:

(g_fCarAngle)。

▲ 参考滤波方案的核心算法

根据参考程序代码,算法可以使用迭代方程描述为:

输出角度

其中:

通过上面的化简公式可以看出,实际上角度输出信号是陀螺仪和加速度计信号经过一级低通滤波后叠加在一起,所以陀螺仪和加速度计输出信号中如果存在直流分量的漂移,都会引起输出角度信号的零点漂移。

2. 互补滤波器

互补滤波器的基本结构如下图所示。假设两个测量信号

都包含了实际信号以及噪声。在信号中的噪声主要分布在高频,而在信号

中的噪声主要分布在低频。

 

代表着低通滤波器,那么对应的就是互补的高通滤波器。它们分别提取

中的低频和高频成分,然后叠加在一起。

▲ 左:基本互补滤波器的结构。右:基本结构的变形,只对噪声进行低通滤波

在上图右边给出了互补滤波器基本结构的恒等变形。将

与相减之后,就剩下了高频噪声与低频噪声相减。再经过低通滤波器,就剩下去抵消

中的低频噪声了。

只所以讨论这个变形,就是因为前面参考方案就是变形的互补滤波器。将陀螺仪信号

的积分看做带有低频噪声(积分漂移信号)的观察信号。它与加速度计信号(带有高频运动噪声)相减,后面有比例、积分组成的负反馈组成一个一阶低通滤波器,滤波之后与

叠加,形成最后的输出信号。

▲ 参考滤波方案本质上是变形后的互补滤波器

通过上面讨论可以看出,如果在互补滤波器中的低通滤波器的阶次为一阶的话,那么就和前面的参考方案是一致了。

在实际应用中,可以增加滤波器的阶次,来提高角度计算的精度。比如在陀螺仪输入信号中,再增加一级高通滤波,可以进一步抑制陀螺仪信号中的直流分量的漂移。

3. 卡尔曼滤波

使用卡尔曼滤波的方法来融合来自陀螺仪和加速度计的信号,不在频率范围内考虑它们各自噪声的特点,而是将这两个信号从功能上分为两类。陀螺仪信号

是过程驱动变量,它激动系统状态(车模倾角,角速度)发生变化;加速度计得到的角度

则是观察变量,是来修正系统状态。。

选择车模倾角

和陀螺仪偏变化量

作为系统状态变量,得到离散系统状态方程为:

令:

则对应卡尔曼滤波方程为:

在这个过程中,如果系统噪声协方差矩阵

以及观测噪声方差始终为常量。那么由上面方程2、3、5迭代之后,误差协方差矩阵和卡尔曼增益矩阵

就会逐步收敛到一个常量。

在下面参数下,经过迭代1000次之后,卡尔曼增益矩阵参数

的变化曲线。可以看去它逐渐曲线与常数

▲ K参数迭代数值

为常量的时候,对方程1、4再联立起来,就形成关于状态变量的差分方程。考虑到,都比较小,将化简过程中涉及到这些小量乘积(二阶小量)都省略掉,那么最终可以将输出角度与输入

之间的差分方程化简为:

其中

分别是

的z变换。对照上面简化的输入输出之间的关系与前面参考方案中对应的方程,可以看到卡尔曼滤波器本质上和互补滤波器是相同的。如果不省略那些参数小的项数,滤波算法就变成二阶的互补滤波器的形式了。

观察噪声

来自于加速度计传感器,系统内部噪声来自于陀螺仪。当远远大于的时候,所计算出的卡尔曼滤波增益

的数值比较小,这样才能够进行上述的算法简化。

03算法关系


可以看出。当所使用的惯性传感器,陀螺仪的噪声远远低于加速度传感器的噪声时,低通滤波器的阶次取一阶滤波器的情况下,三种滤波器的算法效果在平稳状态下是相同的。

从原理上,参考方案与互补滤波器比较接近,它们是利用不同传感器噪声在频率上的差别抑制噪声的。卡尔曼滤波器则根据传感器对倾角影响的机制不同,通过构造系统状态变量将信息进行融合。

在车模直立控制应用中,互补滤波器和参考方案所需要的计算量小,参数只有滤波时间常数

,调试相对比较简单。但该算法对于陀螺仪工作点的漂移无法抑制,使用时,可以对陀螺仪信号再通过一个高通滤波器,消除陀螺仪信号工作点变化对输出角度的影响。

卡尔曼滤波器计算量相对较大,需要MCU的算力强才行。由于卡尔曼滤波器内部变量包括有对陀螺仪工作点的估计,所以陀螺仪的工作点的缓慢变化不会影响计算角度的变化。

▲ RECORD1数据

在使用滤波器算法的时候,都会涉及到算法的初始状态的设置问题。对于互补滤波器相对比较简单,将内部积分累加变量初始化为0便可以适应大部分情况。对于卡尔曼滤波器,它的参数矩阵

则需要选择恰当的初始值,以使得算法尽快达到收敛的目的。比如可以将算法收敛后的

矩阵的值作为程序下一次运行的初始值,这样就可以更快使得算法进入稳定状态。

此外,需要根据传感器输出信号的实际情况,合理的确定卡尔曼滤波器中的

参数,这样才能够在算法的收敛以及滤波效果方面取得良好的平衡。

关于这三种算法在理论上的分析就到这里,它们在实际控制中的效果以后在给出。

参考资料

[1]

参考设计方案: https://wenku.baidu.com/view/74481d2ff5335a8102d220b5.html

阅读原文


http://chatgpt.dhexx.cn/article/92lCRS2B.shtml

相关文章

智能车入门——车模器件篇 <新手从零做车>

本文讲搭车需要哪些器件&#xff0c;及其使用 电磁车简易接线图 这个是逐飞tb店展示的电磁车简易接线图&#xff0c;加上舵机&#xff0c;基本上就可以搭一辆四轮车。 电机 电机 电机应该都比较熟悉 在电机两端施加电压&#xff0c;电机就会旋转&#xff0c;电压越大&#xff…

智能车竞赛技术报告 | 双车接力组 - 辽宁工业大学 - 灵越1队

简 介&#xff1a; 本智能车系统以MM32SPIN27PS微控制器为核心&#xff0c;通过电感检测模型车的运动位置和运动方向&#xff0c;用编码器检测模型车的速度。使用PID控制算法调节驱动电机的转速和角度&#xff0c;完成对模型车运动速度和运动方向的闭环控制。为了完成接力任务并…

TSINGHUAJOKING公众号基本信息

文章目录 ▌01 基本信息1.公开信息2.注册信息3.Momo起草的描述语 ▌02 二维码 ▌01 基本信息 1.公开信息 名称&#xff1a; TsinghuaJoking 微信号&#xff1a;singhuazhuoqing 二维码&#xff1a; 下载公众号二维码或带有搜一搜标识的二维码&#xff0c;用于推广与分享公众号…

无线充电组别国一队:浙江工业大学

一、前言 大家好&#xff0c;我们是来自浙江工业大学智能车无线充电组鸿泉RUSH队。很荣幸受到达尔闻和英飞凌的邀请&#xff0c;分享我们的作品。 我是雷双铭&#xff0c;我在队伍中主要负责图像处理和控制部分&#xff1b;   我是王景可&#xff0c;主要负责控制和机械结构部…

第十七届全国大学智能汽车竞赛竞速比赛规则

&#xff08;版本&#xff1a;2022-6-21&#xff09; 00 规则导读 参加过往届比赛的队员可以通过下面内容了解第十七届竞赛规则主要变化。如果第一次参加比赛&#xff0c;建议对于本文进行全文阅读。 竞速比赛共分为九个组别&#xff0c;每个组别在比赛环境、比赛任务、单片机平…

【c语言】矩阵乘法

【c语言】矩阵乘法 1.N*N矩阵 A[N][N]*B[N][N]C[N][N] #include<stdio.h> #define N 2 int main() {int A[N][N] {}, B[N][N] {}, C[N][N] {};printf_s("请输入矩阵A&#xff1a;\n");int i, j;for (i 0; i < N; i) {for (j 0; j < N; j) {scanf_…

C语言求矩阵的逆(伴随法)

之前介绍了C语言用代数余子式求行列式 本次开始介绍如何用公式法对矩阵求逆&#xff0c;并用C语言将其实现。 之前程序有点小bug&#xff0c;已于2022年11月29日修改。 更新&#xff1a; 伴随法只适合求低阶矩阵的逆&#xff0c;对于相对高阶&#xff08;20维以上&#xff09;对…

C语言 矩阵乘法

Description 给出m * n阶矩阵A&#xff0c;乘以n * p阶的矩阵B&#xff0c;得到一个m*p阶的矩阵C。矩阵乘法定义如下图所示。 Input 输入分为两部分&#xff1a;第一部分是三个整数m、n和p&#xff1b;后面为两个矩阵&#xff0c;分别是mn阶矩阵A和np阶矩阵B。m、n和p都不会超…

C语言矩阵库------Matrix

欢迎使用Matrix Matrix目前能实现矩阵的基本功能,例如:方阵行列式求解,矩阵的线性运算和矩阵相乘,矩阵求逆等等. 我会持续更新此库,需要的朋友可以进行下载。 V1.1版本10阶矩阵的行列式和逆矩阵求解对齐了matlab的精度&#xff0c;但是速度较慢。谨慎使用于高阶矩阵运算。 链…

使用C语言实现矩阵转置(稀疏矩阵)

目录 1.转置矩阵&#xff08;普通矩阵&#xff09; 2.转置矩阵&#xff08;稀疏矩阵&#xff09; &#xff08;1&#xff09;稀疏矩阵 &#xff08;2&#xff09;稀疏矩阵的压缩存储方式 &#xff08;3&#xff09;理论运算方法 1.转置矩阵&#xff08;普通矩阵&#xff0…

c语言矩阵

思路&#xff1a;开辟一个新的同样规格的矩阵b&#xff0c;并将其全部置1. 遍历矩阵a(原矩阵)&#xff0c;发现有0的就在b的此行此列中插入0 // // main.c // test // // Created by 神威 on 2018/9/11. // Copyright © 2018年 神威. All rights reserved. // #incl…

C语言-矩阵转置

描述 KiKi有一个矩阵&#xff0c;他想知道转置后的矩阵&#xff08;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff09;&#xff0c;请编程帮他解答。 输入描述&#xff1a; 第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。 (1≤n≤…

C语言对矩阵进行转置

对矩阵进行转置最重要的是值的交换&#xff0c;这里用到了二重数组 #include <stdio.h> #include <stdlib.h>int main() {int a[3][3]{1,2,3,4,5,6,7,8,9};//初始化一个矩阵出来int b[3][3]{0};for(int i0;i<2;i){for(int k0;k<2;k){b[k][i]a[i][k];//对矩…

C语言 - 矩阵转置

C语言 - 矩阵转置 输入NM的矩阵&#xff0c;输出它的转置矩阵。 Input 第一行为整数N&#xff0c;M&#xff08;1≤N&#xff0c;M≤100&#xff09;。 接着是一个NM的矩阵。 Output 转置矩阵。 Example Input 2 3 1 2 3 4 5 6 Example Output 1 4 2 5 3 6#include&l…

(C语言)求矩阵各行元素之和

本题来自pintia.cn 题目要求代码测试结果图PTA测试结果 题目要求 本题要求编写程序&#xff0c;求一个给定的mn矩阵各行元素之和。 输入格式&#xff1a; 输入第一行给出两个正整数m和n&#xff08;1≤m,n≤6&#xff09;。随后m行&#xff0c;每行给出n个整数&#xff0c;其间…

编写矩阵运算程序(C语言)

编写矩阵运算程序之C语言 1. 要求2 代码 1. 要求 a) 功能包括&#xff1a;矩阵加、矩阵减、矩阵乘、矩阵三角化 b) 实现方式1&#xff1a;函数的参数为&#xff1a;二维数组名、行数、列数 2 代码 #include<stdio.h> #define M 20 #define N 20 float A[M][N]; float…

C语言——矩阵转置

矩阵转置的原理&#xff1a;行元素变成列元素&#xff0c;列元素变成行元素 例如&#xff1a; 矩阵转置代码 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<math.h>//矩阵转置 double** Matrix_T(double** arr) {if(arrNULL)e…

C语言实现矩阵的乘法

矩阵乘法作为算法题我觉得对我来说是比较难想的&#xff0c;而且作为没学线性代数的我来说&#xff0c;这简直就是场灾难&#xff0c;在我研究了书上及网上的有关资料后&#xff0c;我觉得自己应该差不多可以理解矩阵乘法的要领了&#xff0c;希望可以帮助大家&#xff1a;其实…

C语言矩阵运算

矩阵的乘法&#xff1a; 矩阵的列数&#xff08;column&#xff09;和第二个矩阵的行数&#xff08;row&#xff09;相同时 #include<stdio.h>int main() { int a[2][4], b[4][3], c[2][3];int i, j, k, sum; printf("输入一个24的矩阵&#xff1a;\n"); fo…

c语言矩阵的乘法

矩阵的乘法&#xff1a; 两个矩阵只有在第一个矩阵的列数&#xff08;column&#xff09;和第二个矩阵的行数&#xff08;row&#xff09;相同时才有意义。一般单指矩阵乘积时&#xff0c;指的便是一般矩阵乘积。一个mn的矩阵就是mn个数排成m行n列的一个数阵。 运算规则&#x…