目录
2、多传感器融合——使用卡尔曼滤波算法进行陀螺仪和加速度计数据融合
六、如果我的文章能帮助到你,请点个赞鼓励一下吧ヽ(✿゚▽゚)ノ
前言
网上的卡尔曼滤波算法文章良莠不齐,且多重公式推导,本长颈鹿决定轻装上阵,省去复杂的公式推导,将重点放在卡尔曼滤波算法的使用上面,再结合实际例程,帮助同学们更加直观高效的学会使用卡尔曼滤波。当然,公式的简单介绍和参数意义的说明必不可少。
希望这篇文章能帮你学会使用卡尔曼滤波算法
一、卡尔曼滤波的五个公式和参数解释
卡尔曼滤波算法是一种优秀的最优值估计算法,其核心思想是通过递归算法从带有噪声的观测数据中估计动态系统的最优状态,应用领域包括自动驾驶、飞行控制、趋势预测等,最经典的应用是阿波罗登月。在人类首次登录月球的任务中,科学家使用卡尔曼滤波来修正飞船轨迹。卡尔曼滤波主要包括两个过程,预测和更新:
1、预测过程
①:
参数解释:
:当前时刻预测值——由上一时刻的最优估计值
和当前时刻的控制输入
计算得出。
:状态矩阵——由运动方程确定。
:上一时刻最优估计值——初始值
自己设置,一般取0,后续最优值由公式④更新得出。
:控制矩阵——由运动方程确定。
:当前时刻控制输入——由传感器测量得到,例如加速度计和陀螺仪进行多传感器融合时,陀螺仪输出的角速度数据。
②:
参数解释:
:当前时刻预测值
的协方差矩阵——反映预测值的可信度,由上一时刻最优估计值的协方差矩阵
和预测过程中噪声的协方差矩阵
得出。
:状态矩阵——由运动方程确定。
:上一时刻最优估计值
的协方差矩阵——反映上一时刻最优值的可信度,初始值
自己设置,一般取1,后续值由公式⑤更新得出,具有回归性,不管初始值取多少,迭代几次后都会趋向于相同变化趋势。
:状态矩阵转置。
:预测噪声的协方差矩阵——该项为超参数,根据经验和应用场景自己设置,如果认为预测值比测量值更加准确,就在自己设定的范围内适当设为较大值,类似于PID控制时的调参。
2、更新过程
③:
参数解释:
:当前时刻的卡尔曼增益——相当于预测值和测量值的数据融合系数,由公式③得出。
:见②中解释。
:测量矩阵——由测量方程确定。
:测量矩阵转置——由
确定。
:测量噪声的协方差矩阵——该项为超参数,根据经验和应用场景自己设置,如果认为测量值比预测值更加准确,就在自己设定的范围内适当设为较大值,类似于PID控制时的调参。
④:
参数解释:
:当前时刻的最优估计值——这就是我们最终的计算结果,由公式④得出。
:见①中解释。
:见③中解释。
:当前时刻的测量值——由传感器测量得到,例如加速度计和陀螺仪进行多传感器融合时,加速度计得出的角度数据。
:见③中解释。
⑤:
参数解释:
:当前时刻最优估计值
的协方差矩阵——反映当前时刻最优估计值的可信度。为计算下一时刻的
做准备。
:单位矩阵。
:见③中解释。
:见③中解释。
:见②中解释。
这就是卡尔曼滤波算法涉及到的所有公式和参数详细解释,现在不明白没有关系,可以先把这些公式和参数记下来,接着往下看,你就会明白这些参数的物理意义。
二、卡尔曼滤波参数类型分类及获取F、H、B矩阵
如果你已经用笔记录了上一章中列下的公式和参数的意义,那么就可以继续接下来的学习,第一章的公式中出现了许多参数,这些参数来源不同,有些通过公式更新得到,有些需要我们凭经验和应用场景赋初值,有些则和我们建立的模型息息相关,在模型建立后就唯一确定。本长颈鹿按照数据来源对这些参数进行了分类,如下所示:
1、需要手动赋值的参数有:
初始时刻的最优估计值;
的协方差矩阵
;
表示预测噪声的协方差矩阵;
表示测量噪声的协方差矩阵;
其中,由实际场景决定,一般取0,
一般取1就行,迭代几次就会回归正常,
和
的取值取决于预测值和测量值数据的可信程度,它们俩属于超参数,和PID一样需要边测边调。
2、随模型更新的参数有:
预测值;
最优估计值;
卡尔曼滤波增益;
预测值的协方差矩阵;
最优估计值的协方差矩阵;
这些参数不用我们操心,会随公式自己更新。
3、随模型确定的参数有:
过程矩阵、控制矩阵
以及测量矩阵
。
这三个矩阵随着我们建立的预测方程和测量方程而确定
本章我们要介绍卡尔曼滤波算法的信号框图,通过这个框图,我们可以直观的进行状态方程和测量方程的建立,并通过预测方程和测量方程来计算过程矩阵、控制矩阵
以及测量矩阵
,之后我们就只需要重点关注那些需要手动赋初值的参数。信号框图如下所示:
这个信号框图反映了预测值和测量值的关系,以及两者组合在一起计算出最优估计值的过程,需要注意的是测量值部分的框图,测量值其实是没有输入的,完全通过测量得到,之所以画出来是因为我们需要使用到其中的测量矩阵和测量噪声,测量矩阵能够反映测量值的数据维度并提供数据维度转换的矩阵渠道,因为有时候预测值和测量值
的数据维度不一样,例如在匀加速直线运动模型中,预测值
的数据维度是二维的,包括位置和速度,而测量值
只表示位置,它的数据类型往往是单一的,因此预测值需要乘以测量矩阵H完成数据维度统一,才能和测量值进行加权融合。而测量噪声能够反映测量值数据的可信度,用来更新协方差矩阵和卡尔曼增益。
由框图可得:
①:测量方程:
测量值 = 测量矩阵
* 真实值
+ 测量噪声
(对应测量过程的协方差矩阵R)
注意:真实值没有现实意义,其数据维度和预测值、最优估计值保持一致,测量矩阵
将真实值
的数据维度转换为测量值
的数据维度,当然也可以转换预测值。
②:预测方程:
预测值 = 过程矩阵
* 上一时刻最优估计值
+ 控制矩阵
* 当前时刻控制输入
+ 过程噪声
(对应预测过程的协方差矩阵Q)
那么如何计算呢?
举个例子,一辆小车在进行匀速直线运动,我们知道它的初始状态并测量它当前的位置,那么它当前时刻的位置 = 上一时刻的位置
+ 速度
* 时间间隔∆t
,现在我们建立卡尔曼滤波需要使用的预测方程和测量方程,以此来得到
。
首先确定表示的状态量,
表示的控制量和
表示的观测量都有谁,小车的位置是观测量也是状态量,小车进行匀速直线运动,速度不变,速度也是状态量,这一个模型中没有控制量,所以:状态量
,观测量
=
,控制量无,此时公式②
变为:
根据匀速直线运动的性质,我们可以得到运动状态方程:
已知,两个公式对比一下就能得出:
,
此时测量方程,注意
和
的数据维度是一致的,都为
,而观测量
=
,所以测量矩阵
要起到数据维度统一的作用,将
转换为
,可得:
至此,我们已经得到了的具体值,只需要将初始参数设置完毕,就可以运行卡尔曼滤波算法,迭代得到最优估计值。
三、卡尔曼滤波物理意义的通俗理解
情景假设,丸子是洛阳市数一数二的神枪手,上一次打靶的成绩是8环,这一次我预测她还能打出8环的成绩(预测值),误差不超过±1环(预测方差Q),但高度近视眼+800度散光的裁判通过目视得出这次她打靶的成绩是5环(测量值),误差在±3环以内(测量方差R),请问丸子这次的打靶成绩最有可能是几环?
打靶成绩如图所示:
相信聪明的你看到图片就已经明白了答案,图中的这部分黄色重叠矩形区域就是最优估计值存在的范围,这个过程就是卡尔曼滤波算法在物理层面上的解释——使用测量值来纠正预测值,最终得出当前时刻的最优估计值。
这里说点题外话,赶时间的同学可以直接跳过。
有好奇心强的同学可能会问了,为什么不是预测值纠正测量值呢?问得好,这里深究下去会涉及到一个非常有趣的性质,卡尔曼滤波不是将预测值和测量值融合后乘以一个卡尔曼增益进行最优值估计吗,那么我要问了,这个卡尔曼增益权重的计算和测量值有没有关系呢?
肯定有关系啊,是不是,没关系怎么计算权重呢?但事实是——没有关系!不信的话回去看一下预测过程和更新过程的公式,只有最优估计值的更新涉及到测量值,其他部分是不是和测量值没关系?
这是否意味着卡尔曼滤波在没有输入的情况下“事先就知道了每一次迭代的权重”?
从某种意义上说,是的,如果我们已知运动模型(F、Q)、观测模型(H、R)、初始状态(x0,p0),那么我们就可以在没有任何测量值的情况下,预先计算出任意时刻的协方差矩阵P和卡尔曼增益K。
换句话说,卡尔曼滤波对后续所有时刻数据的信任程度在还没有测量数据输入的时候就已经确定了,真实意想不到啊,这是一个非常神奇的性质,违反直觉。
如果没有测量值,相当于只做预测,每次迭代只执行预测步骤,只要我们知道系统的过程矩阵F、过程噪声协方差Q、测量矩阵H、测量模型协方差R,这些数据属于模型自身的属性,与测量数据输入无关。不需要任何测量值,协方差矩阵P和卡尔曼滤波增益K都会随时间演化,并且计算结果和有测量数据输入时没有差别。所以说卡尔曼滤波的本质是通过测量值来纠正预测值,因为模型的更新运转不依赖于测量值,测量值只起到纠正作用。
四、如何使用卡尔曼滤波?
卡尔曼滤波算法的使用流程分为五个步骤:
1、确定模型的观测量、状态量、控制量
①首先确定模型的观测量,因为只要应用卡尔曼滤波,观测就一定存在,且最容易区分,观测值一定是传感器的输出,例如对单个陀螺仪传感器运用卡尔曼滤波,观测值就是陀螺仪传感器输出的角速度,对加速度计+陀螺仪多传感器融合运用卡尔曼滤波,观测值是加速度计传感器计算得到的角度,此时陀螺仪传感器的输出角速度变为控制量。
②接着确定是的模型的状态量,状态量一定包括观测量,但也不局限于观测量,就像第二章中的位置和速度的例子,状态量包括位置和不变的速度,观测量只有位置。
③最后确定模型的控制量,控制量只有多传感器融合时才有,一般是维度更低的传感器数据,就像角速度(控制量)之于角度(观测量),速度(控制量)之于位置(观测量),加速度(控制量)之于速度(观测量)。
2、计算过程矩阵F、控制矩阵B、测量矩阵H
构建第三章中的预测方程和测量方程计算过程矩阵F、控制矩阵B、测量矩阵H。
3、初始化参数
需要初始化的参数有:
1、初始时刻的最优估计值,一般取0;
2、的协方差矩阵
,一般取1,不可为0;
3、预测噪声的协方差矩阵,根据预测模型的可靠性取值,Q越小表示预测越可靠;
4、测量噪声的协方差矩阵,根据测量模型的可靠性取值,R越小表示测量越可靠;
4、代入公式进行迭代
5、调节参数Q和R
根据模型性能来调节Q和R参数的值,类似于PID调参。
五、卡尔曼滤波应用举例(内附完整代码及注释)
1、单个传感器——使用卡尔曼滤波算法纠正陀螺仪的角速度数据
如果只有单一的测量值输入,并且状态量和观测量都为一维数据,那么此时的卡尔曼滤波算法可以写成标量形式,使用变量运算就可以表示。
按第四章中的步骤使用卡尔曼滤波算法,首先确定模型的观测量,状态量和控制量,使用陀螺仪输出的某一旋转轴的角速度作为测量输入,模型的观测量为陀螺仪输出的角速度w,状态量和观测量一致,控制量为0。接着构建预测方程和测量方程,计算F、B、H。方程如下:
可以得到:F=1,B=0,H=1;代入第一章中的五个公式中可得:
预测过程:
更新过程:
根据公式编写一阶标量卡尔曼滤波算法代码及注释如下:
/* 一阶卡尔曼标量方程
f32 Q_Input; //预测过程协方差
f32 R_Input; //测量过程协方差
f32 Z_Measure //测量值
f32 x0; //初始状态最优值
f32 p0; //初始状态最优值协方差值
*/
f32 kalman(f32 Z_Measure, f32 Q_Input, f32 R_Input, f32 x0, f32 p0)
{
static f32 X_Predict; //预测值
static f32 X_Optimal; //最优值
static f32 P_Predict; //预测值协方差矩阵
static f32 P_Optimal; //最优质协方差矩阵
static f32 K; //卡尔曼增益
static f32 Q; //预测过程协方差
static f32 R; //测量过程协方差
static BOOL IsInit = true; //初始化标志位
if(IsInit == true) //初始化操作
{
IsInit = false; //清除标志位
X_Optimal = x0; //初始化
P_Optimal = p0;
Q = Q_Input;
R = R_Input;
}
//预测过程
X_Predict = X_Optimal; //预测值更新
P_Predict = P_Optimal + Q; //预测值协方差矩阵更新
//更新过程
K = P_Predict / (P_Predict + R); //更新卡尔曼滤波增益
X_Optimal = X_Predict + K*(Z_Measure - X_Predict); //更新最优估计值
P_Optimal = (1-K)*P_Predict; //更新最优估计值的协方差矩阵
return X_Optimal; //返回最优估计值
}
2、多传感器融合——使用卡尔曼滤波算法进行陀螺仪和加速度计数据融合
此时的卡尔曼滤波的状态向量就不再是一阶标量形式,变成了矩阵形式(包括角度和偏置误差),需要通过矩阵运算才能表达。因此使用多传感器融合的卡尔曼滤波算法需要矩阵库的支持,不然就得自己设计相关的矩阵运算符。像OpenCV库、Python中的NumPy库和C++中的Eigen库等,都支持矩阵运算,不过有一个比较尴尬的问题,既然在项目中都能使用这些库的话,说明硬件资源还是比较丰富的,差不多能直接调用封装好的卡尔曼滤波算法了,不需要手动设计。
感兴趣的同学可以手动推导一下矩阵形式的卡尔曼滤波,网上有很多资料可以参考,学以致用!