ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RM电控卡尔曼滤波入门:矩阵直觉与Q/R调参

RM电控卡尔曼滤波入门:矩阵直觉与Q/R调参 每年RM电控的备赛季群里总有人问同一个问题卡尔曼滤波的代码抄下来了参数照着帖子改了可车跑起来要么抖、要么迟钝、要么直接发散。追问下去十有八九卡在同一个地方——矩阵分析的基础没打牢。这不是谁数学没学好而是学校的线性代数课和电控实战之间隔着一层没人帮你捅破的窗户纸。顺带说一句搜相关关键词的时候别手滑打成终端里那个删除命令一个是机器人比赛一个是删库跑路的操作完全不是一回事。这篇内容就是来捅那层纸的把RM电控里卡尔曼滤波真正用到的矩阵知识从实际需求倒推着讲一遍。读完你应该能做到——看懂那五个滤波方程里每个矩阵的来历能手推一个二维例子知道工程里哪些矩阵运算其实可以跳过以及调Q、R这两个参数时背后到底在动什么。1. RM电控新人学卡尔曼滤波为什么总卡在矩阵这一关1.1 一个几乎每年都重演的卡壳现场我见过太多这样的场景新队员从GitHub上扒下来一份姿态解算代码里面有几个二维数组命名分别是P、Q、R、K。他改了改Q和R的经验值发现能跑就以为学会了。直到有一天云台开始抽风或者底盘直线跑偏需要他真正理解滤波在干什么的时候他盯着P F * P * F.transpose() Q这行代码完全说不清每个符号的物理含义。这时候如果没人点破他大概率会走两条弯路要么去死磕一本砖头厚的矩阵分析教材从行列式开始啃两周后放弃要么干脆放弃滤波退回到简单的低通滤波用响应慢来换取稳定。两条路都不算错但都没解决根本问题。真正的症结在于卡尔曼滤波需要的矩阵知识是一个非常小的子集恰好卡在知道矩阵怎么乘和理解矩阵在描述什么之间。学校的课教你算但没告诉你在一个两状态系统里那个2×2的P矩阵的四个元素分别代表什么物理量。你缺的不是运算能力是物理直觉和工程直觉。所以这一关的过法不是补全整门课而是精准补上滤波真正用到的那几块。1.2 矩阵分析在五个滤波方程里到底出现在哪几处我们先把卡尔曼滤波的标准五个方程摆出来标注每一步用到的矩阵运算这样你就能看清要补什么。步骤方程用到的矩阵运算物理含义状态预测x̂⁻ F·x̂矩阵乘向量用上一时刻状态推当前状态协方差预测P⁻ F·P·Fᵀ Q矩阵乘、转置、加法不确定性如何被传播和放大增益计算K P⁻·Hᵀ·(H·P⁻·Hᵀ R)⁻¹转置、求逆、乘法决定相信模型还是相信观测状态更新x̂ x̂⁻ K·(z − H·x̂⁻)矩阵乘向量、减法用观测修正预测协方差更新P (I − K·H)·P⁻矩阵乘、单位阵修正后的不确定性变小你看翻来覆去就是四件事矩阵乘向量、矩阵乘矩阵、转置、求逆。行列式、特征值、二次型、若尔当标准型这些矩阵分析的重头戏在标准卡尔曼滤波里根本用不上。真正需要花心思理解的只有两个对象状态转移矩阵F它描述系统怎么动和协方差矩阵P它描述我们有多不确定。抓住这两个其他都是配角。很多人被矩阵分析四个字吓住是因为把它等同于整本教材其实对于滤波你只需要吃透不到教材三分之一的内容。1.3 这篇内容适合谁学到什么程度算够用如果你是刚进RM电控组、刚接触传感器融合的新人这篇内容的目标是让你两周内跨过矩阵这道门槛能独立看懂并修改一份滤波代码。如果你已经在用滤波但说不清原理这篇内容能帮你把脑子里零散的公式串成一条线。如果你只是负责调车、暂时不碰算法也可以先看第2和第5章理解Q、R这两个参数的物理意义调参的时候心里有底。这里要明确一点我不建议你为了滤波去啃完整的矩阵分析教材那属于用力过猛。真正高效的路径是——先建立物理直觉再补数学工具最后用代码验证。下面几章就按这个顺序展开。2. 从物理量到矩阵状态方程是怎么写出来的2.1 用云台角度与角速度搭一个二状态模型我们拿RM电控里最常见的场景举例云台的偏航轴你想估计它的角度和角速度。为什么是这两个量因为角度是你最终要控制的输出而角速度决定了你下一步能否预测角度往哪走。这两个量构成一个二维状态向量写成列向量的形式就是 x [θ, ω]ᵀθ是角度ω是角速度。用列向量而不是行向量是约定俗成的习惯因为几乎所有教材和代码都这么写你跟着来就行转置符号ᵀ就是提醒你这是个竖着的向量。现在假设一个很短的时间间隔Δt内角速度近似不变这是一个常见的工程假设叫匀速模型那么下一时刻的角度等于当前角度加上这段角速度走过的角度下一时刻的角速度等于当前角速度。写成方程就是θₖ θₖ₋₁ ωₖ₋₁·Δtωₖ ωₖ₋₁。这两个方程非常朴素完全不需要矩阵。但一旦状态维度变多、方程变复杂用矩阵形式表达会更统一也方便计算机批量处理。所以我们要把这两个标量方程打包成矩阵形式。2.2 矩阵乘法的本质线性组合与状态传播打包的过程就是矩阵乘法但你要理解矩阵乘法在这里到底干了什么。我们把上面两个方程写成矩阵形式[θₖ] [1 Δt] [θₖ₋₁] [ωₖ] [0 1] [ωₖ₋₁]右边这个2×2矩阵就是状态转移矩阵F。它的第一行 [1, Δt] 对应第一个方程新的角度 1×旧角度 Δt×旧角速度也就是把两个旧状态按系数1和Δt加权求和。第二行 [0, 1] 对应第二个方程新的角速度 0×旧角度 1×旧角速度。所以矩阵乘向量本质上就是把旧状态的各个分量按不同权重线性组合出新的每个分量。这个视角非常重要它让你明白矩阵的每一行就是一条配方告诉你新的这个分量由旧的哪些分量、各贡献多少组合而成。理解了这一层你再看任何状态转移矩阵都能一行一行读出它的物理意义。F矩阵里那个Δt藏在右上角它代表角速度通过乘以时间影响角度。左下角的0代表角度不影响角速度数学上这叫下三角结构。这个结构决定了系统的可观测性、可控性等一系列性质但对我们当下的滤波来说只要知道它不是随便填的、而是由物理规律决定的就够了。同理如果考虑角速度会有阻尼比如云台电机有摩擦ω的方程里可能会多一项 -c·ω那么F里对应的位置就会填进相应的系数。矩阵的每个非零元素背后都对应一条真实的物理耦合关系。2.3 离散化从微分方程到状态转移矩阵F细心的同学会发现真实系统的物理规律往往写成微分方程比如角速度是角度对时间的导数dθ/dt ω。而我们上面用的是离散形式。从连续到离散这一步叫离散化在RM里因为控制周期固定比如1kHz或者500Hz我们直接用一阶近似就够了。一阶近似的意思是在一个很小的Δt里认为ω几乎不变于是θ的变化量就是ω·Δt。这就是著名的前向欧拉法精度不高但计算极快对滤波这种每毫秒都要跑一次的场景非常合适。如果系统更复杂比如要考虑角速度本身也有角加速度那么状态就得加到三维 [θ, ω, α]F会变成3×3右上区域会出现 Δt²/2 这样的项。你不用担心记不住这些公式它们的来源都是同一个逻辑把微分方程在Δt上做泰勒展开保留前一两项。所以面对一个新系统写F的方法其实很机械——先写出每个状态量的变化率表达式再对应填进矩阵。这个能力比背公式重要得多也是很多教程不讲但实战中天天用到的。3. 协方差矩阵卡尔曼滤波真正在传递的东西3.1 从方差到协方差为什么单个数字不够用如果说状态向量x描述的是系统现在是什么样那么协方差矩阵P描述的就是我们对这个状态有多拿不准。一维情况下不确定性用一个方差σ²就能表达σ越大说明估得越没底。但到了二维、三维问题来了角度估得准不准和角速度估得准不准这两件事往往不是独立的。比如角度是根据角速度积分出来的角速度一旦有偏差角度偏差会随之累积两者是相关的。这种相关性单个方差表达不了必须引入协方差。协方差矩阵P就是把这些方差和协方差排成一个方阵对角线元素是各自分量的方差P00是角度的方差P11是角速度的方差非对角线元素是两两之间的协方差P01表示角度和角速度的相关程度P10是它的对称项数值相等。所以一个2×2的P矩阵四个数字各有明确含义不是凑数的。理解这一点你就明白为什么初始化P的时候对角线要填正数、非对角线通常填0——因为我们一开始假设各状态互相独立。随着滤波迭代非对角线会自己长出非零值这正是系统内部耦合的体现。3.2 协方差矩阵的形状、性质与几何图像协方差矩阵有两个绕不开的性质对称和半正定。对称就是你看到的P01 P10这来自协方差的定义本身。半正定的意思是对于任意非零向量vvᵀ·P·v ≥ 0。用人话说就是任何方向的方差都不可能为负这符合直觉方差本来就非负。这条性质很重要因为卡尔曼滤波在数值上要求P始终保持半正定如果你调参太猛或者代码写错导致P变成了非半正定滤波就会发散表现就是估计值越跑越离谱。几何上协方差矩阵可以用误差椭球来理解。对角线上方差大的方向椭球就拉得长表示那个方向不确定性大非对角线非零意味着椭球是斜的表示两个状态相关。随着滤波不断引入观测椭球会逐渐缩小也就是不确定性下降。我建议你第一次学的时候找一段能画误差椭圆的代码把这个过程可视化出来看到椭球在预测时膨胀、在更新时收缩对P的理解会瞬间立体起来。这比看一堆公式有用得多。3.3 F·P·Fᵀ 这一步在预测中干了什么预测步里最让人费解的运算就是 P⁻ F·P·Fᵀ Q。我们拆开看。F·P 是把协方差按状态转移的方式传播再利用对称性右乘Fᵀ整体效果就是用线性变换F去拉伸原来的误差椭球。前面二维例子里F含有Δt项所以运算之后你会发现角度方向的方差增大了——因为角度是靠角速度积分的角速度的不确定性会随着时间累积到角度上去。这正是我们期望的时间过得越久纯靠模型推演的位置越不可信。再用第2章的二状态F手推一下你会得到新的角度方差里出现 Δt²·P11 这一项它表示角速度方差经过时间累积变成了角度方差还有一个 2Δt·P01 项表示角度和角速度的相关性也在贡献。把这些项的实际来源想清楚比背结论强一百倍。最后加的Q是过程噪声代表模型本身不完美——比如真实角速度在这个Δt里其实变了或者有我们没建模的扰动。Q的作用是给预测的方差再补一点防止滤波过度自信。4. 转置与求逆观测更新中的矩阵操作拆解4.1 转置矩阵在H和增益公式里的角色观测矩阵H的任务是把状态空间映射到观测空间。还拿云台举例假设传感器只能测到角度比如一个绝对式编码器或视觉给出的角度那么观测量z θ 噪声对应的H就是 [1, 0]一个1×2的行向量。H·x就是把二维状态压缩成一维观测H·[θ, ω]ᵀ θ。如果没有观测角速度H里角速度那一列就是0。那公式里的转置从哪来增益K P⁻·Hᵀ·(…)⁻¹ 中出现Hᵀ是因为我们需要把一个观测空间的量残差映射回状态空间去修正状态。H把状态压到观测空间Hᵀ则把观测空间的量抬回状态空间两者维度恰好配对H是1×2Hᵀ是2×1。维度匹配是检查矩阵公式有没有写错的最快方法以后你推导任何滤波变体都可以先用维度验算一遍比死记公式可靠。4.2 计算卡尔曼增益时那个逆矩阵是什么增益公式里 (H·P⁻·Hᵀ R)⁻¹ 这一坨常常让人头大。我们先算它的形状H·P⁻·Hᵀ 是观测空间的协方差1×1的标量R也是观测噪声的协方差同样1×1加起来还是一个标量所以这个逆在一维观测下就是简单的取倒数根本不用动矩阵求逆的算法。只有当观测是多维的时候它才是一个真正的矩阵求逆。这个标量在二维例子里等于 P00⁻ R其中P00⁻是预测角度方差R是观测噪声方差。于是增益K P⁻·Hᵀ / (P00⁻ R)展开后得到两个分量K的第一个分量是 P00⁻/(P00⁻R)第二个分量是 P01⁻/(P00⁻R)。注意这里出现了非常关键的一幕即使我们只观测角度角速度也被修正了修正的力度由协方差P01⁻决定。为什么因为角度和角速度相关观测到角度偏离预测就间接告诉我们角速度可能也估偏了。这个通过相关性传递修正的机制是卡尔曼滤波比简单低通滤波强的核心原因也是你必须理解协方差矩阵的另一个理由。4.3 手推一个二维例子的完整更新过程我们把数值代进去走一遍。设预测状态 θ⁻ 10°ω⁻ 2°/s预测协方差 P⁻ [[1, 0.5], [0.5, 1]]观测噪声方差 R 1。传感器这次读到 z 12°。第一步算增益。P00⁻ R 1 1 2。K [1/2, 0.5/2]ᵀ [0.5, 0.25]ᵀ。第二步算残差。H·x̂⁻ θ⁻ 10°残差 z − H·x̂⁻ 12 − 10 2°。第三步更新状态。新角度 10 0.5×2 11°新角速度 2 0.25×2 2.5°/s。你会看到角度从预测的10°被拉向观测的12°但没完全拉到12°而是折中到11°同时角速度从2被修正到2.5虽然传感器根本没测角速度。折中的力度由增益决定增益又由预测有多不确定和观测有多不可靠的比值决定。当R很小时观测很准增益接近1状态几乎完全听观测当R很大时增益接近0状态几乎完全信模型。整个滤波的调节哲学就浓缩在这一个比值里。把这段数值手推一遍你会发现那五个方程不再是天书。5. 噪声矩阵Q和R矩阵分析之外的经验部分5.1 Q和R的物理含义与量纲矩阵分析能告诉你Q和R在公式里怎么运算但它们的数值怎么定数学给不了答案得靠工程经验。先明确含义R是观测噪声协方差反映传感器数据有多脏Q是过程噪声协方差反映你的模型有多不靠谱。它们的每一个对角元素单位都是对应物理量的平方。比如角度的噪声方差单位是度²或者弧度²角速度的噪声方差单位是(度/秒)²。单位对不上是新手最容易犯的错之一一旦量纲乱套滤波行为会很诡异。R通常可以通过传感器手册或实测得到。比如陀螺仪的噪声密度、视觉检测角度的抖动幅度都可以通过静置采数据算方差得到。Q则主观得多它没有标准答案本质上是一个你有多不信任模型的旋钮。模型越准Q可以越小模型越粗糙比如系统有强机动Q就得适当放大。5.2 调参时矩阵对角线怎么定一个实用的做法是先固定R再调Q。调Q的时候从很小的值开始比如各分量方差的百分之一逐步放大。放大的过程中你会观察到两种典型行为。Q太小时滤波几乎不理会观测输出平滑但滞后系统响应慢转弯或者急停时明显跟不上。Q太大时滤波过度依赖观测输出会跟着噪声一起抖甚至因为过度修正而发散。合适的Q应该让滤波在平滑和响应之间取得平衡。具体数值上RM里常见的经验是R取传感器实测方差的1到4倍稍微高估一点更稳Q取模型误差的估计值。以云台为例如果你用了匀速模型但真实云台在加速那模型误差主要体现在角速度的导数上可以给角速度分量的Q适当大一点。这个给谁大给谁小的判断就来自你对系统物理特性的理解也是前面几章物理直觉的价值所在。5.3 一个反面案例Q调太大导致滤波发散我踩过一次很典型的坑。当时为了追求响应速度把一个云台滤波的Q调得很大想着响应快嘛。结果车在静止时输出就在小幅高频抖动转向时数值直接跳到不合理的大角度云台乱摆。排查了半天以为是机械松动或者传感器干扰最后逐行打印P矩阵才发现协方差对角线在每次更新后不减反增误差椭球被越撑越大最终数值上失去半正定性滤波发散。根因就是Q过大每次预测都给协方差补了太多不确定性导致增益一直很大状态被观测噪声反复拉扯。教训是Q不是越大越灵敏它有一个合理上限超过之后系统进入过度自信于观测噪声的失控状态。从那以后我的原则是每次调完Q都用串口把P矩阵的对角线和状态一起打出来观察它们是否稳定收敛。这个小习惯帮我避免了好几次类似的坑。6. 学矩阵分析的资料选择与电控实战节奏6.1 教材、网课与速成路线的取舍网上关于矩阵分析的学习资料非常多其中被反复提到的是国内几本经典教材。我的建议是如果你只是想应付滤波不必从头啃完重点看矩阵乘法、转置、逆、协方差与正定性这几节就够了其他章节当作字典需要时再查。教材的价值在于严谨但它的节奏和电控实战的节奏对不上硬啃容易劝退。更高效的是找一份专门讲卡尔曼滤波的入门资料边看边补矩阵。遇到看不懂的矩阵操作再回教材查对应的章节用问题驱动学习效率比线性通读高得多。至于网课挑选标准很简单讲滤波方程的时候有没有把它拆开解释每个矩阵的物理意义。只推导不解释物理的课看完你还是不会调参。6.2 把矩阵知识迁移到代码里的练习方式光看不练矩阵知识永远停在纸上。我的建议是动手实现一个最小可跑的例子。用numpy这样的库几行代码就能把五个方程写出来然后喂人造数据比如生成一条带噪声的匀速运动轨迹看看滤波能不能还原。重点不是写出正确的代码而是把中间量打印出来每一步的P矩阵、增益K、残差都打出来观察它们随时间的演化。你会亲眼看到协方差从大变小、增益从某个初值趋于稳态这些现象一旦见过理解就扎根了。代码层面有几个容易忽略的细节。一是所有向量默认当列向量处理Python里用一维数组时要注意乘法的方向必要时用reshape(-1, 1)显式变成列向量。二是矩阵乘法别用逐元素乘*要用矩阵乘或dot这是新手最常见的低级错误。三是注意数值稳定长时间运行可以考虑Joseph形式更新协方差能改善半正定性的保持。6.3 从一维滤波到多传感器融合的扩展当你把单轴的二维滤波跑通之后下一步自然是想融合多个传感器比如IMU和视觉都提供角度或角度变化信息。这时候观测矩阵H就不再是 [1, 0]而是多行对应多个观测量R也变成多行多列的矩阵。好消息是前面的矩阵知识依然够用——转置、求逆、乘法一个都没变只是维度变大了。这时候你会遇到前面提过的真正的矩阵求逆可以借助现成的数值库不用手推。再往后如果状态维度进一步升高比如加上位置、速度、偏置等运算量会上升需要考虑降维或者稀疏化。但这些都是后话。真正把新手挡在门外的从来不是高维矩阵而是最初那个二维的直觉没建立起来。我个人的体会是与其花时间纠结高级技巧不如把二维的物理意义彻底吃透后面加维度只是机械扩展难点始终在那个为什么P01能让角速度被修正的核心机制上。把这一章反复读几遍拿笔把那个数值例子推两遍你会发现卡尔曼滤波的神秘面纱其实薄得很。最后分享一个小技巧每次看到一个新公式先数维度、再对物理量、最后才看数值这个顺序能帮你避开绝大多数理解上的坑。
返回列表