<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://chachaprj.top/</id>
  <title type="text">ChaCha Prj</title>
  <subtitle type="text">Study &amp; Share</subtitle>
  <updated>2026-10-25T00:00:00.000Z</updated>
  <author><name>ChaCha</name></author>
  <link rel="alternate" href="https://chachaprj.top/"/>
  <link rel="self" href="https://chachaprj.top/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-25-%E7%A6%BB%E6%95%A3kf/</id>
      <title type="text">离散KF仿真</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-25-%E7%A6%BB%E6%95%A3kf/"/>
      <summary type="text">离散KF的预测、更新和贝叶斯推导，以及双质量块系统的Simulink仿真。</summary>
      <content type="html"><![CDATA[<section><h1>前置基础<a href="#前置基础"><span>#</span></a></h1><section><h2>连续时间状态空间表达式<a href="#连续时间状态空间表达式"><span>#</span></a></h2><p>对于线性定常系统，连续时间状态空间表达式为：</p><span><span><span>x˙(t)=Acx(t)+Bcu(t)\dot{x}(t)=A_cx(t)+B_cu(t)</span><span><span><span></span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>˙</span></span></span></span></span></span></span><span>(</span><span>t</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>x</span><span>(</span><span>t</span><span>)</span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>u</span><span>(</span><span>t</span><span>)</span></span></span></span></span><span><span><span>y(t)=Ccx(t)+Dcu(t)y(t)=C_cx(t)+D_cu(t)</span><span><span><span></span><span>y</span><span>(</span><span>t</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>x</span><span>(</span><span>t</span><span>)</span><span></span><span>+</span><span></span></span><span><span></span><span><span>D</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>u</span><span>(</span><span>t</span><span>)</span></span></span></span></span><p>其中<span><span>x(t)x(t)</span><span><span><span></span><span>x</span><span>(</span><span>t</span><span>)</span></span></span></span>为状态向量，<span><span>u(t)u(t)</span><span><span><span></span><span>u</span><span>(</span><span>t</span><span>)</span></span></span></span>为输入向量，<span><span>y(t)y(t)</span><span><span><span></span><span>y</span><span>(</span><span>t</span><span>)</span></span></span></span>为输出向量。<span><span>AcA_c</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>描述状态之间的关系，<span><span>BcB_c</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>描述输入对状态的影响，<span><span>CcC_c</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>将状态转换为输出，<span><span>DcD_c</span><span><span><span></span><span><span>D</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>为输入到输出的直接传递矩阵。</p><p>下标<span><span>cc</span><span><span><span></span><span>c</span></span></span></span>表示连续时间，后面的下标<span><span>dd</span><span><span><span></span><span>d</span></span></span></span>表示离散时间。</p></section><section><h2>离散时间状态空间表达式<a href="#离散时间状态空间表达式"><span>#</span></a></h2><p>令<span><span>xk=x(kT)x_k=x(kT)</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>x</span><span>(</span><span>k</span><span>T</span><span>)</span></span></span></span>，<span><span>uk=u(kT)u_k=u(kT)</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>u</span><span>(</span><span>k</span><span>T</span><span>)</span></span></span></span>，离散时间状态空间表达式为：</p><span><span><span>xk+1=Adxk+Bdukx_{k+1}=A_dx_k+B_du_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><span><span><span>yk=Cdxk+Dduky_k=C_dx_k+D_du_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>D</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>其中<span><span>TT</span><span><span><span></span><span>T</span></span></span></span>为采样时间，<span><span>kk</span><span><span><span></span><span>k</span></span></span></span>为采样序号。下面介绍由连续时间模型求<span><span>AdA_d</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>BdB_d</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的两种方法。</p><section><h3>向前欧拉<a href="#向前欧拉"><span>#</span></a></h3><p>用相邻两个采样点的差分近似导数：</p><span><span><span>x˙(kT)≈xk+1−xkT\dot{x}(kT)\approx\frac{x_{k+1}-x_k}{T}</span><span><span><span></span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>˙</span></span></span></span></span></span></span><span>(</span><span>k</span><span>T</span><span>)</span><span></span><span>≈</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>T</span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span></span><p>代入连续时间状态方程得：</p><span><span><span>xk+1=xk+T(Acxk+Bcuk)x_{k+1}=x_k+T(A_cx_k+B_cu_k)</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>T</span><span>(</span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span><p>整理得：</p><span><span><span>Ad=I+TAc,Bd=TBcA_d=I+TA_c,\qquad B_d=TB_c</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>I</span><span></span><span>+</span><span></span></span><span><span></span><span>T</span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>T</span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><span><span><span>Cd=Cc,Dd=DcC_d=C_c,\qquad D_d=D_c</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span></span><span><span>D</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>D</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>其中<span><span>II</span><span><span><span></span><span>I</span></span></span></span>为与<span><span>AcA_c</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>同阶的单位矩阵。向前欧拉是近似离散化，采样时间越小，通常越接近连续系统；采样时间过大时，也可能使原本稳定的系统在离散后变得不稳定。</p></section><section><h3>精确离散化<a href="#精确离散化"><span>#</span></a></h3><p>假设每个采样周期内输入保持不变，即<span><span>u(t)=uku(t)=u_k</span><span><span><span></span><span>u</span><span>(</span><span>t</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，<span><span>kT≤t&lt;(k+1)TkT\leq t&lt;(k+1)T</span><span><span><span></span><span>k</span><span>T</span><span></span><span>≤</span><span></span></span><span><span></span><span>t</span><span></span><span>&lt;</span><span></span></span><span><span></span><span>(</span><span>k</span><span></span><span>+</span><span></span></span><span><span></span><span>1</span><span>)</span><span>T</span></span></span></span>。对连续时间状态方程求解得：</p><span><span><span>xk+1=eAcTxk+(∫0TeAcτBc dτ)ukx_{k+1}=e^{A_cT}x_k+
\left(\int_0^T e^{A_c\tau}B_c\,d\tau\right)u_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>T</span></span></span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span><span>(</span></span><span><span>∫</span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>τ</span></span></span></span></span></span></span></span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>d</span><span>τ</span><span><span>)</span></span></span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>因此：</p><span><span><span>Ad=eAcT,Bd=∫0TeAcτBc dτA_d=e^{A_cT},\qquad
B_d=\int_0^T e^{A_c\tau}B_c\,d\tau</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>T</span></span></span></span></span></span></span></span></span><span>,</span><span></span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>∫</span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>τ</span></span></span></span></span></span></span></span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>d</span><span>τ</span></span></span></span></span><span><span><span>Cd=Cc,Dd=DcC_d=C_c,\qquad D_d=D_c</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span></span><span><span>D</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>D</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>若<span><span>AcA_c</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>可逆，则还可以写成：</p><span><span><span>Bd=Ac−1(Ad−I)BcB_d=A_c^{-1}(A_d-I)B_c</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span>I</span><span>)</span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>其中<span><span>eAcTe^{A_cT}</span><span><span><span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>T</span></span></span></span></span></span></span></span></span></span></span></span>为矩阵指数。这里的“精确”以采样周期内输入不变为前提，也就是<a href="https://www.mathworks.com/help/control/ug/continuous-discrete-conversion-methods.html" target="_blank">零阶保持</a>。后面的仿真使用向前欧拉离散化。</p></section></section><section><h2>贝叶斯法则<a href="#贝叶斯法则"><span>#</span></a></h2><p>贝叶斯法则为：</p><span><span><span>p(x∣z)=p(z∣x)p(x)p(z)p(x\mid z)=\frac{p(z\mid x)p(x)}{p(z)}</span><span><span><span></span><span>p</span><span>(</span><span>x</span><span></span><span>∣</span><span></span></span><span><span></span><span>z</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>p</span><span>(</span><span>z</span><span>)</span></span></span><span><span></span><span></span></span><span><span></span><span><span>p</span><span>(</span><span>z</span><span></span><span>∣</span><span></span><span>x</span><span>)</span><span>p</span><span>(</span><span>x</span><span>)</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span></span><p>其中：</p><ul>
<li><span><span>p(x)p(x)</span><span><span><span></span><span>p</span><span>(</span><span>x</span><span>)</span></span></span></span>是先验，表示得到当前观测之前，对<span><span>xx</span><span><span><span></span><span>x</span></span></span></span>的认识。</li>
<li><span><span>p(z∣x)p(z\mid x)</span><span><span><span></span><span>p</span><span>(</span><span>z</span><span></span><span>∣</span><span></span></span><span><span></span><span>x</span><span>)</span></span></span></span>是似然，表示状态为<span><span>xx</span><span><span><span></span><span>x</span></span></span></span>时，得到观测<span><span>zz</span><span><span><span></span><span>z</span></span></span></span>的可能性。</li>
<li><span><span>p(x∣z)p(x\mid z)</span><span><span><span></span><span>p</span><span>(</span><span>x</span><span></span><span>∣</span><span></span></span><span><span></span><span>z</span><span>)</span></span></span></span>是后验，表示得到观测<span><span>zz</span><span><span><span></span><span>z</span></span></span></span>后，对<span><span>xx</span><span><span><span></span><span>x</span></span></span></span>更新后的认识。</li>
<li><span><span>p(z)p(z)</span><span><span><span></span><span>p</span><span>(</span><span>z</span><span>)</span></span></span></span>是归一化因子，使后验概率密度的积分为1。</li>
</ul><p>当<span><span>zz</span><span><span><span></span><span>z</span></span></span></span>已经给定时，<span><span>p(z)p(z)</span><span><span><span></span><span>p</span><span>(</span><span>z</span><span>)</span></span></span></span>与<span><span>xx</span><span><span><span></span><span>x</span></span></span></span>无关，因此可以写成：</p><span><span><span>p(x∣z)∝p(z∣x)p(x)p(x\mid z)\propto p(z\mid x)p(x)</span><span><span><span></span><span>p</span><span>(</span><span>x</span><span></span><span>∣</span><span></span></span><span><span></span><span>z</span><span>)</span><span></span><span>∝</span><span></span></span><span><span></span><span>p</span><span>(</span><span>z</span><span></span><span>∣</span><span></span></span><span><span></span><span>x</span><span>)</span><span>p</span><span>(</span><span>x</span><span>)</span></span></span></span></span><p>在KF中，先根据系统数学模型得到先验，再结合传感器的观测得到后验。</p></section><section><h2>方差<a href="#方差"><span>#</span></a></h2><p>对于标量随机变量<span><span>XX</span><span><span><span></span><span>X</span></span></span></span>，方差为：</p><span><span><span>D(X)=E[(X−E(X))2]D(X)=E\left[(X-E(X))^2\right]</span><span><span><span></span><span>D</span><span>(</span><span>X</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>E</span><span></span><span><span><span>[</span></span><span>(</span><span>X</span><span></span><span>−</span><span></span><span>E</span><span>(</span><span>X</span><span>)</span><span><span>)</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span></span></span><p>对于状态向量<span><span>xx</span><span><span><span></span><span>x</span></span></span></span>，对应的是协方差矩阵：</p><span><span><span>P=E[(x−E(x))(x−E(x))T]P=E\left[(x-E(x))(x-E(x))^T\right]</span><span><span><span></span><span>P</span><span></span><span>=</span><span></span></span><span><span></span><span>E</span><span></span><span><span><span>[</span></span><span>(</span><span>x</span><span></span><span>−</span><span></span><span>E</span><span>(</span><span>x</span><span>))</span><span>(</span><span>x</span><span></span><span>−</span><span></span><span>E</span><span>(</span><span>x</span><span>)</span><span><span>)</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span></span></span><p>若用<span><span>x^\hat{x}</span><span><span><span></span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>^</span></span></span></span></span></span></span></span></span></span>估计<span><span>xx</span><span><span><span></span><span>x</span></span></span></span>，令估计误差为<span><span>e=x−x^e=x-\hat{x}</span><span><span><span></span><span>e</span><span></span><span>=</span><span></span></span><span><span></span><span>x</span><span></span><span>−</span><span></span></span><span><span></span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>^</span></span></span></span></span></span></span></span></span></span>，在无偏估计的条件下有：</p><span><span><span>P=E[eeT]P=E[ee^T]</span><span><span><span></span><span>P</span><span></span><span>=</span><span></span></span><span><span></span><span>E</span><span>[</span><span>e</span><span><span>e</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span>]</span></span></span></span></span><p>也就是误差乘以误差的转置，然后取均值。协方差矩阵的对角元素是各个状态的误差方差，非对角元素表示不同状态误差之间的相关性。</p></section><section><h2>一阶马尔可夫性<a href="#一阶马尔可夫性"><span>#</span></a></h2><p>一阶马尔可夫性（first-order Markov property）常被称为“无后效性”：给定当前状态后，未来的演化只依赖当前状态，而与更早的历史无关。</p><span><span><span>p(xk∣x0,x1,…,xk−1)=p(xk∣xk−1)p(x_k\mid x_0,x_1,\ldots,x_{k-1})
=p(x_k\mid x_{k-1})</span><span><span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span>…</span><span></span><span>,</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span><p>“一阶”表示记忆长度为 1：只需要记住“现在”，不需要记住“过去”。</p><p>对于包含已知输入的状态方程，还需要给定对应的输入：</p><span><span><span>p(xk∣x0:k−1,u0:k−1)=p(xk∣xk−1,uk−1)p(x_k\mid x_{0:k-1},u_{0:k-1})
=p(x_k\mid x_{k-1},u_{k-1})</span><span><span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span><p>其中<span><span>x0:k−1x_{0:k-1}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>表示从<span><span>x0x_0</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>到<span><span>xk−1x_{k-1}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的全部状态。这里要求状态已经包含描述系统演化所需的信息，并且当前过程噪声与过去的状态、输入无关。</p></section></section>
<section><h1>离散KF<a href="#离散kf"><span>#</span></a></h1><section><h2>核心公式<a href="#核心公式"><span>#</span></a></h2><p>先统一符号。本文沿用后面Simulink图中的命名，<span><span>RR</span><span><span><span></span><span>R</span></span></span></span>为状态方程中的过程噪声协方差，<span><span>QQ</span><span><span><span></span><span>Q</span></span></span></span>为量测噪声协方差。部分资料会将这两个字母反过来使用，阅读时需要先看各自的定义。</p><p><span><span>xk,prevx_{k,\mathrm{prev}}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>Pk,prevP_{k,\mathrm{prev}}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>分别表示预测得到的状态和误差协方差，也就是先验。<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>分别表示结合当前观测更新后的状态和误差协方差，也就是后验。</p><section><h3>预测<a href="#预测"><span>#</span></a></h3><span><span><span>xk,prev=Adxˉk−1+Bduk−1x_{k,\mathrm{prev}}=A_d\bar{x}_{k-1}+B_du_{k-1}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><span><span><span>Pk,prev=AdPk−1AdT+RP_{k,\mathrm{prev}}=A_dP_{k-1}A_d^T+R</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>R</span></span></span></span></span></section><section><h3>更新<a href="#更新"><span>#</span></a></h3><span><span><span>Kk=Pk,prevCkT(CkPk,prevCkT+Q)−1K_k=P_{k,\mathrm{prev}}C_k^T
\left(C_kP_{k,\mathrm{prev}}C_k^T+Q\right)^{-1}</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span><span><span>(</span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span>Q</span><span><span>)</span></span></span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span></span></span></span></span><span><span><span>xˉk=xk,prev+Kk(zk−Ckxk,prev)\bar{x}_k=x_{k,\mathrm{prev}}
+K_k\left(z_k-C_kx_{k,\mathrm{prev}}\right)</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span></span><span><span><span>Pk=(I−KkCk)Pk,prevP_k=(I-K_kC_k)P_{k,\mathrm{prev}}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>(</span><span>I</span><span></span><span>−</span><span></span></span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>其中<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是传感器采集结果，<span><span>CkC_k</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是观测矩阵，<span><span>KkK_k</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是卡尔曼增益，<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>就是滤波结果。<span><span>zk−Ckxk,prevz_k-C_kx_{k,\mathrm{prev}}</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>称为新息，表示实际观测与预测观测之间的差。</p><p>每个采样周期先预测，再更新。更新后的<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>会用于下一个周期的预测。</p></section></section><section><h2>推导离散KF<a href="#推导离散kf"><span>#</span></a></h2><p>离散状态空间表达式：</p><span><span><span>xk=Adxk−1+Bduk−1+ξk−1(1)x_k=A_dx_{k-1}+B_du_{k-1}+\xi_{k-1}\tag{1}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span></span><span><span>(</span><span><span>1</span></span><span>)</span></span></span></span></span></span><span><span><span>zk=Ckxk+vk(2)z_k=C_kx_k+v_k\tag{2}</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span></span><span><span>(</span><span><span>2</span></span><span>)</span></span></span></span></span></span><p>其中<span><span>ξk−1\xi_{k-1}</span><span><span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>为直接加在状态上的过程噪声，<span><span>vkv_k</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>为量测噪声。假设二者都是零均值高斯白噪声，相互独立，并且与初始状态独立：</p><span><span><span>ξk−1∼N(0,R),vk∼N(0,Q)\xi_{k-1}\sim\mathcal{N}(0,R),\qquad
v_k\sim\mathcal{N}(0,Q)</span><span><span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∼</span><span></span></span><span><span></span><span>N</span><span>(</span><span>0</span><span>,</span><span></span><span>R</span><span>)</span><span>,</span><span></span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∼</span><span></span></span><span><span></span><span>N</span><span>(</span><span>0</span><span>,</span><span></span><span>Q</span><span>)</span></span></span></span></span><p>初始状态服从高斯分布，均值为<span><span>xˉ0\bar{x}_0</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，协方差为<span><span>P0P_0</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。<span><span>uku_k</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是已知输入。为便于下面求逆，假设<span><span>Pk,prevP_{k,\mathrm{prev}}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>QQ</span><span><span><span></span><span>Q</span></span></span></span>为正定矩阵。</p><p>后面的仿真将干扰<span><span>wkw_k</span><span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>加在输入端，此时<span><span>ξk=Bdwk\xi_k=B_dw_k</span><span><span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，<span><span>RR</span><span><span><span></span><span>R</span></span></span></span>需要由输入干扰的协方差换算得到。</p><section><h3>由系统数学模型（状态空间表达式）对<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>进行预测<a href="#由系统数学模型状态空间表达式对xkx_kxk进行预测"><span>#</span></a></h3><p>对(1)两侧求期望。这里的期望以已经得到的历史观测和已知输入为条件，由于过程噪声均值为0，有：</p><span><span><span>xk,prev=Adxˉk−1+Bduk−1(3)x_{k,\mathrm{prev}}=A_d\bar{x}_{k-1}+B_du_{k-1}\tag{3}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span></span><span><span>(</span><span><span>3</span></span><span>)</span></span></span></span></span></span><p>由(1) - (3)得预测误差：</p><span><span><span>ek,prev=xk−xk,prev=Ad(xk−1−xˉk−1)+ξk−1=Adek−1+ξk−1(4)\begin{aligned}
e_{k,\mathrm{prev}}
&amp;=x_k-x_{k,\mathrm{prev}}\\
&amp;=A_d(x_{k-1}-\bar{x}_{k-1})+\xi_{k-1}\\
&amp;=A_de_{k-1}+\xi_{k-1}
\end{aligned}\tag{4}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>+</span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span>(</span><span><span>4</span></span><span>)</span></span></span></span></span></span><p>有了误差可以得出<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的预测误差协方差：</p><span><span><span>Pk,prev=E[ek,prevek,prevT](5)P_{k,\mathrm{prev}}
=E\left[e_{k,\mathrm{prev}}e_{k,\mathrm{prev}}^T\right]\tag{5}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>E</span><span></span><span><span><span>[</span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>]</span></span></span></span><span><span></span><span><span>(</span><span><span>5</span></span><span>)</span></span></span></span></span></span><p>将(4)代入(5)得：</p><span><span><span>Pk,prev=E[(Adek−1+ξk−1)(Adek−1+ξk−1)T]=AdE[ek−1ek−1T]AdT+AdE[ek−1ξk−1T]+E[ξk−1ek−1T]AdT+E[ξk−1ξk−1T]\begin{aligned}
P_{k,\mathrm{prev}}
&amp;=E\left[(A_de_{k-1}+\xi_{k-1})
(A_de_{k-1}+\xi_{k-1})^T\right]\\
&amp;=A_dE[e_{k-1}e_{k-1}^T]A_d^T
+A_dE[e_{k-1}\xi_{k-1}^T]\\
&amp;\quad+E[\xi_{k-1}e_{k-1}^T]A_d^T
+E[\xi_{k-1}\xi_{k-1}^T]
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>E</span><span></span><span><span><span>[</span></span><span>(</span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span>(</span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>E</span><span>[</span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>]</span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>E</span><span>[</span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>]</span></span></span><span><span></span><span><span></span><span></span><span></span><span>+</span><span></span><span>E</span><span>[</span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>]</span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span>E</span><span>[</span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>]</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>由于当前过程噪声与上一时刻的估计误差独立，且均值为0，中间两项为0，因此：</p><span><span><span>Pk,prev=AdPk−1AdT+R(6)P_{k,\mathrm{prev}}=A_dP_{k-1}A_d^T+R\tag{6}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>R</span></span><span><span></span><span><span>(</span><span><span>6</span></span><span>)</span></span></span></span></span></span><p>到这里，根据上一时刻的滤波结果，得到了当前时刻的状态预测值和预测误差协方差。</p></section><section><h3>由贝叶斯法则对<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>KkK_k</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>进行更新<a href="#由贝叶斯法则对pkp_kpkkkk_kkkxˉkbarx_kxˉk进行更新"><span>#</span></a></h3><section><h4>计算<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的概率分布<a href="#计算xkx_kxk的概率分布"><span>#</span></a></h4><p>得到当前观测<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>后，根据贝叶斯法则有：</p><span><span><span>p(xk∣u0:k−1,z1:k)=p(zk∣xk,u0:k−1,z1:k−1)p(xk∣u0:k−1,z1:k−1)p(zk∣u0:k−1,z1:k−1)p(x_k\mid u_{0:k-1},z_{1:k})
=\frac{
p(z_k\mid x_k,u_{0:k-1},z_{1:k-1})
p(x_k\mid u_{0:k-1},z_{1:k-1})
}{p(z_k\mid u_{0:k-1},z_{1:k-1})}</span><span><span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>p</span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span><span><span></span><span></span></span><span><span></span><span><span>p</span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span></span><p>这里的初始分布由<span><span>xˉ0\bar{x}_0</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>P0P_0</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>给定。分母与待估计的<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>无关，将分母拿掉得：</p><span><span><span>p(xk∣u0:k−1,z1:k)∝p(zk∣xk,u0:k−1,z1:k−1)⋅p(xk∣u0:k−1,z1:k−1)\begin{aligned}
p(x_k\mid u_{0:k-1},z_{1:k})
\propto{}&amp;p(z_k\mid x_k,u_{0:k-1},z_{1:k-1})\\
&amp;\cdot p(x_k\mid u_{0:k-1},z_{1:k-1})
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>∝</span><span></span><span></span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span>p</span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span><span><span></span><span><span></span><span></span><span>⋅</span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>由一阶马尔可夫性，预测分布只需要通过上一时刻的状态分布递推：</p><span><span><span>p(xk∣u0:k−1,z1:k−1)=∫p(xk∣xk−1,uk−1)⋅p(xk−1∣u0:k−2,z1:k−1) dxk−1\begin{aligned}
p(x_k\mid u_{0:k-1},z_{1:k-1})
=\int{}&amp;p(x_k\mid x_{k-1},u_{k-1})\\
&amp;\cdot p(x_{k-1}\mid u_{0:k-2},z_{1:k-1})\,dx_{k-1}
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span><span>∫</span><span></span><span></span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span><span><span></span><span><span></span><span></span><span>⋅</span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>2</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>d</span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>上一时刻的后验为高斯分布，状态方程是线性的，过程噪声也是高斯分布，因此预测分布仍然是高斯分布，其均值和协方差就是前面求出的结果：</p><span><span><span>p(xk∣u0:k−1,z1:k−1)=N(xk;xk,prev,Pk,prev)p(x_k\mid u_{0:k-1},z_{1:k-1})
=\mathcal{N}(x_k;x_{k,\mathrm{prev}},P_{k,\mathrm{prev}})</span><span><span><span></span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>N</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>;</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span><p>由(2)和量测噪声的独立性可得，给定<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>后，当前观测与历史观测无关，因此似然为：</p><span><span><span>p(zk∣xk,u0:k−1,z1:k−1)=p(zk∣xk)=N(zk;Ckxk,Q)p(z_k\mid x_k,u_{0:k-1},z_{1:k-1})
=p(z_k\mid x_k)=\mathcal{N}(z_k;C_kx_k,Q)</span><span><span><span></span><span>p</span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>p</span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>N</span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>;</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span>Q</span><span>)</span></span></span></span></span><p>将这两个高斯分布代入，并去掉与<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>无关的系数：</p><span><span><span>p(xk∣u0:k−1,z1:k)∝p(zk∣xk)p(xk∣u0:k−1,z1:k−1)∝exp⁡[−12(zk−Ckxk)TQ−1(zk−Ckxk)]⋅exp⁡[−12(xk−xk,prev)TPk,prev−1(xk−xk,prev)]∝exp⁡[−12J(xk)]\begin{aligned}
p(x_k\mid u_{0:k-1},z_{1:k})
&amp;\propto p(z_k\mid x_k)
p(x_k\mid u_{0:k-1},z_{1:k-1})\\
&amp;\propto \exp\left[-\frac12(z_k-C_kx_k)^TQ^{-1}(z_k-C_kx_k)\right]\\
&amp;\quad\cdot\exp\left[-\frac12(x_k-x_{k,\mathrm{prev}})^T
P_{k,\mathrm{prev}}^{-1}(x_k-x_{k,\mathrm{prev}})\right]\\
&amp;\propto \exp\left[-\frac12J(x_k)\right]
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span><span><span></span><span></span></span><span><span></span><span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>∝</span><span></span><span>p</span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span>p</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>∣</span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>0</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span><span>1</span><span>:</span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span><span><span></span><span><span></span><span></span><span>∝</span><span></span><span>exp</span><span></span><span><span><span>[</span></span><span>−</span><span><span></span><span><span><span><span><span><span></span><span><span>2</span></span></span><span><span></span><span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>]</span></span></span></span></span><span><span></span><span><span></span><span></span><span></span><span>⋅</span><span></span><span>exp</span><span></span><span><span><span>[</span></span><span>−</span><span><span></span><span><span><span><span><span><span></span><span><span>2</span></span></span><span><span></span><span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>]</span></span></span></span></span><span><span></span><span><span></span><span></span><span>∝</span><span></span><span>exp</span><span></span><span><span><span>[</span></span><span>−</span><span><span></span><span><span><span><span><span><span></span><span><span>2</span></span></span><span><span></span><span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>]</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>其中：</p><span><span><span>J(xk)=(xk−xk,prev)TPk,prev−1(xk−xk,prev)+(zk−Ckxk)TQ−1(zk−Ckxk)\begin{aligned}
J(x_k)
&amp;=(x_k-x_{k,\mathrm{prev}})^TP_{k,\mathrm{prev}}^{-1}
(x_k-x_{k,\mathrm{prev}})\\
&amp;\quad+(z_k-C_kx_k)^TQ^{-1}(z_k-C_kx_k)
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span><span><span></span><span><span></span><span></span><span></span><span>+</span><span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>第一项描述当前状态与模型预测之间的差，第二项描述当前状态对应的输出与实际观测之间的差。协方差的逆决定这两项各自的权重。</p></section><section><h4>求使<span><span>J(xk)J(x_k)</span><span><span><span></span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span>最小的条件，即使概率最大的条件<a href="#求使jxkjx_kjxk最小的条件即使概率最大的条件"><span>#</span></a></h4><p>在离散卡尔曼滤波（KF）中，让后验概率密度更大（即求最大后验估计，MAP），本质上是因为我们希望在获得新的观测数据后，寻找当前状态<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>最有可能的取值。</p><p>由于后验概率密度正比于<span><span>exp⁡[−J(xk)/2]\exp[-J(x_k)/2]</span><span><span><span></span><span>exp</span><span>[</span><span>−</span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span>/2</span><span>]</span></span></span></span>，因此使<span><span>J(xk)J(x_k)</span><span><span><span></span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span>最小，就是使后验概率密度最大。</p><p>对<span><span>J(xk)J(x_k)</span><span><span><span></span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span>求导：</p><span><span><span>∂J∂xk=2Pk,prev−1(xk−xk,prev)−2CkTQ−1(zk−Ckxk)\frac{\partial J}{\partial x_k}
=2P_{k,\mathrm{prev}}^{-1}(x_k-x_{k,\mathrm{prev}})
-2C_k^TQ^{-1}(z_k-C_kx_k)</span><span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>∂</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span><span>∂</span><span>J</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>2</span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>−</span><span></span></span><span><span></span><span>2</span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span><p>令导数为0，整理得：</p><span><span><span>(Pk,prev−1+CkTQ−1Ck)xk=Pk,prev−1xk,prev+CkTQ−1zk\left(P_{k,\mathrm{prev}}^{-1}+C_k^TQ^{-1}C_k\right)x_k
=P_{k,\mathrm{prev}}^{-1}x_{k,\mathrm{prev}}+C_k^TQ^{-1}z_k</span><span><span><span></span><span><span><span>(</span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span></span></span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>又因为：</p><span><span><span>∂2J∂xk∂xkT=2(Pk,prev−1+CkTQ−1Ck)&gt;0\frac{\partial^2J}{\partial x_k\partial x_k^T}
=2\left(P_{k,\mathrm{prev}}^{-1}+C_k^TQ^{-1}C_k\right)&gt;0</span><span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>∂</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>∂</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>∂</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span><span>J</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>2</span><span></span><span><span><span>(</span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span></span></span><span></span><span>&gt;</span><span></span></span><span><span></span><span>0</span></span></span></span></span><p>满足上式条件时可以使<span><span>J(xk)J(x_k)</span><span><span><span></span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span>取得唯一的最小值。将这个<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>记为<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</p><p>将<span><span>J(xk)J(x_k)</span><span><span><span></span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span>配方得：</p><span><span><span>J(xk)=(xk−xˉk)T(Pk,prev−1+CkTQ−1Ck)(xk−xˉk)+常数J(x_k)=(x_k-\bar{x}_k)^T
\left(P_{k,\mathrm{prev}}^{-1}+C_k^TQ^{-1}C_k\right)
(x_k-\bar{x}_k)+\text{常数}</span><span><span><span></span><span>J</span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span><span></span><span><span><span>(</span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span></span></span><span></span><span>(</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>+</span><span></span></span><span><span></span><span><span>常数</span></span></span></span></span></span><p>与高斯分布的指数部分比较，可得后验协方差：</p><span><span><span>Pk=(Pk,prev−1+CkTQ−1Ck)−1P_k=\left(P_{k,\mathrm{prev}}^{-1}+C_k^TQ^{-1}C_k\right)^{-1}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span>(</span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span></span></span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span></span></span></span></span><p>因此：</p><span><span><span>xˉk=Pk(Pk,prev−1xk,prev+CkTQ−1zk)\bar{x}_k=P_k\left(P_{k,\mathrm{prev}}^{-1}x_{k,\mathrm{prev}}
+C_k^TQ^{-1}z_k\right)</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span><span>(</span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>)</span></span></span></span></span></span></span><p>利用矩阵求逆引理，可以将<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>改写成：</p><span><span><span>Pk=Pk,prev−Pk,prevCkT(CkPk,prevCkT+Q)−1CkPk,prevP_k=P_{k,\mathrm{prev}}-P_{k,\mathrm{prev}}C_k^T
\left(C_kP_{k,\mathrm{prev}}C_k^T+Q\right)^{-1}
C_kP_{k,\mathrm{prev}}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span><span><span>(</span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span>Q</span><span><span>)</span></span></span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>令卡尔曼增益为：</p><span><span><span>Kk=Pk,prevCkT(CkPk,prevCkT+Q)−1K_k=P_{k,\mathrm{prev}}C_k^T
\left(C_kP_{k,\mathrm{prev}}C_k^T+Q\right)^{-1}</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span><span><span>(</span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span>Q</span><span><span>)</span></span></span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span></span></span></span></span><p>则有：</p><span><span><span>Pk=(I−KkCk)Pk,prevP_k=(I-K_kC_k)P_{k,\mathrm{prev}}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>(</span><span>I</span><span></span><span>−</span><span></span></span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>由上述定义还可以得到<span><span>PkCkTQ−1=KkP_kC_k^TQ^{-1}=K_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>Q</span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>PkPk,prev−1=I−KkCkP_kP_{k,\mathrm{prev}}^{-1}=I-K_kC_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>I</span><span></span><span>−</span><span></span></span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，代入<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的表达式：</p><span><span><span>xˉk=(I−KkCk)xk,prev+Kkzk=xk,prev+Kk(zk−Ckxk,prev)\begin{aligned}
\bar{x}_k
&amp;=(I-K_kC_k)x_{k,\mathrm{prev}}+K_kz_k\\
&amp;=x_{k,\mathrm{prev}}+K_k(z_k-C_kx_{k,\mathrm{prev}})
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>(</span><span>I</span><span></span><span>−</span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>整理得更新公式：</p><span><span><span>Kk=Pk,prevCkT(CkPk,prevCkT+Q)−1Pk=(I−KkCk)Pk,prevxˉk=xk,prev+Kk(zk−Ckxk,prev)\begin{aligned}
K_k&amp;=P_{k,\mathrm{prev}}C_k^T
\left(C_kP_{k,\mathrm{prev}}C_k^T+Q\right)^{-1}\\
P_k&amp;=(I-K_kC_k)P_{k,\mathrm{prev}}\\
\bar{x}_k&amp;=x_{k,\mathrm{prev}}
+K_k(z_k-C_kx_{k,\mathrm{prev}})
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span><span><span>(</span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span>Q</span><span><span>)</span></span></span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>(</span><span>I</span><span></span><span>−</span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>其中<span><span>KkK_k</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>用于分配预测和观测的权重。<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是根据贝叶斯法则更新后的值（后验），<span><span>Pk,prevP_{k,\mathrm{prev}}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>xk,prevx_{k,\mathrm{prev}}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是根据数学模型计算的预测值（先验）。</p><p><span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是滤波后的结果。在这里的线性高斯条件下，后验的最大值点也等于后验均值，因此这个结果同时也是最小均方误差估计。</p></section></section></section></section>
<section><h1>Simulink仿真<a href="#simulink仿真"><span>#</span></a></h1><section><h2>背景<a href="#背景"><span>#</span></a></h2><p></p><figure><img alt="双质量块—弹簧—阻尼系统" loading="lazy" width="2312" height="850" src="/_astro/image-9.6Tvi9-xu_qnwyz.webp" /><figcaption>双质量块—弹簧—阻尼系统</figcaption></figure><p></p><p>系统由两个质量块和三个弹簧—阻尼支路组成。两个质量块分别受到外力<span><span>u1+d1u_1+d_1</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>d</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>u2+d2u_2+d_2</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>d</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，其中<span><span>u1u_1</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>u2u_2</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>为已知输入，<span><span>d1d_1</span><span><span><span></span><span><span>d</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>d2d_2</span><span><span><span></span><span><span>d</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>为未知干扰。传感器分别测量两个质量块的位移<span><span>p1p_1</span><span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>p2p_2</span><span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</p><p>三个连接支路中的弹簧和阻尼器均为并联。位移相对无外力时的平衡位置定义，位移、速度和外力均以向右为正。忽略摩擦非线性、限位和弹簧非线性。</p><p>图中参数为：</p><span><span><span>m1=m2=1 kgk1=k2=2 N/m,kc=1 N/mc1=c2=0.2 N⋅s/m,cc=0.1 N⋅s/m\begin{aligned}
m_1=m_2&amp;=1\ \mathrm{kg}\\
k_1=k_2&amp;=2\ \mathrm{N/m},\qquad k_c=1\ \mathrm{N/m}\\
c_1=c_2&amp;=0.2\ \mathrm{N\cdot s/m},\qquad c_c=0.1\ \mathrm{N\cdot s/m}
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span><span>m</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span><span><span>m</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span>k</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span><span><span>k</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span>c</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span><span><span>c</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>1</span><span> </span><span><span>kg</span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>2</span><span> </span><span><span>N/m</span></span><span>,</span><span></span><span></span><span><span>k</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span><span>1</span><span> </span><span><span>N/m</span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>0.2</span><span> </span><span><span>N</span><span></span><span>⋅</span><span></span><span>s/m</span></span><span>,</span><span></span><span></span><span><span>c</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span><span>0.1</span><span> </span><span><span>N</span><span></span><span>⋅</span><span></span><span>s/m</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><section><h3>求连续时间状态空间表达式<a href="#求连续时间状态空间表达式"><span>#</span></a></h3><p>根据牛顿第二定律，两个质量块分别有：</p><span><span><span>m1p¨1=−k1p1−c1p˙1+kc(p2−p1)+cc(p˙2−p˙1)+u1+d1m_1\ddot{p}_1=-k_1p_1-c_1\dot{p}_1
+k_c(p_2-p_1)+c_c(\dot{p}_2-\dot{p}_1)+u_1+d_1</span><span><span><span></span><span><span>m</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>¨</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>−</span><span><span>k</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>c</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>k</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>+</span><span></span></span><span><span></span><span><span>c</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>+</span><span></span></span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>d</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><span><span><span>m2p¨2=−k2p2−c2p˙2+kc(p1−p2)+cc(p˙1−p˙2)+u2+d2m_2\ddot{p}_2=-k_2p_2-c_2\dot{p}_2
+k_c(p_1-p_2)+c_c(\dot{p}_1-\dot{p}_2)+u_2+d_2</span><span><span><span></span><span><span>m</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>¨</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>−</span><span><span>k</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>c</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>k</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>+</span><span></span></span><span><span></span><span><span>c</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span></span><span>+</span><span></span></span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>d</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>令<span><span>v1=p˙1v_1=\dot{p}_1</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，<span><span>v2=p˙2v_2=\dot{p}_2</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>˙</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，输入和干扰分别为：</p><span><span><span>u=[u1u2],d=[d1d2]u=\begin{bmatrix}u_1\\u_2\end{bmatrix},\qquad
d=\begin{bmatrix}d_1\\d_2\end{bmatrix}</span><span><span><span></span><span>u</span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span><span>u</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span>u</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span><span></span><span>,</span><span></span><span></span><span>d</span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span><span>d</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span>d</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span></span></span><p>取 <span><span>x=[p1,v1,p2,v2]Tx=[p_1,v_1,p_2,v_2]^T</span><span><span><span></span><span>x</span><span></span><span>=</span><span></span></span><span><span></span><span>[</span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>]</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span></span></span></span>，代入上述参数：</p><span><span><span>x˙=Acx+Bc(u+d),y=Cx\dot x=A_cx+B_c(u+d),\qquad y=Cx</span><span><span><span></span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>˙</span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>x</span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span>u</span><span></span><span>+</span><span></span></span><span><span></span><span>d</span><span>)</span><span>,</span><span></span><span></span><span>y</span><span></span><span>=</span><span></span></span><span><span></span><span>C</span><span>x</span></span></span></span></span><span><span><span>Ac=[0100−3−0.310.1000110.1−3−0.3],Bc=[00100001]A_c=
\begin{bmatrix}
0&amp;1&amp;0&amp;0\\
-3&amp;-0.3&amp;1&amp;0.1\\
0&amp;0&amp;0&amp;1\\
1&amp;0.1&amp;-3&amp;-0.3
\end{bmatrix},\qquad
B_c=
\begin{bmatrix}
0&amp;0\\
1&amp;0\\
0&amp;0\\
0&amp;1
\end{bmatrix}</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>−</span><span>3</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>−</span><span>0.3</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0.1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>−</span><span>3</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0.1</span></span></span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>−</span><span>0.3</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span></span><span>,</span><span></span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><span><span><span>C=[10000010],D=02×2C=
\begin{bmatrix}
1&amp;0&amp;0&amp;0\\
0&amp;0&amp;1&amp;0
\end{bmatrix},\qquad D=0_{2\times2}</span><span><span><span></span><span>C</span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span><span></span><span>,</span><span></span><span></span><span>D</span><span></span><span>=</span><span></span></span><span><span></span><span><span>0</span><span><span><span><span><span><span></span><span><span><span>2</span><span>×</span><span>2</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></section><section><h3>求向前欧拉离散时间表达式<a href="#求向前欧拉离散时间表达式"><span>#</span></a></h3><p>由<span><span>Ad=I4+TAcA_d=I_4+TA_c</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>I</span><span><span><span><span><span><span></span><span><span>4</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>T</span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>Bd=TBcB_d=TB_c</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>T</span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>得：</p><span><span><span>Ad=[1T00−3T1−0.3TT0.1T001TT0.1T−3T1−0.3T],Bd=[00T0000T]A_d=
\begin{bmatrix}
1&amp;T&amp;0&amp;0\\
-3T&amp;1-0.3T&amp;T&amp;0.1T\\
0&amp;0&amp;1&amp;T\\
T&amp;0.1T&amp;-3T&amp;1-0.3T
\end{bmatrix},\qquad
B_d=
\begin{bmatrix}
0&amp;0\\
T&amp;0\\
0&amp;0\\
0&amp;T
\end{bmatrix}</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>−</span><span>3</span><span>T</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>T</span></span></span><span><span></span><span><span>1</span><span></span><span>−</span><span></span><span>0.3</span><span>T</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0.1</span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>T</span></span></span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>−</span><span>3</span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0.1</span><span>T</span></span></span><span><span></span><span><span>T</span></span></span><span><span></span><span><span>1</span><span></span><span>−</span><span></span><span>0.3</span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span></span><span>,</span><span></span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>T</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>将离散后的输入干扰记为<span><span>wkw_k</span><span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，并在输出端加入量测误差<span><span>vkv_k</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>：</p><span><span><span>xk+1=Adxk+Bd(uk+wk)x_{k+1}=A_dx_k+B_d(u_k+w_k)</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span><span><span><span>yk=Cxk,zk=yk+vk=Cxk+vky_k=Cx_k,\qquad z_k=y_k+v_k=Cx_k+v_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>C</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>C</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>其中<span><span>wkw_k</span><span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>vkv_k</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>分别是输入干扰和量测误差，均为<span><span>2×12\times1</span><span><span><span></span><span>2</span><span></span><span>×</span><span></span></span><span><span></span><span>1</span></span></span></span>向量。状态中的<span><span>v1v_1</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>v2v_2</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>表示速度，这里的<span><span>vkv_k</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>表示量测噪声。</p><p>令输入干扰的协方差为<span><span>W=E[wkwkT]W=E[w_kw_k^T]</span><span><span><span></span><span>W</span><span></span><span>=</span><span></span></span><span><span></span><span>E</span><span>[</span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>]</span></span></span></span>，则加在状态上的过程噪声为<span><span>ξk=Bdwk\xi_k=B_dw_k</span><span><span><span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，因此预测公式中的<span><span>RR</span><span><span><span></span><span>R</span></span></span></span>应为：</p><span><span><span>R=E[ξkξkT]=BdWBdTR=E[\xi_k\xi_k^T]=B_dWB_d^T</span><span><span><span></span><span>R</span><span></span><span>=</span><span></span></span><span><span></span><span>E</span><span>[</span><span><span>ξ</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>ξ</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>]</span><span></span><span>=</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>W</span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>量测噪声协方差为：</p><span><span><span>Q=E[vkvkT]Q=E[v_kv_k^T]</span><span><span><span></span><span>Q</span><span></span><span>=</span><span></span></span><span><span></span><span>E</span><span>[</span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>]</span></span></span></span></span><p><span><span>RR</span><span><span><span></span><span>R</span></span></span></span>是<span><span>4×44\times4</span><span><span><span></span><span>4</span><span></span><span>×</span><span></span></span><span><span></span><span>4</span></span></span></span>矩阵，<span><span>QQ</span><span><span><span></span><span>Q</span></span></span></span>是<span><span>2×22\times2</span><span><span><span></span><span>2</span><span></span><span>×</span><span></span></span><span><span></span><span>2</span></span></span></span>矩阵。输入噪声经过<span><span>BdB_d</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>后才影响状态，所以不能直接将<span><span>2×22\times2</span><span><span><span></span><span>2</span><span></span><span>×</span><span></span></span><span><span></span><span>2</span></span></span></span>的<span><span>WW</span><span><span><span></span><span>W</span></span></span></span>接到预测<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的<span><span>RR</span><span><span><span></span><span>R</span></span></span></span>端口。</p></section><section><h3>搭建原系统模型<a href="#搭建原系统模型"><span>#</span></a></h3><ol>
<li>设置仿真步长为<code>1e-6</code>。</li>
</ol><p></p><figure><img alt="设置固定仿真步长" loading="lazy" width="894" height="709" src="/_astro/image-15.BlBLSloS_Z1Y1yh5.webp" /><figcaption>设置固定仿真步长</figcaption></figure><p></p><p>这里令采样时间<span><span>T=10−6 sT=10^{-6}\,\mathrm{s}</span><span><span><span></span><span>T</span><span></span><span>=</span><span></span></span><span><span></span><span>1</span><span><span>0</span><span><span><span><span><span><span></span><span><span><span>−</span><span>6</span></span></span></span></span></span></span></span></span><span></span><span>s</span></span></span></span>。原系统、KF以及噪声源均按这个周期更新，所有<a href="https://www.mathworks.com/help/simulink/slref/unitdelay.html" target="_blank">Unit Delay</a>块的采样时间也设为<span><span>TT</span><span><span><span></span><span>T</span></span></span></span>，保证图中的<span><span>1/z1/z</span><span><span><span></span><span>1/</span><span>z</span></span></span></span>表示一个采样周期的延迟。</p><ol>
<li>求<span><span>AdA_d</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>Ad=I4+TAcA_d=I_4+TA_c</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>I</span><span><span><span><span><span><span></span><span><span>4</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>T</span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="计算离散状态矩阵Ad" loading="lazy" width="736" height="265" src="/_astro/image-10.DOkRgE54_8fnhI.webp" /><figcaption>计算离散状态矩阵Ad</figcaption></figure><p></p><ol>
<li>求<span><span>BdB_d</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>Bd=TBcB_d=TB_c</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>T</span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="计算离散输入矩阵Bd" loading="lazy" width="411" height="164" src="/_astro/image-11.LmOdIXYy_Z1YzXQr.webp" /><figcaption>计算离散输入矩阵Bd</figcaption></figure><p></p><ol>
<li>求<span><span>xk+1x_{k+1}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>xk+1=Adxk+Bdukx_{k+1}=A_dx_k+B_du_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="计算下一时刻状态" loading="lazy" width="600" height="470" src="/_astro/image-12.BaJdzlNI_Z1VsHDW.webp" /><figcaption>计算下一时刻状态</figcaption></figure><p></p><p>这个子系统只负责状态递推，输入干扰会在外部与<span><span>uku_k</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>相加后一起送入。</p><ol>
<li>求<span><span>yky_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>yk=Cxky_k=Cx_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>C</span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="由状态计算两个位移输出" loading="lazy" width="553" height="394" src="/_astro/image-13.DQf3R3Tb_Z20QrML.webp" /><figcaption>由状态计算两个位移输出</figcaption></figure><p></p><ol>
<li>将上面4个模型分别创建子系统，然后搭建系统模型。</li>
</ol><p></p><figure><img alt="连接原系统的各个子系统" loading="lazy" width="1202" height="671" src="/_astro/image-14.CIvd_PTc_Z1otaiu.webp" /><figcaption>连接原系统的各个子系统</figcaption></figure><p></p><p>其中<span><span>wkw_k</span><span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是噪声/干扰。将<span><span>uk+wku_k+w_k</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>接入状态递推子系统，得到<span><span>xk+1x_{k+1}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>+</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，再通过Unit Delay反馈，作为下一次计算时的<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。Unit Delay的初始值设为<span><span>4×14\times1</span><span><span><span></span><span>4</span><span></span><span>×</span><span></span></span><span><span></span><span>1</span></span></span></span>的初始状态<span><span>x0x_0</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，本例取零向量。</p><p>矩阵相乘的Product块需要设置为矩阵乘法，乘法顺序与公式一致。</p><ol>
<li>将第5步的系统创建为子系统。</li>
</ol><p></p><figure><img alt="打包后的原系统" loading="lazy" width="495" height="370" src="/_astro/image-16.Cf89_oCM_1dx8ny.webp" /><figcaption>打包后的原系统</figcaption></figure><p></p><p>保留<span><span>yky_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>AdA_d</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>BdB_d</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>四个输出。<span><span>yky_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>用于查看实际输出，<span><span>AdA_d</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>BdB_d</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>送入KF，<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>用于仿真中生成传感器观测。</p></section><section><h3>搭建KF滤波器<a href="#搭建kf滤波器"><span>#</span></a></h3><section><h4>观测<a href="#观测"><span>#</span></a></h4><ol>
<li>观测器观测<span><span>p1p_1</span><span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>p2p_2</span><span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>两个量。因此直接取：</li>
</ol><span><span><span>Ck=C=[10000010]C_k=C=
\begin{bmatrix}
1&amp;0&amp;0&amp;0\\
0&amp;0&amp;1&amp;0
\end{bmatrix}</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>C</span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span></span></span><p>则有：</p><span><span><span>zk=Ckxk+vk=[p1,kp2,k]+vkz_k=C_kx_k+v_k
=\begin{bmatrix}p_{1,k}\\p_{2,k}\end{bmatrix}+v_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span><span>p</span><span><span><span><span><span><span></span><span><span><span>1</span><span>,</span><span>k</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span>p</span><span><span><span><span><span><span></span><span><span><span>2</span><span>,</span><span>k</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="由实际状态和量测噪声生成观测" loading="lazy" width="966" height="314" src="/_astro/image-22.DFSaeVRu_1YW7ef.webp" /><figcaption>由实际状态和量测噪声生成观测</figcaption></figure><p></p><p>这一步用原系统的<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>模拟传感器。实际使用时，直接将传感器采集到的<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>送入滤波器即可。滤波器的预测和更新只使用已知输入与观测。</p></section><section><h4>预测<a href="#预测-1"><span>#</span></a></h4><ol>
<li>估计<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>xk,prev=Adxˉk−1+Bduk−1x_{k,\mathrm{prev}}=A_d\bar{x}_{k-1}+B_du_{k-1}</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="预测当前状态" loading="lazy" width="990" height="598" src="/_astro/image-17.BPNQQkfB_WRVTt.webp" /><figcaption>预测当前状态</figcaption></figure><p></p><p>其中<span><span>xˉk−1\bar{x}_{k-1}</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是上一时刻更新后的状态，<span><span>uk−1u_{k-1}</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是上一采样周期作用于系统的已知输入。输入端需要延迟一个周期，和状态递推的时序对应。</p><ol>
<li>估计<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>Pk,prev=AdPk−1AdT+RP_{k,\mathrm{prev}}=A_dP_{k-1}A_d^T+R</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>R</span></span></span></span></span><p></p><figure><img alt="预测误差协方差" loading="lazy" width="882" height="448" src="/_astro/image-18.CVT4cA6V_258qqc.webp" /><figcaption>预测误差协方差</figcaption></figure><p></p><p>这里的<span><span>Pk−1P_{k-1}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>也是上一时刻更新后的值。注意右侧乘的是<span><span>AdA_d</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的转置。</p></section><section><h4>更新<a href="#更新-1"><span>#</span></a></h4><ol>
<li>更新<span><span>KkK_k</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>Kk=Pk,prevCkT(CkPk,prevCkT+Q)−1K_k=P_{k,\mathrm{prev}}C_k^T
\left(C_kP_{k,\mathrm{prev}}C_k^T+Q\right)^{-1}</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span><span><span>(</span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span><span>Q</span><span><span>)</span></span></span><span><span><span><span><span><span></span><span><span><span>−</span><span>1</span></span></span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="计算卡尔曼增益" loading="lazy" width="1118" height="408" src="/_astro/image-19.CUDZ4k6T_Z19zxx9.webp" /><figcaption>计算卡尔曼增益</figcaption></figure><p></p><p>先求<span><span>CkPk,prevCkT+QC_kP_{k,\mathrm{prev}}C_k^T+Q</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>Q</span></span></span></span>，再求逆，最后按公式顺序相乘。图中的Inverse块对整个<span><span>2×22\times2</span><span><span><span></span><span>2</span><span></span><span>×</span><span></span></span><span><span></span><span>2</span></span></span></span>矩阵求逆。</p><ol>
<li>更新<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>xˉk=xk,prev+Kk(zk−Ckxk,prev)\bar{x}_k=x_{k,\mathrm{prev}}
+K_k(z_k-C_kx_{k,\mathrm{prev}})</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span></span></span></span></span><p></p><figure><img alt="用当前观测修正预测状态" loading="lazy" width="626" height="470" src="/_astro/image-20.CyhAGMj6_Zk6WBj.webp" /><figcaption>用当前观测修正预测状态</figcaption></figure><p></p><p>先计算预测输出<span><span>Ckxk,prevC_kx_{k,\mathrm{prev}}</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>x</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，用观测<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>减去预测输出，再乘以<span><span>KkK_k</span><span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，最后加回预测状态。</p><ol>
<li>更新<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>Pk=(I4−KkCk)Pk,prevP_k=(I_4-K_kC_k)P_{k,\mathrm{prev}}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>(</span><span><span>I</span><span><span><span><span><span><span></span><span><span>4</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>−</span><span></span></span><span><span></span><span><span>K</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>)</span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>,</span><span><span>prev</span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p></p><figure><img alt="更新误差协方差" loading="lazy" width="953" height="379" src="/_astro/image-21.0MM4CgtR_1puxKX.webp" /><figcaption>更新误差协方差</figcaption></figure><p></p><p>其中<span><span>I4I_4</span><span><span><span></span><span><span>I</span><span><span><span><span><span><span></span><span><span>4</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是<span><span>4×44\times4</span><span><span><span></span><span>4</span><span></span><span>×</span><span></span></span><span><span></span><span>4</span></span></span></span>单位矩阵，更新后的<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>需要反馈到下一时刻的预测部分。</p><ol>
<li>滤波器输出<span><span>yˉk=Ckxˉk\bar{y}_k=C_k\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>y</span></span><span><span></span><span><span>ˉ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</li>
</ol><span><span><span>yˉk=Ckxˉk=[pˉ1,kpˉ2,k]\bar{y}_k=C_k\bar{x}_k
=\begin{bmatrix}\bar{p}_{1,k}\\\bar{p}_{2,k}\end{bmatrix}</span><span><span><span></span><span><span><span><span><span><span><span></span><span>y</span></span><span><span></span><span><span>ˉ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>ˉ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>1</span><span>,</span><span>k</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span><span><span><span><span><span></span><span>p</span></span><span><span></span><span><span>ˉ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>2</span><span>,</span><span>k</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span></span></span><p></p><figure><img alt="由滤波状态计算位移输出" loading="lazy" width="660" height="151" src="/_astro/image-23.BQYltVHm_1iRDIA.webp" /><figcaption>由滤波状态计算位移输出</figcaption></figure><p></p><p>虽然只观测两个位移，KF估计的状态仍然有四个分量，两个速度也包含在<span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>中。</p></section><section><h4>滤波器<a href="#滤波器"><span>#</span></a></h4><p>前7个系统打包成子系统，然后搭建滤波器。</p><p></p><figure><img alt="连接预测和更新子系统" loading="lazy" width="1620" height="834" src="/_astro/image-24.i0VfrTOO_1teW5V.webp" /><figcaption>连接预测和更新子系统</figcaption></figure><p></p><p><span><span>xˉk\bar{x}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>PkP_k</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>分别经过一个Unit Delay，得到下一次预测所需的<span><span>xˉk−1\bar{x}_{k-1}</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>Pk−1P_{k-1}</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。<span><span>uku_k</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>也经过一个Unit Delay，得到<span><span>uk−1u_{k-1}</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</p><p>状态反馈延时块的初值设为<span><span>xˉ0\bar{x}_0</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，协方差反馈延时块的初值设为<span><span>P0P_0</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，输入延时块的初值可设为零向量。<span><span>xˉ0\bar{x}_0</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>表示对初始状态的估计，<span><span>P0P_0</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>表示这个估计的不确定程度。</p><p>前面的公式从<span><span>k=1k=1</span><span><span><span></span><span>k</span><span></span><span>=</span><span></span></span><span><span></span><span>1</span></span></span></span>开始递推。若模型在<span><span>t=0t=0</span><span><span><span></span><span>t</span><span></span><span>=</span><span></span></span><span><span></span><span>0</span></span></span></span>启动，可用Switch在首个采样点输出<span><span>xˉ0\bar{x}_0</span><span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>P0P_0</span><span><span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，之后再输出更新结果，使<span><span>xkx_k</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>uk−1u_{k-1}</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span><span>k</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>在时间上对应。</p><p>最后将滤波器打包成子系统，再将原系统模型和滤波器的相关端口连接起来。</p><p></p><figure><img alt="连接原系统和KF滤波器" loading="lazy" width="1241" height="742" src="/_astro/image-28.CXxtOoUP_ZccnE4.webp" /><figcaption>连接原系统和KF滤波器</figcaption></figure><p></p><p>原系统和滤波器使用同一个<span><span>uku_k</span><span><span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，但<span><span>wkw_k</span><span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>只加在原系统的输入端。滤波器通过<span><span>RR</span><span><span><span></span><span>R</span></span></span></span>描述未知干扰带来的不确定性，不将实际的<span><span>wkw_k</span><span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>送入预测公式。</p></section><section><h4>最后整体打包，然后输入相关矩阵和参数<a href="#最后整体打包然后输入相关矩阵和参数"><span>#</span></a></h4><p></p><figure><img alt="输入矩阵、噪声和采样时间" loading="lazy" width="942" height="743" src="/_astro/image-27.RUM7DxJj_ZBpYEn.webp" /><figcaption>输入矩阵、噪声和采样时间</figcaption></figure><p></p><p><span><span>AcA_c</span><span><span><span></span><span><span>A</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>、<span><span>BcB_c</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>CcC_c</span><span><span><span></span><span><span>C</span><span><span><span><span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>使用前面求出的矩阵。其余参数可以先取：</p><span><span><span>T=10−6 s,I=I4,uk=[12]T=10^{-6}\,\mathrm{s},\qquad I=I_4,\qquad
u_k=\begin{bmatrix}1\\2\end{bmatrix}</span><span><span><span></span><span>T</span><span></span><span>=</span><span></span></span><span><span></span><span>1</span><span><span>0</span><span><span><span><span><span><span></span><span><span><span>−</span><span>6</span></span></span></span></span></span></span></span></span><span></span><span>s</span><span>,</span><span></span><span></span><span>I</span><span></span><span>=</span><span></span></span><span><span></span><span><span>I</span><span><span><span><span><span><span></span><span><span>4</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span></span><span><span>u</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span></span></span><span><span><span>x0=xˉ0=04×1,P0=I4x_0=\bar{x}_0=0_{4\times1},\qquad P_0=I_4</span><span><span><span></span><span><span>x</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span><span></span><span>x</span></span><span><span></span><span><span>ˉ</span></span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>0</span><span><span><span><span><span><span></span><span><span><span>4</span><span>×</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span></span><span><span>P</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span>I</span><span><span><span><span><span><span></span><span><span>4</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>下面给出一组示例噪声参数：</p><span><span><span>W=0.01I2,Q=10−4I2W=0.01I_2,\qquad Q=10^{-4}I_2</span><span><span><span></span><span>W</span><span></span><span>=</span><span></span></span><span><span></span><span>0.01</span><span><span>I</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>,</span><span></span><span></span><span>Q</span><span></span><span>=</span><span></span></span><span><span></span><span>1</span><span><span>0</span><span><span><span><span><span><span></span><span><span><span>−</span><span>4</span></span></span></span></span></span></span></span></span><span><span>I</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span><p>则：</p><span><span><span>R=BdWBdT=0.01T2[0000010000000001]R=B_dWB_d^T
=0.01T^2
\begin{bmatrix}
0&amp;0&amp;0&amp;0\\
0&amp;1&amp;0&amp;0\\
0&amp;0&amp;0&amp;0\\
0&amp;0&amp;0&amp;1
\end{bmatrix}</span><span><span><span></span><span>R</span><span></span><span>=</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>W</span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>0.01</span><span><span>T</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span><span></span><span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>0</span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span><span><span><span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span><p>代入<span><span>T=10−6 sT=10^{-6}\,\mathrm{s}</span><span><span><span></span><span>T</span><span></span><span>=</span><span></span></span><span><span></span><span>1</span><span><span>0</span><span><span><span><span><span><span></span><span><span><span>−</span><span>6</span></span></span></span></span></span></span></span></span><span></span><span>s</span></span></span></span>后，<span><span>RR</span><span><span><span></span><span>R</span></span></span></span>的第2、4个对角元素均为<span><span>10−1410^{-14}</span><span><span><span></span><span>1</span><span><span>0</span><span><span><span><span><span><span></span><span><span><span>−</span><span>14</span></span></span></span></span></span></span></span></span></span></span></span>。这里的<span><span>WW</span><span><span><span></span><span>W</span></span></span></span>描述每个采样点上离散输入干扰的方差，<span><span>RR</span><span><span><span></span><span>R</span></span></span></span>已经包含了<span><span>BdB_d</span><span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>中的采样时间，不能在预测公式中再乘一次<span><span>TT</span><span><span><span></span><span>T</span></span></span></span>。</p><p>噪声可以用<a href="https://www.mathworks.com/help/simulink/slref/randomnumber.html" target="_blank">Random Number</a>块生成。<span><span>wkw_k</span><span><span><span></span><span><span>w</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的均值设为<code>[0;0]</code>、方差设为<code>[0.01;0.01]</code>；<span><span>vkv_k</span><span><span><span></span><span><span>v</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的均值设为<code>[0;0]</code>、方差设为<code>[1e-4;1e-4]</code>。采样时间均设为<span><span>TT</span><span><span><span></span><span>T</span></span></span></span>，各通道使用不同的随机种子，并将输出设置为<span><span>2×12\times1</span><span><span><span></span><span>2</span><span></span><span>×</span><span></span></span><span><span></span><span>1</span></span></span></span>列向量。块中的Variance填写的是方差。</p><p>噪声源的实际方差要与<span><span>WW</span><span><span><span></span><span>W</span></span></span></span>、<span><span>QQ</span><span><span><span></span><span>Q</span></span></span></span>对应。改变输入噪声方差或采样时间后，也需要重新计算<span><span>R=BdWBdTR=B_dWB_d^T</span><span><span><span></span><span>R</span><span></span><span>=</span><span></span></span><span><span></span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>W</span><span><span>B</span><span><span><span><span><span><span></span><span><span>d</span></span></span><span><span></span><span><span>T</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>。</p></section><section><h4>运行<a href="#运行"><span>#</span></a></h4><p>建议将<a href="https://www.mathworks.com/help/simulink/slref/scope.html" target="_blank">Scope</a>的采样时间改为<code>0.1s</code>，系统仿真总时间设置为<code>30s</code>。这里的<code>0.1s</code>只用于示波器显示，原系统和KF的采样时间仍然为<span><span>TT</span><span><span><span></span><span>T</span></span></span></span>。</p><p></p><figure><img alt="实际输出、含噪观测与滤波输出对比" loading="lazy" width="1690" height="644" src="/_astro/image-29.Dv8BlkXY_Z1OkkKz.webp" /><figcaption>实际输出、含噪观测与滤波输出对比</figcaption></figure><p></p><p>按图中的窗口位置，左侧的示波器是模型的实际输出<span><span>yky_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>，包含输入干扰对运动的影响，但没有加入传感器的量测误差。右侧的示波器是观测<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和滤波结果<span><span>yˉk\bar{y}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>y</span></span><span><span></span><span><span>ˉ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>的输出，每个信号分别包含两个位移通道。</p><p>实际上，<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>是从传感器得到的数据，其中包含量测误差。将<span><span>zkz_k</span><span><span><span></span><span><span>z</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>和<span><span>yˉk\bar{y}_k</span><span><span><span></span><span><span><span><span><span><span><span></span><span>y</span></span><span><span></span><span><span>ˉ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>与<span><span>yky_k</span><span><span><span></span><span><span>y</span><span><span><span><span><span><span></span><span><span>k</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span>比较，可以查看滤波后是否更接近实际输出。图中的噪声大小以原仿真设置为准，使用上面的示例参数时，具体曲线会有所不同。</p><p>不考虑噪声时，恒定输入<span><span>u=[1,2]Tu=[1,2]^T</span><span><span><span></span><span>u</span><span></span><span>=</span><span></span></span><span><span></span><span>[</span><span>1</span><span>,</span><span></span><span>2</span><span><span>]</span><span><span><span><span><span><span></span><span><span>T</span></span></span></span></span></span></span></span></span></span></span>对应的稳态满足：</p><span><span><span>[3−1−13][p1p2]=[12]\begin{bmatrix}3&amp;-1\\-1&amp;3\end{bmatrix}
\begin{bmatrix}p_1\\p_2\end{bmatrix}
=\begin{bmatrix}1\\2\end{bmatrix}</span><span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span>3</span></span></span><span><span></span><span><span>−</span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>−</span><span>1</span></span></span><span><span></span><span><span>3</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>[</span></span><span><span><span><span><span><span><span><span></span><span><span>1</span></span></span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>]</span></span></span></span></span></span></span><p>解得<span><span>p1=0.625 mp_1=0.625\,\mathrm{m}</span><span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>0.625</span><span></span><span>m</span></span></span></span>，<span><span>p2=0.875 mp_2=0.875\,\mathrm{m}</span><span><span><span></span><span><span>p</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>0.875</span><span></span><span>m</span></span></span></span>，可以用来核对输出最终趋向的位置。</p></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-19/</id>
      <title type="text">Docker 部署项目与容器管理：挂载卷、查看、启动、停止和重启</title>
      <published>2026-10-19T00:00:00.000Z</published>
      <updated>2026-10-19T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-19/"/>
      <summary type="text">从构建镜像和创建容器开始，介绍 Docker 项目的卷挂载、容器查看、启动、停止、重启，以及使用 Docker Compose 管理项目的常用命令。</summary>
      <content type="html"><![CDATA[<p>Docker 部署项目时，通常会经历三个步骤：先把项目构建成镜像，再根据镜像创建容器，最后通过端口映射和卷挂载让服务对外提供访问，并把需要长期保存的数据放到容器之外。</p>
<p>本文使用一个监听容器内 <code>3000</code> 端口、数据目录为 <code>/app/data</code> 的通用项目作为示例。不同项目的启动命令、端口和数据目录可能不同，使用时需要替换成项目实际配置。</p>
<p>封面图来源：<a href="https://medium.com/%40augustineozor/docker-workflow-b9fe71d32184" target="_blank">Docker Workflow</a>，用于直观展示从 Dockerfile、镜像到容器和部署环境的基本流程。</p>
<section><h2>一、镜像、容器和卷是什么<a href="#一镜像容器和卷是什么"><span>#</span></a></h2><ul>
<li><strong>镜像（image）</strong>：项目运行所需的程序、依赖和基础系统的只读模板。</li>
<li><strong>容器（container）</strong>：镜像启动后的运行实例，可以启动、停止和重启。</li>
<li><strong>卷（volume）</strong>：独立于容器生命周期保存数据的存储。删除并重新创建容器后，只要卷还在，数据就不会丢失。</li>
</ul><p>如果把数据库文件、上传文件或配置文件只写在容器内部，容器被删除后这些数据也可能一起消失。因此，部署有状态项目时，卷挂载是必须认真配置的一步。</p><p>本文假设已经安装 Docker，并且当前用户可以直接执行 <code>docker</code> 命令。若执行 Docker 命令时出现 socket 权限错误，可以把用户加入 <code>docker</code> 用户组后重新登录：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>usermod</span><span> </span><span>-aG</span><span> </span><span>docker</span><span> </span><span>"</span><span>$USER</span><span>"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>二、构建项目镜像<a href="#二构建项目镜像"><span>#</span></a></h2><p>在项目根目录准备 <code>Dockerfile</code>。下面是 Node.js 项目的一个通用示例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>FROM</span><span> node:22-alpine</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>WORKDIR</span><span> /app</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>COPY</span><span> package*.json ./</span></div></div><div><div><div>6</div></div><div><span>RUN</span><span> npm ci --omit=dev</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>COPY</span><span> . .</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>EXPOSE</span><span> 3000</span></div></div><div><div><div>11</div></div><div><span>CMD</span><span> [</span><span>"npm"</span><span>, </span><span>"run"</span><span>, </span><span>"start"</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果项目使用 pnpm、Python 或其他运行时，应将基础镜像、依赖安装命令和启动命令替换为项目自己的配置。<code>EXPOSE</code> 只是镜像中的说明，真正让宿主机可以访问服务，还需要在启动容器时进行端口映射。</p><p>进入项目目录后构建镜像：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/path/to/your-project</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>build</span><span> </span><span>-t</span><span> </span><span>my-app:1.0</span><span> </span><span>.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>其中：</p><ul>
<li><code>-t my-app:1.0</code> 为镜像设置名称和标签。</li>
<li>最后的 <code>.</code> 表示使用当前目录作为构建上下文。</li>
</ul><p>查看已经构建的镜像：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>image</span><span> </span><span>ls</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>三、创建容器并挂载卷<a href="#三创建容器并挂载卷"><span>#</span></a></h2><section><h3>1. 使用宿主机目录挂载<a href="#1-使用宿主机目录挂载"><span>#</span></a></h3><p>如果希望直接看到宿主机上的文件，可以使用 bind mount：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>data</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--name</span><span> </span><span>my-app</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--restart</span><span> </span><span>unless-stopped</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>-p</span><span> </span><span>8080:3000</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>-v</span><span> </span><span>"$(</span><span>pwd</span><span>)/data:/app/data"</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>my-app:1.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这条命令完成了几件事：</p><ul>
<li><code>-d</code>：让容器在后台运行。</li>
<li><code>--name my-app</code>：为容器指定一个便于管理的名称。</li>
<li><code>--restart unless-stopped</code>：容器异常退出时自动尝试启动，手动停止后不会自动恢复。</li>
<li><code>-p 8080:3000</code>：把宿主机的 <code>8080</code> 端口映射到容器的 <code>3000</code> 端口。</li>
<li><code>-v "$(pwd)/data:/app/data"</code>：把当前项目下的 <code>data</code> 目录挂载到容器内的 <code>/app/data</code>。</li>
</ul><p>端口映射的格式是 <code>宿主机端口:容器端口</code>。启动后，访问 <code>http://服务器地址:8080</code> 就会请求容器内监听的 <code>3000</code> 端口。</p><p>也可以使用可读性更好的 <code>--mount</code> 写法：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name</span><span> </span><span>my-app</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--mount</span><span> </span><span>type=bind,src="$(</span><span>pwd</span><span>)/data",dst=/app/data</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>-p</span><span> </span><span>8080:3000</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>my-app:1.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果容器只需要读取配置，不应该修改宿主机文件，可以加上只读选项：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name</span><span> </span><span>my-app</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--mount</span><span> </span><span>type=bind,src="$(</span><span>pwd</span><span>)/config",dst=/app/config,readonly</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>-p</span><span> </span><span>8080:3000</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>my-app:1.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2. 使用 Docker 命名卷<a href="#2-使用-docker-命名卷"><span>#</span></a></h3><p>如果不需要直接通过固定路径管理文件，可以使用 Docker 命名卷。命名卷由 Docker 管理，适合数据库、缓存和应用数据：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>volume</span><span> </span><span>create</span><span> </span><span>my-app-data</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--name</span><span> </span><span>my-app</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--restart</span><span> </span><span>unless-stopped</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>-p</span><span> </span><span>8080:3000</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>-v</span><span> </span><span>my-app-data:/app/data</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>my-app:1.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看命名卷：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>volume</span><span> </span><span>ls</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>volume</span><span> </span><span>inspect</span><span> </span><span>my-app-data</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>宿主机目录挂载和命名卷的区别可以简单理解为：宿主机目录挂载更直观，适合配置文件和需要人工查看的文件；命名卷更容易交给 Docker 管理，适合不关心宿主机具体存储路径的数据。</p><p>如果挂载的是宿主机目录，必须先确认目录存在，并检查目录权限。容器内进程使用的用户可能不是 <code>root</code>，因此宿主机目录即使存在，也不一定可写。</p></section></section>
<section><h2>四、查看已经部署的容器<a href="#四查看已经部署的容器"><span>#</span></a></h2><p>查看当前正在运行的容器：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>ps</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看所有容器，包括已经停止的容器：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>ps</span><span> </span><span>-a</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输出中的几个常用字段如下：</p>

<table><thead><tr><th>字段</th><th>含义</th></tr></thead><tbody><tr><td><code>CONTAINER ID</code></td><td>容器 ID，可以使用前几位作为简写</td></tr><tr><td><code>IMAGE</code></td><td>容器使用的镜像</td></tr><tr><td><code>COMMAND</code></td><td>容器启动时执行的命令</td></tr><tr><td><code>STATUS</code></td><td>当前运行状态或退出状态</td></tr><tr><td><code>PORTS</code></td><td>端口映射关系</td></tr><tr><td><code>NAMES</code></td><td>容器名称</td></tr></tbody></table><p>只查看某个容器的状态：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>inspect</span><span> </span><span>-f</span><span> </span><span>'{{.State.Status}}'</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看容器的完整配置，包括环境变量、挂载卷、网络和启动命令：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>inspect</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看端口映射：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>port</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看容器日志。排查容器启动后立即退出的问题时，通常应该先看日志：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>logs</span><span> </span><span>--tail</span><span> </span><span>100</span><span> </span><span>my-app</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>logs</span><span> </span><span>-f</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>其中 <code>-f</code> 会持续跟随输出，按 <code>Ctrl+C</code> 只会退出日志查看，不会停止容器。</p><p>查看容器中的进程和资源占用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>top</span><span> </span><span>my-app</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>stats</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果需要进入正在运行的容器进行检查，可以执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>exec</span><span> </span><span>-it</span><span> </span><span>my-app</span><span> </span><span>sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>有些镜像内置的是 Bash，也可以使用 <code>bash</code>；Alpine 镜像通常只有 <code>sh</code>。</p></section>
<section><h2>五、启动、停止和重启容器<a href="#五启动停止和重启容器"><span>#</span></a></h2><section><h3>启动已经存在但当前停止的容器<a href="#启动已经存在但当前停止的容器"><span>#</span></a></h3><p><code>docker start</code> 会使用容器原本的配置重新启动它，不会创建新的容器：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>start</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>启动后确认状态：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>ps</span><span> </span><span>--filter</span><span> </span><span>name=my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>停止容器<a href="#停止容器"><span>#</span></a></h3><p>优先使用 <code>docker stop</code>，它会先向应用发送停止信号，给程序留出清理资源的机会：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>stop</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果程序没有在默认等待时间内退出，可以强制终止：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>kill</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>docker kill</code> 不会等待应用完成清理，应该只作为异常情况下的处理手段。</p></section><section><h3>重启容器<a href="#重启容器"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>restart</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>修改了宿主机挂载目录中的配置文件后，通常可以重启容器让应用重新读取配置：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>restart</span><span> </span><span>my-app</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>logs</span><span> </span><span>--tail</span><span> </span><span>50</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>但如果修改了 <code>Dockerfile</code>、依赖或镜像内的文件，单纯重启并不会重新构建镜像。此时应重新构建镜像，并重新创建容器：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>build</span><span> </span><span>-t</span><span> </span><span>my-app:1.1</span><span> </span><span>.</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>stop</span><span> </span><span>my-app</span></div></div><div><div><div>3</div></div><div><span>docker</span><span> </span><span>rm</span><span> </span><span>my-app</span></div></div><div><div><div>4</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--name</span><span> </span><span>my-app</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--restart</span><span> </span><span>unless-stopped</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>-p</span><span> </span><span>8080:3000</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>-v</span><span> </span><span>"$(</span><span>pwd</span><span>)/data:/app/data"</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>my-app:1.1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>删除容器不会自动删除命名卷，但会删除容器本身的临时文件层。删除前可以先确认卷和挂载关系：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>inspect</span><span> </span><span>my-app</span><span> </span><span>--format</span><span> </span><span>'{{json .Mounts}}'</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>六、使用 Docker Compose 管理项目<a href="#六使用-docker-compose-管理项目"><span>#</span></a></h2><p>当项目包含多个服务，或者不希望每次手动输入很长的 <code>docker run</code> 命令时，可以在项目根目录创建 <code>compose.yaml</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>services</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>app</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>build</span><span>: </span><span>.</span></div></div><div><div><div>4</div></div><div><span>    </span><span>container_name</span><span>: </span><span>my-app</span></div></div><div><div><div>5</div></div><div><span>    </span><span>ports</span><span>:</span></div></div><div><div><div>6</div></div><div><span><span>      </span></span><span>- </span><span>"8080:3000"</span></div></div><div><div><div>7</div></div><div><span>    </span><span>volumes</span><span>:</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>- </span><span>app-data:/app/data</span></div></div><div><div><div>9</div></div><div><span>      </span><span># 需要从宿主机读取配置时，可以改用下面的 bind mount：</span></div></div><div><div><div>10</div></div><div><span>      </span><span># - ./config:/app/config:ro</span></div></div><div><div><div>11</div></div><div><span>    </span><span>restart</span><span>: </span><span>unless-stopped</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>volumes</span><span>:</span></div></div><div><div><div>14</div></div><div><span>  </span><span>app-data</span><span>:</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>进入 <code>compose.yaml</code> 所在目录后，常用操作如下：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 构建镜像并在后台启动项目</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>up</span><span> </span><span>-d</span><span> </span><span>--build</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看项目中的容器</span></div></div><div><div><div>5</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>ps</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看日志</span></div></div><div><div><div>8</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>logs</span><span> </span><span>-f</span><span> </span><span>app</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 启动已经停止的服务</span></div></div><div><div><div>11</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>start</span><span> </span><span>app</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 停止服务，但保留容器和数据</span></div></div><div><div><div>14</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>stop</span><span> </span><span>app</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 重启服务</span></div></div><div><div><div>17</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>restart</span><span> </span><span>app</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 停止并删除容器、网络，但保留命名卷</span></div></div><div><div><div>20</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>down</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>修改 <code>Dockerfile</code> 或项目代码后，常用的更新命令是：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>up</span><span> </span><span>-d</span><span> </span><span>--build</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这会根据新的配置重新构建镜像，并让 Compose 重新创建需要更新的容器。<code>docker compose stop</code> 和 <code>docker compose down</code> 不同：前者只停止服务，后者还会删除 Compose 创建的容器和网络。</p><p>注意不要随意执行下面的命令：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>down</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>-v</code> 会同时删除 Compose 声明的命名卷，数据库和应用数据可能因此丢失。只有在确认数据已经备份，或者明确希望清空环境时才使用它。</p></section>
<section><h2>七、常见问题排查<a href="#七常见问题排查"><span>#</span></a></h2><section><h3>1. 端口已被占用<a href="#1-端口已被占用"><span>#</span></a></h3><p>如果出现 <code>address already in use</code>，说明宿主机端口已经被其他进程或容器占用。可以查看端口和容器映射：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>ps</span><span> </span><span>--format</span><span> </span><span>'table {{.Names}}\t{{.Ports}}'</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>ss</span><span> </span><span>-lntp</span><span> | </span><span>grep</span><span> </span><span>':8080'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>确认占用者后，可以停止它，或者把项目的宿主机端口改成其他端口，例如 <code>8081:3000</code>。</p></section><section><h3>2. 容器启动后马上退出<a href="#2-容器启动后马上退出"><span>#</span></a></h3><p>先查看状态和日志：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>ps</span><span> </span><span>-a</span><span> </span><span>--filter</span><span> </span><span>name=my-app</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>logs</span><span> </span><span>my-app</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>常见原因包括启动命令错误、环境变量缺失、应用没有监听正确端口，以及应用只绑定了 <code>127.0.0.1</code>。在容器中运行的 Web 服务通常需要监听 <code>0.0.0.0</code>，否则即使端口映射正确，宿主机也可能无法访问。</p></section><section><h3>3. 挂载目录不可写<a href="#3-挂载目录不可写"><span>#</span></a></h3><p>确认宿主机目录权限：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ls</span><span> </span><span>-ld</span><span> </span><span>data</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>exec</span><span> </span><span>my-app</span><span> </span><span>id</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果容器内应用使用普通用户运行，需要让宿主机目录的用户或用户组与容器进程匹配，或者根据镜像文档设置正确的权限。不要为了绕过问题而长期使用 <code>chmod -R 777</code>。</p></section><section><h3>4. 修改文件后数据看起来没有变化<a href="#4-修改文件后数据看起来没有变化"><span>#</span></a></h3><p>检查容器实际使用的挂载关系：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>inspect</span><span> </span><span>my-app</span><span> </span><span>--format</span><span> </span><span>'{{range .Mounts}}{{println .Source "-&gt;" .Destination}}{{end}}'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重点确认宿主机路径、容器内路径和读写模式是否正确。还要注意，挂载卷会覆盖容器内同一目录原有的文件；如果把一个空目录挂载到包含默认配置的目录，镜像中的默认文件可能会暂时不可见。</p></section></section>
<section><h2>总结<a href="#总结"><span>#</span></a></h2><p>单容器部署的核心命令可以记成下面这条链路：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>docker build → docker run → docker ps / docker logs → docker stop / start / restart</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>需要持久化的数据使用 <code>-v</code> 或 <code>--mount</code> 挂载；需要长期维护的多服务项目使用 Docker Compose。日常排错时，先看 <code>docker ps -a</code> 和 <code>docker logs</code>，更新镜像时使用 <code>docker compose up -d --build</code>，清理环境前则务必确认不会误删命名卷中的数据。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-17-baidunetdisk-arm64-vnc/</id>
      <title type="text">在树莓派 4B 上部署百度网盘 ARM64 图形客户端</title>
      <published>2026-10-17T00:00:00.000Z</published>
      <updated>2026-10-17T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-17-baidunetdisk-arm64-vnc/"/>
      <summary type="text">记录将 baidunetdisk-arm64-vnc 部署到树莓派 4B 的完整过程，包括 Docker 安装、ARM64 镜像转运、端口冲突和 NTFS 下载盘兼容性处理。</summary>
      <content type="html"><![CDATA[<section><h1>在树莓派 4B 上部署百度网盘 ARM64 图形客户端<a href="#在树莓派-4b-上部署百度网盘-arm64-图形客户端"><span>#</span></a></h1><p>这次部署的目标，是把 <a href="https://github.com/eMUQI/baidunetdisk-arm64-vnc" target="_blank">baidunetdisk-arm64-vnc</a> 运行在一台 Raspberry Pi 4 Model B 上。这个项目把百度网盘 Linux ARM64 客户端放进 Docker 容器，并通过 noVNC 提供网页访问，也可以使用 VNC 客户端连接。</p><p>最终的访问方式如下：</p>

<table><thead><tr><th>功能</th><th>地址</th></tr></thead><tbody><tr><td>noVNC 网页界面</td><td><code>http://10.42.0.185:5800/</code></td></tr><tr><td>VNC 客户端</td><td><code>10.42.0.185:5901</code></td></tr><tr><td>容器内 VNC 端口</td><td><code>5900</code></td></tr><tr><td>下载数据目录</td><td>树莓派的 <code>/mnt/pan1/</code></td></tr></tbody></table><p>其中 <code>5901</code> 是主机端口。树莓派原本已经运行了系统级 <code>wayvnc</code>，占用了主机的 <code>5900</code>，所以不能直接照搬项目 README 中的 <code>5900:5900</code> 映射。</p><section><h2>1. 确认硬件和系统<a href="#1-确认硬件和系统"><span>#</span></a></h2><p>项目 README 标注 Raspberry Pi 4B 支持 ARM64 镜像，而 Raspberry Pi 5 可能出现段错误。因此部署前先确认设备型号和架构：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>tr</span><span> </span><span>-d</span><span> </span><span>'\000'</span><span> &lt;</span><span>/proc/device-tree/model</span></div></div><div><div><div>2</div></div><div><span>uname</span><span> </span><span>-m</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>本次输出为：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Raspberry Pi 4 Model B Rev 1.5</span></div></div><div><div><div>2</div></div><div><span>aarch64</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>树莓派运行 Debian 13，符合项目的 ARM64 使用条件。之后在本机拉取仓库，并同步到树莓派：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>https://github.com/eMUQI/baidunetdisk-arm64-vnc.git</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>/home/chacha/repo/baidunetdisk-arm64-vnc</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>rsync</span><span> </span><span>-av</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>/home/chacha/repo/baidunetdisk-arm64-vnc/</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>chacha@10.42.0.185:/home/chacha/repo/baidunetdisk-arm64-vnc/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>同步时保留了仓库中的 <code>Dockerfile.arm64</code>、<code>docker-compose.yml</code>、启动脚本和 noVNC 配置，后续的部署参数通过 <code>docker-compose.override.yml</code> 单独覆盖。</p></section><section><h2>2. 在树莓派上安装 Docker<a href="#2-在树莓派上安装-docker"><span>#</span></a></h2><p>树莓派最开始没有 Docker 和 Compose，因此先安装 Debian 软件包：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh</span><span> </span><span>-t</span><span> </span><span>chacha@10.42.0.185</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>'sudo apt-get update &amp;&amp; sudo apt-get install -y docker.io docker-compose'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>为了让普通用户可以访问 Docker socket，再把用户加入 <code>docker</code> 组：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh</span><span> </span><span>-t</span><span> </span><span>chacha@10.42.0.185</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>'sudo usermod -aG docker chacha'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>加入用户组后需要重新建立 SSH 会话。否则即使 <code>docker --version</code> 可以执行，<code>docker info</code> 仍可能报：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>permission denied while trying to connect to the Docker daemon socket</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重新登录后确认 Docker 服务和 Compose 可用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>info</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>version</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3. 处理树莓派无法访问 Docker Hub 的问题<a href="#3-处理树莓派无法访问-docker-hub-的问题"><span>#</span></a></h2><p>树莓派上的 Docker 服务已经正常运行，但直接执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>emuqi/baidunetdisk-arm64-vnc:latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>访问 <code>registry-1.docker.io</code> 时超时。本机可以访问 Docker Hub，因此改为在本机获取 ARM64 镜像，再把镜像归档传到树莓派。</p><p>这里使用 <code>go-containerregistry</code> 提供的 <code>crane</code>，它不需要本地 Docker daemon 就能从 Registry 下载镜像：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>crane</span><span> </span><span>pull</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--platform</span><span> </span><span>linux/arm64</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--format=tarball</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>emuqi/baidunetdisk-arm64-vnc:latest</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>/tmp/baidunetdisk-arm64-vnc.tar</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后传输并加载镜像：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>rsync</span><span> </span><span>-av</span><span> </span><span>--progress</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>/tmp/baidunetdisk-arm64-vnc.tar</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>chacha@10.42.0.185:/home/chacha/baidunetdisk-arm64-vnc-image.tar</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>ssh</span><span> </span><span>chacha@10.42.0.185</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>'docker load -i /home/chacha/baidunetdisk-arm64-vnc-image.tar'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>加载完成后检查镜像架构：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>image</span><span> </span><span>inspect</span><span> </span><span>emuqi/baidunetdisk-arm64-vnc:latest</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--format=</span><span>'{{.Os}}/{{.Architecture}}'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>应当得到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>linux/arm64</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>镜像加载完成后就不再依赖树莓派直连 Docker Hub。临时归档确认加载成功后即可移入回收站或删除，以释放树莓派上的空间。</p></section><section><h2>4. 处理端口冲突<a href="#4-处理端口冲突"><span>#</span></a></h2><p>项目默认使用以下端口：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>5800:5800  # noVNC 网页</span></div></div><div><div><div>2</div></div><div><span>5900:5900  # VNC</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>检查树莓派端口时发现主机的 <code>5900</code> 已被 <code>wayvnc</code> 占用。为了不影响原有桌面远程服务，只调整主机侧端口，把容器内的 <code>5900</code> 映射到主机 <code>5901</code>。</p><p>在仓库目录中新增 <code>docker-compose.override.yml</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>services</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>baidunetdisk-vnc</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>environment</span><span>: </span><span>!override</span></div></div><div><div><div>4</div></div><div><span><span>      </span></span><span>- </span><span>USER_ID=1000</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>- </span><span>GROUP_ID=1000</span></div></div><div><div><div>6</div></div><div><span><span>      </span></span><span>- </span><span>TAKE_CONFIG_OWNERSHIP=0</span></div></div><div><div><div>7</div></div><div><span>    </span><span>volumes</span><span>: </span><span>!override</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>- </span><span>${PWD}/bdnetdisk-config:/config</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>- </span><span>/mnt/pan1:/config/baidunetdiskdownload</span></div></div><div><div><div>10</div></div><div><span>    </span><span>ports</span><span>: </span><span>!override</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>- </span><span>"5800:5800"</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>- </span><span>"5901:5900"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>!override</code> 用来替换基础 Compose 文件中的同名列表，而不是把旧端口和新端口追加到一起。本次树莓派使用 Docker Compose 2.26.1，支持这种写法。</p></section><section><h2>5. 将下载数据放到 NTFS 硬盘<a href="#5-将下载数据放到-ntfs-硬盘"><span>#</span></a></h2><p>下载盘挂载在树莓派的 <code>/mnt/pan1/</code>。实际检查结果如下：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/dev/sda1  fuseblk  /mnt/pan1  466G total, 291G available</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Compose 中的映射关系是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/mnt/pan1                             -&gt; /config/baidunetdiskdownload</span></div></div><div><div><div>2</div></div><div><span>/home/chacha/repo/.../bdnetdisk-config -&gt; /config</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这里特意把配置目录和下载目录分开：配置仍然保存在树莓派系统盘的 ext4 文件系统中，下载内容则写入外接硬盘。</p><p>第一次切换挂载后，容器启动失败并不断重启，日志显示：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>chown: cannot read directory '/config/baidunetdiskdownload/...': Input/output error</span></div></div><div><div><div>2</div></div><div><span>terminated with error 123</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>原因不是 Docker 不能读取目录，而是基础镜像的初始化脚本默认会递归执行 <code>chown</code>，而 NTFS 的 <code>fuseblk</code> 挂载不适合在容器启动时对整棵目录树执行 Linux 所有权修改。</p><p>因此在覆盖配置中加入：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>environment</span><span>: </span><span>!override</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>- </span><span>USER_ID=1000</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>- </span><span>GROUP_ID=1000</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>- </span><span>TAKE_CONFIG_OWNERSHIP=0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>关闭自动接管 <code>/config</code> 的所有权后，容器保留 <code>USER_ID=1000</code> 和 <code>GROUP_ID=1000</code>，并直接使用 NTFS 挂载点已有的权限。当前 <code>/mnt/pan1/</code> 对 <code>chacha</code> 可写，容器内的下载目录也通过了写权限检查。</p><p>如果你的 NTFS 挂载权限不是可写状态，需要先调整挂载参数；不要只修改 Compose 而忽略宿主机文件系统权限。</p></section><section><h2>6. 启动和验证<a href="#6-启动和验证"><span>#</span></a></h2><p>进入项目目录，先检查 Compose 展开的最终配置：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/home/chacha/repo/baidunetdisk-arm64-vnc</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>config</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>确认卷映射和端口无误后启动：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>up</span><span> </span><span>-d</span><span> </span><span>--force-recreate</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>ps</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>验证结果应当包含：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>baidunetdisk-vnc   Up</span></div></div><div><div><div>2</div></div><div><span>0.0.0.0:5800-&gt;5800/tcp</span></div></div><div><div><div>3</div></div><div><span>0.0.0.0:5901-&gt;5900/tcp</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>再从树莓派本机检查网页服务：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>-I</span><span> </span><span>http://127.0.0.1:5800/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>返回 <code>HTTP/1.1 200 OK</code> 后，可以从同一局域网的浏览器打开：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>http://10.42.0.185:5800/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>VNC 客户端则连接：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>10.42.0.185:5901</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>常见问题<a href="#常见问题"><span>#</span></a></h2>

<table><thead><tr><th>现象</th><th>原因</th><th>处理方式</th></tr></thead><tbody><tr><td><code>permission denied</code> 访问 Docker socket</td><td>用户组变更尚未进入当前 SSH 会话</td><td>加入 <code>docker</code> 组后重新登录</td></tr><tr><td><code>docker pull</code> 访问 Registry 超时</td><td>树莓派到 Docker Hub 的网络不通</td><td>在本机用 <code>crane</code> 拉取 ARM64 归档，再 <code>docker load</code></td></tr><tr><td><code>address already in use</code></td><td>主机端口已被其他服务占用</td><td>修改主机侧端口，例如 <code>5901:5900</code></td></tr><tr><td>容器反复 <code>Restarting (123)</code></td><td>NTFS 挂载上执行递归 <code>chown</code> 失败</td><td>设置 <code>TAKE_CONFIG_OWNERSHIP=0</code></td></tr><tr><td>能打开网页但下载目录不可写</td><td>宿主机挂载权限不足</td><td>检查 <code>findmnt</code>、挂载参数和目录写权限</td></tr></tbody></table></section><section><h2>总结<a href="#总结"><span>#</span></a></h2><p>这次部署真正需要处理的并不只是执行一次 <code>docker compose up -d</code>，而是三个设备环境差异：树莓派只应使用 ARM64 镜像、树莓派本身无法访问 Docker Hub、外接 NTFS 硬盘不适合被容器初始化脚本递归修改所有权。</p><p>最终方案是：本机获取并转运 ARM64 镜像，树莓派用 Compose 运行容器；网页端口保留为 <code>5800</code>，VNC 主机端口调整为 <code>5901</code>；配置放在 ext4，下载数据放在 <code>/mnt/pan1/</code>，并关闭基础镜像的自动所有权接管。这样既保留了原有 <code>wayvnc</code> 服务，也让百度网盘下载文件直接落到大容量硬盘上。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-14/</id>
      <title type="text">Linux 下用 Alist 挂载百度网盘并下载文件</title>
      <published>2026-10-14T00:00:00.000Z</published>
      <updated>2026-10-14T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-14/"/>
      <summary type="text">记录在 Alist 中配置百度网盘驱动、刷新令牌和下载策略的方法，并说明如何验证文件是否可以正常下载。</summary>
      <content type="html"><![CDATA[<section><h1>Linux 下用 Alist 挂载百度网盘并下载文件<a href="#linux-下用-alist-挂载百度网盘并下载文件"><span>#</span></a></h1><p>Alist 可以把多个网盘统一到一个文件列表中，再通过网页界面或 WebDAV 访问文件。本文记录在 Linux 环境中配置百度网盘驱动的过程，重点说明刷新令牌、<code>302</code> 重定向和官方下载接口这几个容易混淆的选项。</p><blockquote><p>本文以 Alist 当前的百度网盘驱动界面为例。不同版本的字段名称或页面布局可能略有差异，但配置思路基本一致。</p></blockquote><section><h2>工作原理<a href="#工作原理"><span>#</span></a></h2><p>配置完成后，文件访问大致经过下面的链路：</p><p></p><figure><img alt="Alist、百度网盘与下载客户端之间的文件请求链路" loading="lazy" width="1600" height="680" src="/_astro/alist-baidu-flow.BQXIU1jl_2vg6Pt.webp" /><figcaption>Alist、百度网盘与下载客户端之间的文件请求链路</figcaption></figure><p></p><p>当 WebDAV 策略设置为 <code>302</code> 时，Alist 会把文件请求重定向到百度网盘的下载地址，由客户端直接跟随重定向并下载文件。这样可以减少 Alist 服务器中转文件的压力；<code>下载接口</code>选择官方接口，则表示使用百度网盘提供的官方下载接口。</p></section><section><h2>配置步骤<a href="#配置步骤"><span>#</span></a></h2><section><h3>1. 添加百度网盘存储<a href="#1-添加百度网盘存储"><span>#</span></a></h3><p>进入 Alist 管理后台的“存储”页面，点击“添加”，选择“百度网盘”驱动。</p><p></p><figure><img alt="Alist 管理后台的存储列表与添加按钮" loading="lazy" width="600" height="470" src="/_astro/image-5.CRtbmhFh_ZmMtT.webp" /><figcaption>Alist 管理后台的存储列表与添加按钮</figcaption></figure><p></p></section><section><h3>2. 获取刷新令牌<a href="#2-获取刷新令牌"><span>#</span></a></h3><p>打开<a href="https://alistgo.com/guide/drivers/baidu.html" target="_blank">百度网盘驱动配置说明</a>，找到“刷新令牌”部分，并打开页面提供的刷新令牌链接。</p><p></p><figure><img alt="百度网盘驱动文档中的刷新令牌入口" loading="lazy" width="503" height="416" src="/_astro/image-6.B4YiF11C_Z1m2fH3.webp" /><figcaption>百度网盘驱动文档中的刷新令牌入口</figcaption></figure><p></p></section><section><h3>3. 填写百度网盘配置<a href="#3-填写百度网盘配置"><span>#</span></a></h3><p>将获取到的刷新令牌填入百度网盘驱动的配置表单中。根文件夹路径可以填写 <code>/</code>，表示从百度网盘根目录开始挂载；如果只需要访问某个目录，也可以填写对应路径。</p><p></p><figure><img alt="百度网盘驱动的刷新令牌和根文件夹配置" loading="lazy" width="342" height="423" src="/_astro/image-7.CIoYECfo_1Kp6rM.webp" /><figcaption>百度网盘驱动的刷新令牌和根文件夹配置</figcaption></figure><p></p><p>其余选项先保持默认即可。对于第一次配置，建议先完成最小化设置，确认能够列出文件后再按实际需求调整索引、签名等选项。</p></section><section><h3>4. 设置下载策略<a href="#4-设置下载策略"><span>#</span></a></h3><p>在配置中修改以下两项：</p>

<table><thead><tr><th>配置项</th><th>建议值</th><th>作用</th></tr></thead><tbody><tr><td>WebDAV 策略</td><td><code>302</code></td><td>将文件请求重定向到实际下载地址，避免由 Alist 中转整个文件</td></tr><tr><td>下载接口</td><td><code>官方接口</code></td><td>使用百度网盘的官方下载接口</td></tr></tbody></table><p>这两个选项尤其影响 WebDAV 客户端的下载行为。如果客户端不支持自动跟随 <code>302</code> 重定向，可能会出现能看到文件但无法下载的情况。</p></section><section><h3>5. 保存并验证<a href="#5-保存并验证"><span>#</span></a></h3><p>点击“保存”，回到存储列表后确认百度网盘条目状态正常，再打开该存储并尝试访问一个较小的文件。</p><p></p><figure><img alt="保存后可以在文件列表中看到百度网盘目录" loading="lazy" width="287" height="165" src="/_astro/image-8.5f1Kx2t9_wsl4E.webp" /><figcaption>保存后可以在文件列表中看到百度网盘目录</figcaption></figure><p></p><p>如果网页端可以正常打开或下载文件，再使用支持 WebDAV 的文件管理器进行测试。下载时，客户端应当能够跟随 <code>302</code> 响应并开始传输文件。</p></section></section><section><h2>文件下载<a href="#文件下载"><span>#</span></a></h2><p>下载文件需要请求头，‘User-Agent: pan.baidu.com’</p><p>如下为使用<code>wget</code>下载多个链接的示例</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>wget -c \</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>-i urls.txt \</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>--header='User-Agent: pan.baidu.com' \</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>-P downloads \</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>--content-disposition</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>其中<code>urls.txt</code>是同级目录下的下载链接文件，每个链接使用回车隔开。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-12/</id>
      <title type="text">窗函数法设计FIR滤波器</title>
      <published>2026-10-12T00:00:00.000Z</published>
      <updated>2026-10-12T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-12/"/>
      <summary type="text">使用窗函数法对理想滤波器进行截断来设计FIR滤波器的系数</summary>
      <content type="html"><![CDATA[<section><h1>信号选取<a href="#信号选取"><span>#</span></a></h1><p>设被采样信号连续时间函数为
f(t) = 2<em>sin(2</em>pi<em>f1</em>t) + 10<em>sin(2</em>pi<em>f2</em>t) + 5<em>sin(2</em>pi<em>f3</em>t)
其中，
f1 = 100;<br />
f2 = 400;<br />
f3 = 800;</p><p>依据采样定理，设<br />
fs = 2400;<br />
Ts = 1/fs;</p><p>连续时间t和采样时间的关系可以表示为<br />
t = n*Ts<br />
其中n为序列的下标</p><p>取观察时间T = 0.1s;</p></section>
<section><h1>使用matlab生成离散时间信号序列<a href="#使用matlab生成离散时间信号序列"><span>#</span></a></h1><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>% 被采样信号设为f(t) = 2*sin(2*pi*f1*t) + 10*sin(2*pi*f2*t) + 5*sin(2*pi*f3*t)</span></div></div><div><div><div>2</div></div><div><span>f1 = </span><span>100</span><span>;</span></div></div><div><div><div>3</div></div><div><span>f2 = </span><span>400</span><span>;</span></div></div><div><div><div>4</div></div><div><span>f3 = </span><span>800</span><span>;</span></div></div><div><div><div>5</div></div><div><span>fs = </span><span>2400</span><span>;</span></div></div><div><div><div>6</div></div><div><span>Ts = </span><span>1</span><span>/fs;</span></div></div><div><div><div>7</div></div><div><span>% 观察时间</span></div></div><div><div><div>8</div></div><div><span>T = </span><span>0.1</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>% 序列索引</span></div></div><div><div><div>11</div></div><div><span>n = </span><span>0</span><span>:round(T/Ts);</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>% 连续时间t和采样时刻的关系</span></div></div><div><div><div>14</div></div><div><span>t = n*Ts;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>% 序列</span></div></div><div><div><div>17</div></div><div><span>x = </span><span>2</span><span>*sin(</span><span>2</span><span>*</span><span>pi</span><span>*f1*t) + </span><span>10</span><span>*sin(</span><span>2</span><span>*</span><span>pi</span><span>*f2*t) + </span><span>5</span><span>*sin(</span><span>2</span><span>*</span><span>pi</span><span>*f3*t);</span></div></div><div><div><div>18</div></div><div><span>N = length(x);</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h1>标准DFT函数<a href="#标准dft函数"><span>#</span></a></h1><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span><span> </span><span>X_w</span><span> = </span></span><span>DFT</span><span><span>(</span><span>x</span><span>,</span><span>N</span><span>)</span></span></div></div><div><div><div>2</div></div><div><span>    </span><span>for</span><span> k = </span><span>0</span><span> : N - </span><span>1</span></div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>S = </span><span>0</span><span>;</span></div></div><div><div><div>4</div></div><div><span>        </span><span>for</span><span> n = </span><span>0</span><span> : N - </span><span>1</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>S = S + x(n+</span><span>1</span><span>) * exp(-</span><span>1j</span><span>*(</span><span>2</span><span>*</span><span>pi</span><span>*k*n/N));</span></div></div><div><div><div>6</div></div><div><span>        </span><span>end</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>X_w(k+</span><span>1</span><span>) = S;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>% X_clean = round(real(X_w), 12) + 1i*round(imag(X_w), 12);</span></div></div><div><div><div>9</div></div><div><span>    </span><span>end</span></div></div><div><div><div>10</div></div><div><span>end</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h1>观察信号的频谱<a href="#观察信号的频谱"><span>#</span></a></h1><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>X_w = DFT(x, length(x));</span></div></div><div><div><div>2</div></div><div><span>k = </span><span>0</span><span>:length(X_w)-</span><span>1</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>% 绘图</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>figure;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>subplot(</span><span>2</span><span>,</span><span>1</span><span>,</span><span>1</span><span>);</span></div></div><div><div><div>9</div></div><div><span>stem(n, x, </span><span>'filled'</span><span>);</span></div></div><div><div><div>10</div></div><div><span>xlabel(</span><span>'n'</span><span>);</span></div></div><div><div><div>11</div></div><div><span>ylabel(</span><span>'x[n]'</span><span>);</span></div></div><div><div><div>12</div></div><div><span>title(</span><span>'时域序列'</span><span>);</span></div></div><div><div><div>13</div></div><div><span>grid</span><span> on;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>subplot(</span><span>2</span><span>,</span><span>1</span><span>,</span><span>2</span><span>);</span></div></div><div><div><div>16</div></div><div><span>stem(k, abs(X_w), </span><span>'filled'</span><span>);</span></div></div><div><div><div>17</div></div><div><span>xlabel(</span><span>'k'</span><span>);</span></div></div><div><div><div>18</div></div><div><span>ylabel(</span><span>'|X[k]|'</span><span>);</span></div></div><div><div><div>19</div></div><div><span>title(</span><span>'DFT幅度谱'</span><span>);</span></div></div><div><div><div>20</div></div><div><span>grid</span><span> on;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>可以得出：<br />
</p><figure><img alt="alt text" loading="lazy" width="537" height="427" src="/_astro/image.C-K6Wpwi_Z2bgU7S.webp" /><figcaption>alt text</figcaption></figure><br />
现在的目标就是抑制频率为800hz的信号成分<br />
可以设理想滤波器的通带截至频率为wp = 2 * pi * 500hz，阻带频率为ws = 2 * pi * 600hz<p></p><p>理想滤波器公式：<br />
</p><figure><img alt="alt text" loading="lazy" width="469" height="123" src="/_astro/image-1.B6LxuDkW_2enrIb.webp" /><figcaption>alt text</figcaption></figure><br />
注意，公式中的角频率是不是Hz为单位，而是离散时间角频率，即rad/sample<p></p><p>连续时间信号<span><span>x(t)=cos⁡(2πft)x(t)=\cos(2\pi f t)</span><span><span><span></span><span>x</span><span>(</span><span>t</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>cos</span><span>(</span><span>2</span><span>π</span><span>f</span><span>t</span><span>)</span></span></span></span><br />
采样后：<span><span>t=nTs=nfst=nT_s=\frac{n}{f_s}</span><span><span><span></span><span>t</span><span></span><span>=</span><span></span></span><span><span></span><span>n</span><span><span>T</span><span><span><span><span><span><span></span><span><span>s</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span><span><span>f</span><span><span><span><span><span><span></span><span><span>s</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>n</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span><br />
所以：</p><span><span><span>x[n]=cos⁡(2πfnfs)=cos⁡(ωn)x[n]
=\cos\left(2\pi f\frac{n}{f_s}\right)
=\cos(\omega n)</span><span><span><span></span><span>x</span><span>[</span><span>n</span><span>]</span><span></span><span>=</span><span></span></span><span><span></span><span>cos</span><span></span><span><span><span>(</span></span><span>2</span><span>π</span><span>f</span><span><span></span><span><span><span><span><span><span></span><span><span><span>f</span><span><span><span><span><span><span></span><span><span>s</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span><span>n</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span><span>)</span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>cos</span><span>(</span><span>ω</span><span>n</span><span>)</span></span></span></span></span><p>因此不妨直接设<br />
wp = wp = 2 * pi * 500 / fs<br />
ws = 2 * pi * 600 / fs</p><p>则有截止频率<br />
wc = (ws+wp) * 0.5;</p><p>如下matlab代码的理想滤波器实现</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ws = </span><span>2</span><span>*</span><span>pi</span><span>*</span><span>500</span><span>/fs;</span></div></div><div><div><div>2</div></div><div><span>wp = </span><span>2</span><span>*</span><span>pi</span><span>*</span><span>600</span><span>/fs;</span></div></div><div><div><div>3</div></div><div><span>wc = (ws+wp) * </span><span>0.5</span><span>;</span></div></div><div><div><div>4</div></div><div><span>alpha = (N - </span><span>1</span><span>) / </span><span>2</span><span>;</span></div></div><div><div><div>5</div></div><div><span>% 理想滤波器</span></div></div><div><div><div>6</div></div><div><span>% hd = sin(wc * (n - alpha)) ./ (pi * (n - alpha));</span></div></div><div><div><div>7</div></div><div><span>for</span><span> m = </span><span>0</span><span> : N - </span><span>1</span></div></div><div><div><div>8</div></div><div><span>    </span><span>if</span><span> (n(m + </span><span>1</span><span>) - alpha) ~= </span><span>0</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>hd(m + </span><span>1</span><span>) = sin(wc * (n(m + </span><span>1</span><span>) - alpha)) / (</span><span>pi</span><span> * (n(m + </span><span>1</span><span>) - alpha));</span></div></div><div><div><div>10</div></div><div><span>    </span><span>else</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>hd(m + </span><span>1</span><span>) = wc / </span><span>pi</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>end</span></div></div><div><div><div>13</div></div><div><span>end</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img alt="alt text" loading="lazy" width="469" height="123" src="/_astro/image-3.Atz3BN6-_16NpOg.webp" /><figcaption>alt text</figcaption></figure>
<code>(n(m + 1) - alpha) ~= 0</code>表示公式中<code>n - alpha</code>不为0的时候，当<code>n - alpha = 0</code>时，可求得<code> hd = wc / pi</code><p></p></section>
<section><h1>选择窗函数—Hann 窗为例<a href="#选择窗函数hann-窗为例"><span>#</span></a></h1><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>% 窗函数</span></div></div><div><div><div>2</div></div><div><span>w = </span><span>0.5</span><span> * (</span><span>1</span><span> - cos(</span><span>2</span><span>*</span><span>pi</span><span>*n / (N - </span><span>1</span><span>)));</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将理想滤波器与窗函数在时序相乘对理想滤波器进行截断，得到滤波器系数</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>% 滤波器</span></div></div><div><div><div>2</div></div><div><span>h = hd .* w;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看滤波器的频域响应是否符合预期</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Hw = DFT(h,length(h));</span></div></div><div><div><div>2</div></div><div><span>wk = </span><span>0</span><span> : length(h) - </span><span>1</span><span>;</span></div></div><div><div><div>3</div></div><div><span>figure;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>subplot(</span><span>1</span><span>,</span><span>1</span><span>,</span><span>1</span><span>);</span></div></div><div><div><div>6</div></div><div><span>stem(wk, abs(Hw), </span><span>'filled'</span><span>);</span></div></div><div><div><div>7</div></div><div><span>xlabel(</span><span>'wk'</span><span>);</span></div></div><div><div><div>8</div></div><div><span>ylabel(</span><span>'|hw|'</span><span>);</span></div></div><div><div><div>9</div></div><div><span>title(</span><span>'滤波器'</span><span>);</span></div></div><div><div><div>10</div></div><div><span>grid</span><span> on;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img alt="alt text" loading="lazy" width="521" height="144" src="/_astro/image-2.CprBIJHC_Za3vii.webp" /><figcaption>alt text</figcaption></figure><br />
由于DFT的周期性质，因此DTF图像上后部分有一段重复的图像。<p></p></section>
<section><h1>得到滤波后的信号<a href="#得到滤波后的信号"><span>#</span></a></h1><p>要得到滤波后的信号则直接将信号和滤波器进行卷积</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>x_f = conv(x, h); </span><span>% 卷积之后长度会变化</span></div></div><div><div><div>2</div></div><div><span>n_xf = </span><span>0</span><span> : length(x_f) - </span><span>1</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>注意卷积之后长度会变化，不再是N<br />
再对滤波后的信号进行DTF分析</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Xf_w = DTF(x_f, length(x_f));</span></div></div><div><div><div>2</div></div><div><span>k_xf = </span><span>0</span><span> : length(Xf_w) - </span><span>1</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>最后绘制图像</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>figure;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>subplot(</span><span>3</span><span>,</span><span>1</span><span>,</span><span>1</span><span>);</span></div></div><div><div><div>4</div></div><div><span>stem(wk, abs(Hw), </span><span>'filled'</span><span>);</span></div></div><div><div><div>5</div></div><div><span>xlabel(</span><span>'wk'</span><span>);</span></div></div><div><div><div>6</div></div><div><span>ylabel(</span><span>'|hw|'</span><span>);</span></div></div><div><div><div>7</div></div><div><span>title(</span><span>'滤波器'</span><span>);</span></div></div><div><div><div>8</div></div><div><span>grid</span><span> on;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>subplot(</span><span>3</span><span>,</span><span>1</span><span>,</span><span>2</span><span>);</span></div></div><div><div><div>11</div></div><div><span>stem(n_xf, x_f, </span><span>'filled'</span><span>);</span></div></div><div><div><div>12</div></div><div><span>xlabel(</span><span>'n_xf'</span><span>);</span></div></div><div><div><div>13</div></div><div><span>ylabel(</span><span>'x_f'</span><span>);</span></div></div><div><div><div>14</div></div><div><span>title(</span><span>'滤波后信号'</span><span>);</span></div></div><div><div><div>15</div></div><div><span>grid</span><span> on;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>subplot(</span><span>3</span><span>,</span><span>1</span><span>,</span><span>3</span><span>);</span></div></div><div><div><div>18</div></div><div><span>stem(k_xf, abs(Xf_w), </span><span>'filled'</span><span>);</span></div></div><div><div><div>19</div></div><div><span>xlabel(</span><span>'k_xf'</span><span>);</span></div></div><div><div><div>20</div></div><div><span>ylabel(</span><span>'|Xf_w|'</span><span>);</span></div></div><div><div><div>21</div></div><div><span>title(</span><span>'滤波后频谱'</span><span>);</span></div></div><div><div><div>22</div></div><div><span>grid</span><span> on;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p></p><figure><img alt="alt text" loading="lazy" width="544" height="423" src="/_astro/image-4.Dmxh9mUX_Z2iKtX1.webp" /><figcaption>alt text</figcaption></figure><p></p><p>由于群延迟的存在，因此滤波后的时域信号产生了延迟，在图像上表现为往后延迟了，前100+个采样点的值在0附近。<br />
由：
<span><span>ϕ(ω)=−N−12ω\phi(\omega)=-\frac{N-1}{2}\omega</span><span><span><span></span><span>ϕ</span><span>(</span><span>ω</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>−</span><span><span></span><span><span><span><span><span><span></span><span><span><span>2</span></span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>N</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span>ω</span></span></span></span><br />
可得群延迟:<br />
<span><span>τg(ω)=−dϕ(ω)dω=N−12\tau_g(\omega)=-\frac{d\phi(\omega)}{d\omega}=\frac{N-1}{2}</span><span><span><span></span><span><span>τ</span><span><span><span><span><span><span></span><span><span>g</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>(</span><span>ω</span><span>)</span><span></span><span>=</span><span></span></span><span><span></span><span>−</span><span><span></span><span><span><span><span><span><span></span><span><span><span>d</span><span>ω</span></span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>d</span><span>ϕ</span><span>(</span><span>ω</span><span>)</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span><span>2</span></span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>N</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span><br />
因此所有通过的频率分量大约都延迟：<br />
<span><span>N−12\frac{N-1}{2}</span><span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span><span>2</span></span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>N</span><span>−</span><span>1</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span><br />
个采样点，滤波后波形整体向右移动。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-11/</id>
      <title type="text">Ubuntu 下使用 Easy Effects 优化耳机听感</title>
      <published>2026-10-11T00:00:00.000Z</published>
      <updated>2026-10-11T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-11/"/>
      <summary type="text">记录 Ubuntu 下使用 Easy Effects 调整立体声宽度、军鼓亮度，以及贝斯和大鼓低频的过程。</summary>
      <content type="html"><![CDATA[<section><h1>Ubuntu 下使用 Easy Effects 优化耳机听感<a href="#ubuntu-下使用-easy-effects-优化耳机听感"><span>#</span></a></h1><p>Easy Effects 可以在 Ubuntu 下对 PipeWire 管理的音频进行实时处理。它提供了很多效果器：串音消除器、交叉反馈、人声抑制器、低音响度、低音增强器、卷积混响器、压缩器、响度、回音消除器、均衡器、多频带压缩器、多频带门限、延迟、扩展器、放大器、深度除噪、混响、滤波器、激励器、电平表、立体声工具、粉碎器、自动增益、自动调音、语音处理器、门限、降噪、限幅器、音质晶化器、音高和齿音消除器。</p><p>这篇文章只记录实际用到的三类处理：先用「立体声工具」解决声音宽度，再用「均衡器」调整军鼓、贝斯和大鼓，最后说明为什么没有继续使用「低音增强器」。</p><section><h2>声音宽度过窄：使用立体声工具<a href="#声音宽度过窄使用立体声工具"><span>#</span></a></h2><p></p><figure><img alt="Easy Effects 立体声工具参数界面" loading="lazy" width="1065" height="681" src="/_astro/easy-effects-stereo-tools.CpAjY7V-_1TMhw1.webp" /><figcaption>Easy Effects 立体声工具参数界面</figcaption></figure><p></p><section><h3>Mid/Side 原理<a href="#midside-原理"><span>#</span></a></h3><p>立体声工具不是简单地把左声道调大、右声道调大，而是可以把左右声道转换成中间信号和侧边信号进行处理：</p><p>[
M=\frac{L+R}{2}
]</p><p>[
S=\frac{L-R}{2}
]</p><p>其中：</p><ul>
<li><code>M</code> 是中间信号，通常包含居中的人声、贝斯和大鼓。</li>
<li><code>S</code> 是侧边信号，包含左右声道的差异、空间感和边缘乐器。</li>
<li>增强 <code>S</code>，声音会变宽。</li>
<li>减弱 <code>M</code>，中心声像会变弱，声音也会显得更宽。</li>
</ul></section><section><h3>重要参数<a href="#重要参数"><span>#</span></a></h3>

<table><thead><tr><th>参数</th><th>作用</th><th>调节结果</th></tr></thead><tbody><tr><td>模式</td><td>选择左右声道和 Mid/Side 的转换方式</td><td>日常播放保持 <code>LR &gt; LR（默认立体声）</code></td></tr><tr><td>侧信号电平</td><td>调整 <code>S</code> 的音量</td><td>增大变宽，过大容易相位相消</td></tr><tr><td>侧信号平衡</td><td>调整侧边信息的左右平衡</td><td>偏离中央会让空间感向一侧倾斜</td></tr><tr><td>中信号电平</td><td>调整 <code>M</code> 的音量</td><td>调低会变宽，但人声和低音会变薄</td></tr><tr><td>中信号全景</td><td>调整中心信号的位置</td><td><code>0.00</code> 表示居中</td></tr><tr><td>输入立体声平衡</td><td>处理前的左右平衡</td><td>不用于扩宽，通常保持 <code>0.00</code></td></tr><tr><td>输出立体声平衡</td><td>处理后的左右平衡</td><td>不用于扩宽，通常保持 <code>0.00</code></td></tr><tr><td>延迟</td><td>给左右声道制造时间差</td><td>可以变宽，但容易出现回声和相位问题</td></tr><tr><td>立体声基线</td><td>调整左右声道的差异</td><td>以界面默认值为基准，小幅增加即可</td></tr><tr><td>立体声相位</td><td>旋转左右声道的相位关系</td><td><code>0°</code> 最稳定，不建议用它制造宽度</td></tr><tr><td>干</td><td>未处理的原始信号电平</td><td><code>-inf</code> 表示关闭原始路径</td></tr><tr><td>湿</td><td>处理后信号的电平</td><td>控制立体声工具处理结果的音量</td></tr></tbody></table><p>「软削波」用于让峰值以更平滑的曲线变形，不是扩宽参数。它会增加谐波和失真，追求干净音质时可以关闭。软削波关闭时，灰色的「侧链电平」不需要调整。</p><p>「静音」会直接关闭对应的左右声道；「反转相位」会把对应声道乘以 <code>-1</code>。反转相位有时会让声音听起来很宽，但也会造成严重的单声道相消，不应该用来扩宽。</p></section><section><h3>一组稳妥的起始值<a href="#一组稳妥的起始值"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>模式：LR &gt; LR（默认立体声）</span></div></div><div><div><div>2</div></div><div><span>侧信号电平：0～+1 dB</span></div></div><div><div><div>3</div></div><div><span>侧信号平衡：0.00</span></div></div><div><div><div>4</div></div><div><span>中信号电平：0 dB</span></div></div><div><div><div>5</div></div><div><span>中信号全景：0.00</span></div></div><div><div><div>6</div></div><div><span>输入/输出立体声平衡：0.00</span></div></div><div><div><div>7</div></div><div><span>延迟：0 ms</span></div></div><div><div><div>8</div></div><div><span>立体声相位：0°</span></div></div><div><div><div>9</div></div><div><span>左右静音：关闭</span></div></div><div><div><div>10</div></div><div><span>左右反转相位：关闭</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果声音很宽，但中间的人声和低音乐器变空，优先按下面的顺序恢复：</p><ol>
<li>降低侧信号电平。</li>
<li>把中信号电平调回 <code>0 dB</code>。</li>
<li>把立体声基线恢复为默认值。</li>
<li>确认延迟为 <code>0 ms</code>，左右没有反转相位。</li>
<li>必要时把干信号从 <code>-inf</code> 提高到 <code>-12～-6 dB</code>，补回一部分原始中心声像。</li>
</ol><p>低频尤其容易受到相位相消影响，所以不要用延迟或反转相位去扩宽贝斯和大鼓。</p></section></section><section><h2>让军鼓变亮：使用均衡器<a href="#让军鼓变亮使用均衡器"><span>#</span></a></h2><section><h3>原理<a href="#原理"><span>#</span></a></h3><p>军鼓不是只有一个频率，不同频段承担不同听感：</p>

<table><thead><tr><th>频段</th><th>主要听感</th></tr></thead><tbody><tr><td>100～200 Hz</td><td>鼓身和厚度</td></tr><tr><td>250～600 Hz</td><td>箱体感、闷和浑浊</td></tr><tr><td>2～4 kHz</td><td>敲击瞬态、力度和穿透力</td></tr><tr><td>5～8 kHz</td><td>鼓皮和响弦的“啪”“亮”</td></tr><tr><td>9～12 kHz</td><td>高频细节和空气感</td></tr></tbody></table><p>因此，军鼓变亮主要是增强 <code>2～8 kHz</code>，而不是直接把整体音量调大。</p><p>均衡器的三个核心参数是：</p><ul>
<li><strong>频率</strong>：要处理哪个频段。</li>
<li><strong>增益</strong>：提升或削弱多少 dB。</li>
<li><strong>Q 值</strong>：影响范围的宽窄。Q 越大，范围越窄。</li>
</ul></section><section><h3>调节方法<a href="#调节方法"><span>#</span></a></h3><p>先添加一个峰值滤波器：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>频率：3.5～4 kHz</span></div></div><div><div><div>2</div></div><div><span>增益：+1～2 dB</span></div></div><div><div><div>3</div></div><div><span>Q：约 1.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>它会增强军鼓的敲击感和穿透力。</p><p>如果还需要响弦的亮度，可以再添加：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>频率：6～7 kHz</span></div></div><div><div><div>2</div></div><div><span>增益：+0.5～1.5 dB</span></div></div><div><div><div>3</div></div><div><span>Q：约 0.8～1.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果军鼓听起来像装在箱子里，可以削减：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>频率：300～500 Hz</span></div></div><div><div><div>2</div></div><div><span>增益：-1～-2 dB</span></div></div><div><div><div>3</div></div><div><span>Q：约 1.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这是一条输出管线，均衡器会同时影响人声、镲片和其他乐器，因此不要大幅提升高频。调节前后应尽量保持整体响度相同，避免把“更响”误认为“更亮”。</p></section></section><section><h2>增强贝斯和大鼓：仍然先用均衡器<a href="#增强贝斯和大鼓仍然先用均衡器"><span>#</span></a></h2><section><h3>原理<a href="#原理-1"><span>#</span></a></h3><p>贝斯和大鼓的主要低频区域有所重叠：</p>

<table><thead><tr><th>频段</th><th>主要听感</th></tr></thead><tbody><tr><td>50～80 Hz</td><td>大鼓的下潜和冲击</td></tr><tr><td>80～120 Hz</td><td>贝斯的根基和厚度</td></tr><tr><td>200～300 Hz</td><td>低频的浑浊和轰鸣</td></tr></tbody></table><p>可以先用很小的增益调整：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>大鼓没冲击：60～80 Hz，+1～2 dB</span></div></div><div><div><div>2</div></div><div><span>贝斯不够厚：90～120 Hz，+1～2 dB</span></div></div><div><div><div>3</div></div><div><span>声音发轰：200～300 Hz，-1～2 dB</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不要同时大幅提升 <code>60 Hz</code> 和 <code>120 Hz</code>，否则贝斯和大鼓会挤在一起。调整后如果立体声宽度变弱，也不要继续增加低频增益，应该先回退低频提升量。</p></section></section><section><h2>为什么低音增强器没有继续使用<a href="#为什么低音增强器没有继续使用"><span>#</span></a></h2><p></p><figure><img alt="Easy Effects 低音增强器参数界面" loading="lazy" width="918" height="635" src="/_astro/easy-effects-bass-enhancer.NPENZooX_16HEbl.webp" /><figcaption>Easy Effects 低音增强器参数界面</figcaption></figure><p></p><p>低音增强器不是普通均衡器。它会根据原始低频生成二次、三次等谐波，再把谐波混回原信号。例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>60 Hz → 120 Hz、180 Hz 等谐波</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样可以让低端设备“听见”原本难以播放的低音，但它并没有真正增加设备无法播放的超低频。谐波过多时，贝斯、大鼓和其他低频会一起变浑浊，中心声像也可能变厚，主观上削弱立体声宽度。</p><p>截图中的几个参数含义如下：</p>

<table><thead><tr><th>参数</th><th>作用</th></tr></thead><tbody><tr><td>输入</td><td>进入低音增强器前的电平；<code>-6 dB</code> 可以给处理留出余量</td></tr><tr><td>输出</td><td>处理完成后的整体电平；<code>0 dB</code> 表示不额外调整</td></tr><tr><td>谐波注入</td><td>在二次和三次谐波之间选择音色；二次更厚，三次更有颗粒和存在感</td></tr><tr><td>幅度</td><td>谐波混入原信号的强度</td></tr><tr><td>谐波</td><td>谐波发生器的驱动强度，不是简单的“谐波数量”</td></tr><tr><td>频率范围</td><td>限制参与低音增强的频率上界；数值越大，处理范围越宽</td></tr><tr><td>激活下限</td><td>启用「下限」限制</td></tr><tr><td>下限</td><td>限制低于该频率的谐波生成，避免次声和震动参与处理</td></tr><tr><td>谐波电平表</td><td>显示当前生成谐波的电平，不是可调参数</td></tr></tbody></table><p>截图中使用的是 <code>幅度 8 dB</code>、<code>谐波 10</code> 和 <code>频率范围 200 Hz</code>，对于整条输出管线来说比较激进。它更适合低端扬声器缺少低频时使用，不适合当前这种希望同时保留宽度和清晰度的设置。</p><p>所以这里选择关闭低音增强器，只用均衡器提升原本已经存在的低频，听感更自然，也更容易维持立体声宽度。</p></section><section><h2>最终使用方式<a href="#最终使用方式"><span>#</span></a></h2><p>目前最合适的处理顺序是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>均衡器 → 立体声工具</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>均衡器负责调整军鼓、贝斯和大鼓的频率比例；立体声工具负责控制左右空间。低频小幅提升，宽度小幅调整，通常比叠加更多处理更稳定。</p><p>最后用熟悉的音乐反复对比处理前后，并检查单声道播放时人声、贝斯和大鼓是否仍然完整。只要中心声像没有空洞、低频没有轰鸣，就说明设置已经达到目的。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-10/</id>
      <title type="text">Ubuntu 下使用 nvidia-smi 管理显卡功耗</title>
      <published>2026-10-10T00:00:00.000Z</published>
      <updated>2026-10-10T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-10/"/>
      <summary type="text">在 Ubuntu 上使用 nvidia-smi 查看显卡功耗范围，并通过 nvidia-powerd 设置功耗上限。</summary>
      <content type="html"><![CDATA[<section><h1>先查看显卡功耗范围<a href="#先查看显卡功耗范围"><span>#</span></a></h1><p>设置功耗上限前，先查看显卡当前的功耗墙，以及驱动报告的默认值、最小值和最大值：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chacha@chacha</span><span> </span><span>~</span></div></div><div><div><div>2</div></div><div><span>❯</span><span> </span><span>nvidia-smi</span><span> </span><span>-q</span><span> </span><span>-d</span><span> </span><span>POWER</span><span> | </span><span>grep</span><span> </span><span>"Power Limit"</span></div></div><div><div><div>3</div></div><div><span>        </span><span>Current</span><span> </span><span>Power</span><span> </span><span>Limit</span><span>                            </span><span>:</span><span> </span><span>55.00</span><span> </span><span>W</span></div></div><div><div><div>4</div></div><div><span>        </span><span>Requested</span><span> </span><span>Power</span><span> </span><span>Limit</span><span>                          </span><span>:</span><span> </span><span>55.00</span><span> </span><span>W</span></div></div><div><div><div>5</div></div><div><span>        </span><span>Default</span><span> </span><span>Power</span><span> </span><span>Limit</span><span>                            </span><span>:</span><span> </span><span>55.00</span><span> </span><span>W</span></div></div><div><div><div>6</div></div><div><span>        </span><span>Min</span><span> </span><span>Power</span><span> </span><span>Limit</span><span>                                </span><span>:</span><span> </span><span>5.00</span><span> </span><span>W</span></div></div><div><div><div>7</div></div><div><span>        </span><span>Max</span><span> </span><span>Power</span><span> </span><span>Limit</span><span>                                </span><span>:</span><span> </span><span>115.00</span><span> </span><span>W</span></div></div><div><div><div>8</div></div><div><span>        </span><span>Current</span><span> </span><span>Power</span><span> </span><span>Limit</span><span>                            </span><span>:</span><span> </span><span>N/A</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>从这台设备的输出可以看到，当前功耗上限为 <code>55 W</code>，驱动报告的最大功耗上限为 <code>115 W</code>。不同显卡和驱动版本支持的范围可能不同，因此不要直接照搬这里的数值。</p><section><h2>设置功耗上限<a href="#设置功耗上限"><span>#</span></a></h2><p>下面以这台设备报告的最大值 <code>115 W</code> 为例，通过 <code>nvidia-powerd</code> 服务设置功耗上限。先安装对应的软件包：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>nvidia-powerd</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后创建 systemd 服务文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>tee</span><span> </span><span>/etc/systemd/system/nvidia-powerd.service</span><span> &gt; </span><span>/dev/null</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=NVIDIA Power Daemon</span></div></div><div><div><div>4</div></div><div><span>After=syslog.target</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>[Service]</span></div></div><div><div><div>7</div></div><div><span>Type=simple</span></div></div><div><div><div>8</div></div><div><span>ExecStart=/usr/bin/nvidia-powerd --max-power=115</span></div></div><div><div><div>9</div></div><div><span>Restart=always</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>[Install]</span></div></div><div><div><div>12</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>13</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重新加载 systemd 配置并启用服务：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>enable</span><span> </span><span>--now</span><span> </span><span>nvidia-powerd</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>status</span><span> </span><span>--no-pager</span><span> </span><span>nvidia-powerd</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>服务启动后，再次查看功耗上限：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nvidia-smi</span><span> </span><span>-q</span><span> </span><span>-d</span><span> </span><span>POWER</span><span> | </span><span>grep</span><span> </span><span>"Power Limit"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>示例输出如下：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Current Power Limit                            : 115.00 W</span></div></div><div><div><div>2</div></div><div><span>Requested Power Limit                          : N/A</span></div></div><div><div><div>3</div></div><div><span>Default Power Limit                            : 55.00 W</span></div></div><div><div><div>4</div></div><div><span>Min Power Limit                                : 5.00 W</span></div></div><div><div><div>5</div></div><div><span>Max Power Limit                                : 115.00 W</span></div></div><div><div><div>6</div></div><div><span>Current Power Limit                            : N/A</span></div></div><div><div><div>7</div></div><div><span>Requested Power Limit                          : N/A</span></div></div><div><div><div>8</div></div><div><span>Default Power Limit                            : N/A</span></div></div><div><div><div>9</div></div><div><span>Min Power Limit                                : N/A</span></div></div><div><div><div>10</div></div><div><span>Max Power Limit                                : N/A</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>此时，当前功耗上限从 <code>55 W</code> 提高到了 <code>115 W</code>。<code>Default Power Limit</code> 仍然显示为 <code>55 W</code>，它表示设备或驱动报告的默认值，并不等同于当前通过服务设置的功耗上限。</p></section><section><h2>注意事项<a href="#注意事项"><span>#</span></a></h2><ul>
<li>先确认 <code>nvidia-smi</code> 输出中的 <code>Max Power Limit</code>，再填写 <code>--max-power</code> 的值。</li>
<li>功耗上限受显卡型号、BIOS 和 NVIDIA 驱动支持情况影响；如果服务启动失败，应先查看 <code>systemctl status nvidia-powerd</code> 的错误信息。</li>
<li>提高功耗上限通常会带来更高的性能上限，同时也可能增加功耗、发热和风扇噪声。</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-09/</id>
      <title type="text">Ubuntu 下使用网易云音乐：ncm-cli 入门</title>
      <published>2026-10-09T00:00:00.000Z</published>
      <updated>2026-10-09T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-09/"/>
      <summary type="text">使用 ncm-cli 在 Ubuntu 终端中搜索、播放和管理网易云音乐</summary>
      <content type="html"><![CDATA[<section><h1>ncm-cli 是什么<a href="#ncm-cli-是什么"><span>#</span></a></h1><p><code>ncm-cli</code> 是网易云音乐的命令行工具，可以在终端中完成歌曲搜索、播放、歌词查看和播放状态管理。对于习惯使用 Ubuntu、远程终端或轻量桌面环境的用户来说，这是一种不依赖图形客户端的使用方式。</p><p>本文记录一套基础使用流程，更多安装与配置说明可以参考<a href="https://music.163.com/st/ncmcli#setup" target="_blank">官方文档</a>。</p><section><h2>前置条件<a href="#前置条件"><span>#</span></a></h2><p>使用前需要准备：</p><ol>
<li>Node.js 18 或更高版本。</li>
<li>网易云音乐开放平台账号，以及用于配置的 API Key（<code>appId</code> 和 <code>privateKey</code>）。</li>
<li>一台可以运行 npm 的 Ubuntu 或其他 Linux 环境。</li>
</ol><p>如果只想先了解完整的安装要求，可以查看 <a href="https://developer.music.163.com/" target="_blank">网易云音乐开放平台</a>。</p></section><section><h2>安装与配置<a href="#安装与配置"><span>#</span></a></h2><section><h3>1. 安装 ncm-cli<a href="#1-安装-ncm-cli"><span>#</span></a></h3><p>先确认 Node.js 版本，然后通过 npm 全局安装：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>node</span><span> </span><span>--version</span></div></div><div><div><div>2</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>-g</span><span> </span><span>@music163/ncm-cli</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2. 配置 API Key<a href="#2-配置-api-key"><span>#</span></a></h3><p>安装完成后运行配置向导：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ncm-cli</span><span> </span><span>configure</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>按照提示填入开放平台提供的 <code>appId</code> 和 <code>privateKey</code>。配置完成后，登录网易云音乐账号：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ncm-cli</span><span> </span><span>login</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果登录超时，可以重新执行 <code>ncm-cli login</code>。不要把 <code>privateKey</code>、登录信息或命令输出中的敏感内容发布到文章、截图和日志中。</p></section></section><section><h2>常用命令<a href="#常用命令"><span>#</span></a></h2><p>下面列出日常使用中最常见的命令：</p>

<table><thead><tr><th>操作</th><th>命令</th></tr></thead><tbody><tr><td>搜索歌曲</td><td><code>ncm-cli search song --keyword "林俊杰"</code></td></tr><tr><td>播放歌曲</td><td><code>ncm-cli play --song --encrypted-id &lt;加密 ID&gt; --original-id &lt;原始 ID&gt;</code></td></tr><tr><td>暂停播放</td><td><code>ncm-cli pause</code></td></tr><tr><td>继续播放</td><td><code>ncm-cli resume</code></td></tr><tr><td>下一首</td><td><code>ncm-cli next</code></td></tr><tr><td>上一首</td><td><code>ncm-cli prev</code></td></tr><tr><td>调节音量</td><td><code>ncm-cli volume 60</code></td></tr><tr><td>查看播放状态</td><td><code>ncm-cli state</code></td></tr><tr><td>查看歌词</td><td><code>ncm-cli song lyric --id &lt;歌曲 ID&gt;</code></td></tr></tbody></table><p>音量范围是 <code>0</code> 到 <code>100</code>。搜索结果中的歌曲信息会提供播放所需的 ID，实际能否播放还取决于账号权限和歌曲资源情况。</p><p>例如，先搜索歌曲，再根据返回的 ID 播放：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ncm-cli</span><span> </span><span>search</span><span> </span><span>song</span><span> </span><span>--keyword</span><span> </span><span>"林俊杰"</span></div></div><div><div><div>2</div></div><div><span>ncm-cli</span><span> </span><span>play</span><span> </span><span>--song</span><span> </span><span>--encrypted-id</span><span> </span><span>&lt;加密</span><span> </span><span>ID&gt;</span><span> </span><span>--original-id</span><span> </span><span>&lt;原始</span><span> </span><span>ID&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>使用 TUI 播放器<a href="#使用-tui-播放器"><span>#</span></a></h2><p>如果希望在终端中使用交互式界面，可以运行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ncm-cli</span><span> </span><span>tui</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>TUI 模式更适合持续播放和浏览歌曲；如果只想快速执行某个操作，直接使用上面的命令即可。</p></section><section><h2>常见问题<a href="#常见问题"><span>#</span></a></h2><section><h3><code>ncm-cli: command not found</code><a href="#ncm-cli-command-not-found"><span>#</span></a></h3><p>通常是 npm 的全局 bin 目录没有加入 <code>PATH</code>。可以先确认安装是否成功，再检查 npm 全局目录：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npm</span><span> </span><span>list</span><span> </span><span>-g</span><span> </span><span>--depth=0</span></div></div><div><div><div>2</div></div><div><span>npm</span><span> </span><span>prefix</span><span> </span><span>-g</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>登录失败或超时<a href="#登录失败或超时"><span>#</span></a></h3><p>确认 API Key 配置正确后，重新运行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ncm-cli</span><span> </span><span>login</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果仍然无法登录，建议对照<a href="https://music.163.com/st/ncmcli#setup" target="_blank">官方安装配置说明</a>检查账号和开放平台配置。</p></section></section><section><h2>相关技能包<a href="#相关技能包"><span>#</span></a></h2><p>如果希望让 AI Agent 调用网易云音乐能力，可以进一步了解网易云音乐发布的 <a href="https://github.com/NetEase/skills" target="_blank">Agent Skills</a> 项目。使用前仍然需要先完成 ncm-cli 的安装、配置和登录。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-08/</id>
      <title type="text">200G 流量仍然不够用怎么办？——五元月租校园网的分流方案</title>
      <published>2026-10-08T00:00:00.000Z</published>
      <updated>2026-10-08T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-08/"/>
      <summary type="text">利用 scrcpy 和两台安卓设备，将校园网与移动数据分工使用，缓解移动流量不足的问题。</summary>
      <content type="html"><![CDATA[<section><h1>流量与五元校园网的优劣<a href="#流量与五元校园网的优劣"><span>#</span></a></h1><ul>
<li>移动数据：网速比五元校园网快，但流量有限。</li>
<li>五元校园网：流量不限，但网速较慢，且使用部分工具的时候可能会受到限制。</li>
</ul></section>
<section><h1>使用场景<a href="#使用场景"><span>#</span></a></h1><p>学习或写作业时，如果使用移动数据听歌、看视频，一天大约会消耗 10 GB 流量。这样算下来，一个月 200 GB 流量很快就会用完。</p><p>虽然校园网的速度和可用性不如移动数据，但它的流量不限。因此，可以让两种网络各自承担合适的任务，减少移动数据的消耗。</p></section>
<section><h1>解决方案<a href="#解决方案"><span>#</span></a></h1><p>以下设备和应用仅供参考，操作系统以 Ubuntu 为例。</p><section><h2>准备工作<a href="#准备工作"><span>#</span></a></h2><ol>
<li>准备一根数据线，以及一台安卓平板电脑或安卓手机（移动设备 A）。</li>
<li>在 Ubuntu 上安装 scrcpy 远程控制软件。</li>
<li>准备另一台可以开热点的移动设备（移动设备 B）。</li>
</ol></section><section><h2>网络分工<a href="#网络分工"><span>#</span></a></h2><ol>
<li>让移动设备 A 连接五元校园网。</li>
<li>使用 scrcpy 通过 Ubuntu 控制移动设备 A，用它播放音乐、视频或网课。</li>
<li>让 Ubuntu 连接移动设备 B 的热点，用于访问 GitHub、ChatGPT 等网页服务。</li>
</ol><p>这样，消耗流量较多的音乐、视频和网课由校园网承担，Ubuntu 的移动数据主要用于访问需要更好网络体验的服务。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/git-%E5%88%86%E6%94%AF%E4%B8%8E%E6%8F%90%E4%BA%A4%E6%93%8D%E4%BD%9C/</id>
      <title type="text">Git 分支与提交操作：从本地仓库到 GitHub</title>
      <published>2026-10-08T00:00:00.000Z</published>
      <updated>2026-10-08T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/git-%E5%88%86%E6%94%AF%E4%B8%8E%E6%8F%90%E4%BA%A4%E6%93%8D%E4%BD%9C/"/>
      <summary type="text">总结 Git 初始化、提交、创建与切换分支、配置远程仓库以及使用 SSH 推送到 GitHub 的完整流程，并解释常见报错。</summary>
      <content type="html"><![CDATA[<p>Git 的日常操作可以理解成一条链路：先把文件变成一次提交，再从提交创建分支，最后把分支推送到远程仓库。把这条链路理清之后，<code>git branch</code>、<code>git commit</code> 和 <code>git push</code> 就不容易混在一起了。</p>
<p></p><figure><img alt="Git 分支与提交流程图" loading="lazy" width="1600" height="900" src="/_astro/git-branch-commit.CaYLZvFT_28D4Yg.webp" /><figcaption>Git 分支与提交流程图</figcaption></figure><p></p>
<section><h2>一、Git 中的三个位置<a href="#一git-中的三个位置"><span>#</span></a></h2><p>一次修改通常会经过三个位置：</p><ol>
<li><strong>工作区</strong>：正在编辑的文件。</li>
<li><strong>暂存区</strong>：执行 <code>git add</code> 后，准备放入下一次提交的内容。</li>
<li><strong>提交历史</strong>：执行 <code>git commit</code> 后，形成一个可以被分支指向的版本节点。</li>
</ol><p>常用检查命令是：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>status</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>它可以告诉我们哪些文件还没有加入暂存区、哪些文件已经暂存，以及当前处于哪个分支。</p></section>
<section><h2>二、初始化仓库并完成第一次提交<a href="#二初始化仓库并完成第一次提交"><span>#</span></a></h2><p>如果看到：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>已初始化空的 Git 仓库于 /path/to/project/.git/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>说明 <code>.git</code> 目录已经创建，但仓库还没有提交。此时先执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>.</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"Initial commit"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>git add .</code> 会把当前目录下的修改加入暂存区；<code>git commit</code> 才会真正产生第一个提交。</p><p>也可以只提交某个文件夹：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>folder-a/</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"更新 folder-a"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>三、创建和切换分支<a href="#三创建和切换分支"><span>#</span></a></h2><section><h3>创建并立即切换<a href="#创建并立即切换"><span>#</span></a></h3><p>现在 Git 推荐使用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>-c</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>其中 <code>-c</code> 的含义是 create，表示创建新分支并切换过去。</p><p>旧版 Git 的等价写法是：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>checkout</span><span> </span><span>-b</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>只创建，不切换<a href="#只创建不切换"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>branch</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这个命令要求当前仓库至少已经有一个提交。空仓库中没有 <code>master</code> 对应的提交对象，因此会出现：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>fatal: 不是一个有效的对象名：'master'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>解决方法就是先完成第一次提交，再创建分支。</p></section><section><h3>切换到已有分支<a href="#切换到已有分支"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>旧版 Git 可以写成：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>checkout</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看本地分支：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>branch</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>带有 <code>*</code> 的分支就是当前分支。</p></section><section><h3>修改当前分支名称<a href="#修改当前分支名称"><span>#</span></a></h3><p><code>git branch -m</code> 是重命名，不是创建分支：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>branch</span><span> </span><span>-m</span><span> </span><span>新名称</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如，想把当前分支直接改名为目标名称，可以使用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>branch</span><span> </span><span>-M</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>不要写成 <code>git branch -b</code>，因为 <code>git branch</code> 没有 <code>-b</code> 这个选项；创建并切换应使用 <code>git switch -c</code> 或 <code>git checkout -b</code>。</p></section></section>
<section><h2>四、不同文件夹能否推送到不同分支？<a href="#四不同文件夹能否推送到不同分支"><span>#</span></a></h2><p>可以选择性地提交不同文件夹：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>-c</span><span> </span><span>branch-a</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>folder-a/</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"更新 folder-a"</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>main</span></div></div><div><div><div>6</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>-c</span><span> </span><span>branch-b</span></div></div><div><div><div>7</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>folder-b/</span></div></div><div><div><div>8</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"更新 folder-b"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>但要注意，Git 的分支不是“只存一个文件夹”。分支指向的是整个仓库的一组提交，每个提交描述的是整个项目在某一时刻的状态。<code>git add folder-a/</code> 只是让这次提交主要包含 <code>folder-a</code> 的修改。</p><p>如果两个文件夹需要长期完全独立管理，通常更适合拆成两个仓库；如果只是希望同时在不同目录中开发不同分支，可以考虑 <code>git worktree</code>。</p></section>
<section><h2>五、添加远程仓库<a href="#五添加远程仓库"><span>#</span></a></h2><p>第一次添加远程仓库：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>add</span><span> </span><span>origin</span><span> </span><span>https://github.com/33233dp/AHU.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看远程地址：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果出现：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>error: 远程 origin 已经存在。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>说明远程仓库已经配置过了，不需要再次 <code>add</code>。如果地址写错，使用 <code>set-url</code> 修改：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>set-url</span><span> </span><span>origin</span><span> </span><span>https://github.com/33233dp/AHU.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在终端中输入远程地址时要使用原始 URL，不要把 Markdown 链接写法 <code>[文字](URL)</code> 一起复制进去。</p></section>
<section><h2>六、使用 SSH 推送到 GitHub<a href="#六使用-ssh-推送到-github"><span>#</span></a></h2><p>本机有 SSH 密钥，并不代表 HTTPS 远程地址会自动使用 SSH。下面这个地址仍然是 HTTPS：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>https://github.com/33233dp/AHU.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果希望使用 SSH，应把远程地址改成：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>set-url</span><span> </span><span>origin</span><span> </span><span>git@github.com:33233dp/AHU.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>测试 SSH 是否能连接 GitHub：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh</span><span> </span><span>-T</span><span> </span><span>git@github.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果密钥没有加入当前 SSH agent，可以尝试：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh-add</span><span> </span><span>~/.ssh/id_ed25519</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>七、推送本地分支<a href="#七推送本地分支"><span>#</span></a></h2><p>第一次把本地分支推送到远程时，使用 <code>-u</code> 建立跟踪关系：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>-u</span><span> </span><span>origin</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>建立跟踪关系后，后续在该分支中通常可以直接使用：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>push</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>pull</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>完整流程可以压缩成下面几步：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>init</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>.</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"Initial commit"</span></div></div><div><div><div>4</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>-c</span><span> </span><span>Quadruped-robot-investigation</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>add</span><span> </span><span>origin</span><span> </span><span>git@github.com:33233dp/AHU.git</span></div></div><div><div><div>6</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>-u</span><span> </span><span>origin</span><span> </span><span>Quadruped-robot-investigation</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果远程 <code>origin</code> 已经存在，就跳过 <code>git remote add origin ...</code>；如果它仍然是 HTTPS 地址，则先用 <code>git remote set-url</code> 改成 SSH 地址。</p></section>
<section><h2>常见报错速查<a href="#常见报错速查"><span>#</span></a></h2>

<table><thead><tr><th>报错或现象</th><th>原因</th><th>处理方式</th></tr></thead><tbody><tr><td><code>不是一个有效的对象名：'master'</code></td><td>仓库还没有第一次提交</td><td>先执行 <code>git add .</code> 和 <code>git commit</code></td></tr><tr><td><code>未知开关 'b'</code></td><td>把 <code>git branch</code> 和 <code>checkout -b</code> 的写法混用了</td><td>使用 <code>git switch -c 分支名</code></td></tr><tr><td><code>远程 origin 已经存在</code></td><td>远程名称已经配置</td><td>用 <code>git remote -v</code> 查看，必要时用 <code>git remote set-url</code> 修改</td></tr><tr><td>推送时要求输入用户名和密码</td><td>远程地址是 HTTPS</td><td>改用 <code>git@github.com:用户/仓库.git</code> 的 SSH 地址</td></tr></tbody></table><p>记住一句话即可：<strong>先提交，再建分支；先确认远程协议，再推送分支。</strong></p></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/ubuntu-%E6%B5%81%E9%87%8F%E7%9B%91%E6%8E%A7-vnstat/</id>
      <title type="text">Ubuntu 流量监控工具 vnStat：手机热点流量统计与使用教程</title>
      <published>2026-10-08T00:00:00.000Z</published>
      <updated>2026-10-08T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/ubuntu-%E6%B5%81%E9%87%8F%E7%9B%91%E6%8E%A7-vnstat/"/>
      <summary type="text">在 Ubuntu 上安装和使用 vnStat，按小时、天和月份统计手机热点的上传与下载流量。</summary>
      <content type="html"><![CDATA[<section><h1>为什么需要 vnStat<a href="#为什么需要-vnstat"><span>#</span></a></h1><p>如果电脑经常连接手机热点，系统下载更新、浏览器后台标签页、云盘同步和容器服务都可能持续消耗移动流量。只看当前网速很难判断一个月到底用了多少流量，因此需要一个能够长期记录网络接口流量的工具。</p><p><code>vnStat</code> 是 Ubuntu 上一个轻量的命令行流量统计工具。它由后台服务持续读取网络接口的收发字节数，并提供小时、每天、每月和每年的统计结果。它适合用来观察手机热点的总流量，但不负责显示具体是哪一个应用产生了流量。</p></section>
<section><h1>安装 vnStat<a href="#安装-vnstat"><span>#</span></a></h1><p>在 Ubuntu 终端中执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>update</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>vnstat</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装后启动后台服务，并设置为开机自动启动：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>enable</span><span> </span><span>--now</span><span> </span><span>vnstat</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>检查安装和服务状态：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vnstat</span><span> </span><span>--version</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>is-active</span><span> </span><span>vnstat</span></div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>is-enabled</span><span> </span><span>vnstat</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果最后两条命令分别输出 <code>active</code> 和 <code>enabled</code>，说明服务正在运行，并且重启电脑后会自动启动。</p></section>
<section><h1>找到手机热点对应的网络接口<a href="#找到手机热点对应的网络接口"><span>#</span></a></h1><p>vnStat 统计的是网络接口，而不是“手机热点”这个连接名称。因此，使用前需要先确认 Ubuntu 当前访问互联网时使用的接口。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ip</span><span> </span><span>route</span><span> </span><span>get</span><span> </span><span>1.1.1.1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在输出中找到 <code>dev</code> 后面的名称。例如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>1.1.1.1 via 192.168.210.14 dev wlp108s0 src 192.168.210.159</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这里的接口就是 <code>wlp108s0</code>。不同电脑的名称可能不同：</p><ul>
<li>无线网卡通常类似 <code>wlp...</code>；</li>
<li>有线网卡通常类似 <code>enp...</code>；</li>
<li>USB 网络共享可能类似 <code>enx...</code> 或 <code>usb0</code>。</li>
</ul><p>也可以列出 vnStat 已经发现的接口：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vnstat</span><span> </span><span>--iflist</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>手机热点使用 Wi-Fi 连接时，应优先统计实际无线网卡，而不是 <code>docker0</code>、<code>br-...</code>、<code>veth...</code> 等容器虚拟接口。</p></section>
<section><h1>查看流量统计<a href="#查看流量统计"><span>#</span></a></h1><p>下面假设手机热点接口是 <code>wlp108s0</code>。如果你的接口名称不同，请替换命令中的 <code>wlp108s0</code>。</p><section><h2>查看每天的流量<a href="#查看每天的流量"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>wlp108s0</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输出中的 <code>rx</code> 表示接收流量，也就是下载；<code>tx</code> 表示发送流量，也就是上传；<code>total</code> 是两者之和。</p></section><section><h2>查看每月的流量<a href="#查看每月的流量"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>wlp108s0</span><span> </span><span>-m</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这个视图最适合和手机套餐的月度流量进行对照。</p></section><section><h2>查看最近 24 小时的流量<a href="#查看最近-24-小时的流量"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>wlp108s0</span><span> </span><span>-h</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果想定位“今天哪段时间突然消耗了很多流量”，可以先查看这个统计。</p></section><section><h2>查看实时网速<a href="#查看实时网速"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>wlp108s0</span><span> </span><span>-l</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>实时视图会持续显示当前的接收和发送速率。按 <code>Ctrl+C</code> 退出。</p></section><section><h2>查看最近五分钟的统计<a href="#查看最近五分钟的统计"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>wlp108s0</span><span> </span><span>-5</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这个视图适合在下载文件、同步云盘或播放视频时观察流量变化。</p></section></section>
<section><h1>一个适合日常使用的检查流程<a href="#一个适合日常使用的检查流程"><span>#</span></a></h1><p>手机热点开启后，可以按下面的顺序检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 确认当前使用的接口</span></div></div><div><div><div>2</div></div><div><span>ip</span><span> </span><span>route</span><span> </span><span>get</span><span> </span><span>1.1.1.1</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看本月累计流量</span></div></div><div><div><div>5</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>wlp108s0</span><span> </span><span>-m</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 观察当前是否有持续流量</span></div></div><div><div><div>8</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>wlp108s0</span><span> </span><span>-l</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果发现流量增长异常，再使用 <code>-h</code> 或 <code>-5</code> 查看具体时间段。</p></section>
<section><h1>刚安装后看不到数据怎么办<a href="#刚安装后看不到数据怎么办"><span>#</span></a></h1><p>vnStat 不能补回安装之前产生的流量。刚安装完成时，查询结果可能显示 <code>No data</code>，这是正常现象。保持 <code>vnstat</code> 服务运行并产生一些网络活动，等待一段时间后再查询即可。</p><p>如果较长时间后仍然没有数据，可以检查服务日志：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>vnstat</span></div></div><div><div><div>2</div></div><div><span>journalctl</span><span> </span><span>-u</span><span> </span><span>vnstat</span><span> </span><span>--no-pager</span><span> </span><span>-n</span><span> </span><span>50</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>同时确认查询的接口就是当前默认路由使用的接口：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ip</span><span> </span><span>route</span><span> </span><span>get</span><span> </span><span>1.1.1.1</span></div></div><div><div><div>2</div></div><div><span>vnstat</span><span> </span><span>--iflist</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h1>使用时的注意事项<a href="#使用时的注意事项"><span>#</span></a></h1><ol>
<li>手机端的套餐统计是最终依据。电脑端统计的是网络接口收发的字节数，可能因为协议开销、计费规则和统计时间不同而存在少量差异。</li>
<li>如果手机热点同时连接了其他设备，电脑上的 vnStat 只能看到这台电脑的流量，不能代表整个手机热点的总用量。</li>
<li>如果开启了 VPN，<code>tun0</code> 或类似虚拟接口可能显示的是 VPN 内部流量。要估算手机实际消耗的流量，应重点观察承载 VPN 数据的 Wi-Fi 或 USB 物理接口。</li>
<li>vnStat 统计的是接口总流量，不能区分浏览器、下载器或云盘等具体程序。需要按进程排查时，可以另行安装并使用 <code>nethogs</code>。</li>
</ol></section>
<section><h1>总结<a href="#总结"><span>#</span></a></h1><p>对于长期使用手机热点的 Ubuntu 电脑，<code>vnStat</code> 的基本使用方式可以概括为：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>enable</span><span> </span><span>--now</span><span> </span><span>vnstat</span></div></div><div><div><div>2</div></div><div><span>ip</span><span> </span><span>route</span><span> </span><span>get</span><span> </span><span>1.1.1.1</span></div></div><div><div><div>3</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>&lt;热点接口&gt;</span><span> </span><span>-m</span></div></div><div><div><div>4</div></div><div><span>vnstat</span><span> </span><span>-i</span><span> </span><span>&lt;热点接口&gt;</span><span> </span><span>-l</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>先确认正确的热点接口，再使用月度统计控制套餐用量，使用实时视图定位当前的流量变化。这样既能长期记录总流量，也能在发现异常时快速进行检查。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/2026-10-07/</id>
      <title type="text">使用vscode编辑ros2工作空间代码的时候，头文件代码红标问题的解决</title>
      <published>2026-10-07T00:00:00.000Z</published>
      <updated>2026-10-07T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/2026-10-07/"/>
      <summary type="text">如#include &quot;rclcpp/rclcpp.hpp&quot;会出现下画红色波浪线</summary>
      <content type="html"><![CDATA[<ol>
<li>使用指令</li>
</ol>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span> </span></span><span>colcon build --packages-select topic --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=On</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ol>
<li>在build文件夹下找到 <code>compile_commands.json</code> 然后复制到workspace</li>
<li>ctrol + shitf + P 打开<code>C/C++: Edit Configurations (JSON)</code> 添加一行代码</li>
</ol>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span> </span></span><span>"compileCommands": "${workspaceFolder}/build/topic/compile_commands.json",</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ol>
<li>完整Json实例</li>
</ol>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>"configurations": [</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>{</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>"name": "Linux",</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>"compileCommands": "${workspaceFolder}/compile_commands.json",</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>"includePath": [</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>"${workspaceFolder}/**"</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>],</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>"defines": [],</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>"compilerPath": "/usr/bin/gcc",</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>"cStandard": "c17",</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>    </span></span><span>"cppStandard": "gnu++17",</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>"intelliSenseMode": "linux-gcc-x64"</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span><span>  </span></span><span>],</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span><span>  </span></span><span>"version": 4</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
<p>如果做了上面这些还是有红标，那就是vscode打开的不是ros2工作目录，而是对应的上一级目录！</p>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/anime-vault/</id>
      <title type="text">Anime-Vault 使用介绍与配置教程</title>
      <published>2026-10-07T00:00:00.000Z</published>
      <updated>2026-10-07T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/anime-vault/"/>
      <summary type="text">介绍 Anime-Vault 的主要功能，并以 Bilibili 为例说明如何配置番剧播放链接和剧集偏移。</summary>
      <content type="html"><![CDATA[<section><h1>介绍<a href="#介绍"><span>#</span></a></h1><p>Anime-Vault 是一个用于整理和管理番剧播放链接的工具。</p><p><a href="https://github.com/Enactivism/Anime-Vault" target="_blank">项目地址</a></p><section><h2>主要功能<a href="#主要功能"><span>#</span></a></h2><ol>
<li>在首页以海报墙浏览番剧，并按照最近播放活动排序。</li>
<li>为每部番剧保存独立的播放地址。</li>
<li>生成 Animeko 可读取的订阅配置和 Selector 数据源接口。</li>
</ol></section><section><h2>最优搭配<a href="#最优搭配"><span>#</span></a></h2><p><strong>Anime-Vault + alist</strong></p></section></section>
<section><h1>使用教程——基础篇<a href="#使用教程基础篇"><span>#</span></a></h1><p>部署好 Anime-Vault 后，打开项目网页：</p><p></p><figure><img alt="Anime-Vault 首页" loading="lazy" width="1515" height="885" src="/_astro/image.CvMt_jRT_Z9mxPQ.webp" /><figcaption>Anime-Vault 首页</figcaption></figure><p></p><section><h2>新增番剧<a href="#新增番剧"><span>#</span></a></h2><section><h3>基本信息<a href="#基本信息"><span>#</span></a></h3><p>点击“新增番剧”，例如添加“Fate/Zero 第二季”，然后填写番剧的基本信息。</p></section><section><h3>资源<a href="#资源"><span>#</span></a></h3><p>下面以 Bilibili 为例，说明如何配置番剧播放链接。</p><p>打开 Bilibili，搜索“Fate/Zero 第二季”，并播放第一集。</p><p></p><figure><img alt="Bilibili 番剧播放页面" loading="lazy" width="1031" height="947" src="/_astro/image-2.BT2SK2zn_tPPJl.webp" /><figcaption>Bilibili 番剧播放页面</figcaption></figure><p></p><p>点击下一集，观察浏览器地址栏中发生变化的部分。</p><p>可以看到：</p><ul>
<li>第 1 集：<code>https://www.bilibili.com/bangumi/play/ep13863?spm_id_from=333.337.0.0&amp;from_spmid=666.25.episode.0</code></li>
<li>第 2 集：<code>https://www.bilibili.com/bangumi/play/ep13864?spm_id_from=333.337.0.0&amp;from_spmid=666.25.episode.0</code></li>
</ul><p>两条链接中，<code>https://www.bilibili.com/bangumi/play/</code>、<code>ep138</code> 和后面的查询参数保持不变，只有最后的集数编号发生变化：第 1 集为 <code>63</code>，第 2 集为 <code>64</code>。</p><p>回到 Anime-Vault 的番剧编辑页面，在“基本信息”中填写以下内容：</p><ul>
<li>播放链接：填写第 1 集的完整链接，即 <code>https://www.bilibili.com/bangumi/play/ep13863?spm_id_from=333.337.0.0&amp;from_spmid=666.25.episode.0</code>。</li>
<li>根域名：填写 <code>https://www.bilibili.com/</code>。</li>
<li>路由：填写 <code>bangumi/play/</code>。</li>
<li>查询前缀：填写 <code>ep138</code>。</li>
<li>其他：填写链接中剩余的查询参数，即 <code>?spm_id_from=333.337.0.0&amp;from_spmid=666.25.episode.0</code>。</li>
</ul><p>Anime-Vault 会按照下面的规则生成每一集的链接：</p><p><code>根域名 + 路由 + 查询前缀 + &lt;集数&gt; + 其他</code></p><p>因此，最终生成的链接形式为：</p><p><code>https://www.bilibili.com/bangumi/play/ep138&lt;集数&gt;?spm_id_from=333.337.0.0&amp;from_spmid=666.25.episode.0</code></p><p>“查询前缀”中的内容也可以合并到“路由”或“根域名”中，再将“查询前缀”留空。只要各字段组合后能够得到正确的链接即可。</p><p></p><figure><img alt="番剧资源配置" loading="lazy" width="1362" height="860" src="/_astro/image-5.CqN8xQn4_2hUmNd.webp" /><figcaption>番剧资源配置</figcaption></figure><p></p><p>填写完成后，点击“创建番剧”。</p><p></p><figure><img alt="创建番剧" loading="lazy" width="1362" height="860" src="/_astro/image-4.BjMVWvg5_ZNdmJ.webp" /><figcaption>创建番剧</figcaption></figure><p></p><p>点击“编辑地址”上方的链接，可以打开第 1 集的视频页面。</p><p>此时“剧集”列表可能还没有生成内容，这是因为默认的总集数为 0。将总集数修改为 12 后，Anime-Vault 会从 1 到 12 依次生成集数，并将其插入到链接模板中。</p><p>由于第 1 集的链接编号是 <code>ep13863</code>，所以需要将“集数查询偏移”设置为 <code>63</code>。</p><p>另外，Bilibili 中的《Fate/Zero 第二季》从第 14 集开始显示。为了让 Anime-Vault 中的剧集编号与原作一致，需要将“导入集数显示偏移”设置为 <code>13</code>。</p><p>如下是最终配置：</p><p></p><figure><img alt="alt text" loading="lazy" width="1451" height="900" src="/_astro/image-6.cZMfyG7m_3nEU3.webp" /><figcaption>alt text</figcaption></figure><p></p><blockquote><p>以上配置仅以 Bilibili 为例。Anime-Vault 也可以配置其他网站的番剧播放链接。如果在 Bilibili 观看视频受到会员限制，但仍想记录观看进度和番剧管理收藏等，可以将 Anime-Vault 与其他番剧播放网站搭配使用。</p></blockquote></section></section></section>
<section><h1>使用教程——进阶篇<a href="#使用教程进阶篇"><span>#</span></a></h1><p>后续更新……</p></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/frp%E8%B7%91%E4%B8%8D%E6%BB%A1%E5%AE%BD%E5%B8%A6/</id>
      <title type="text">FRP跑不满宽带</title>
      <published>2026-10-07T00:00:00.000Z</published>
      <updated>2026-10-07T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/frp%E8%B7%91%E4%B8%8D%E6%BB%A1%E5%AE%BD%E5%B8%A6/"/>
      <summary type="text">导致速度慢的**唯一真凶**是 `frpc.toml` 中错误地放置了 `bufferSize` 参数，导致 FRP 加载配置失败或回退到默认劣化参数，严重影响了传输效率。移除该无效参数后，配合 `tcpMux = true poolCount = 10` 和 BBR 加速，内网穿透速度瞬间从 1.45 Mbps 飙升到 18.24 Mbps。</summary>
      <content type="html"><![CDATA[<section><h3>第1步：初始测速 – 确认带宽天花板<a href="#第1步初始测速--确认带宽天花板"><span>#</span></a></h3><ul>
<li><strong>操作</strong>：在云服务器上执行 <code>speedtest-cli</code></li>
<li><strong>结果</strong>：<code>Download: 18.90 Mbit/s, Upload: 15.80 Mbit/s</code></li>
<li><strong>结论</strong>：云服务器带宽就是 <strong>20M</strong> 档位，物理下载上限约 <strong>2.36 MB/s</strong>。这是后续所有优化的绝对天花板。</li>
</ul><hr /></section>
<section><h3>第2步：本地宽带测速 – 排除本地上传瓶颈<a href="#第2步本地宽带测速--排除本地上传瓶颈"><span>#</span></a></h3><ul>
<li><strong>操作</strong>：在本地电脑执行 <code>speedtest-cli</code></li>
<li><strong>结果</strong>：<code>Download: 59.44 Mbit/s, Upload: 42.56 Mbit/s, 延迟 322.23 ms</code>（连接到菲律宾测速节点）</li>
<li><strong>结论</strong>：本地上传远高于服务器下载，因此<strong>瓶颈不在本地上行</strong>；但延迟极高（322ms），怀疑本地到服务器线路可能绕路。</li>
</ul><hr /></section>
<section><h3>第3步：澄清服务器位置，排除测速节点误导<a href="#第3步澄清服务器位置排除测速节点误导"><span>#</span></a></h3><ul>
<li><strong>讨论</strong>：指出服务器实际在香港，测速节点在菲律宾，所以延迟 322ms 不代表真实路径。</li>
<li><strong>行动</strong>：建议用 <code>ping</code> 或 <code>tcping</code> 测试真实延迟，但 <code>ping</code> 不通（服务器禁ICMP）。</li>
</ul><hr /></section>
<section><h3>第4步：用 <code>nc</code> 测试真实延迟<a href="#第4步用-nc-测试真实延迟"><span>#</span></a></h3><ul>
<li><strong>操作</strong>：在本地执行 <code>time nc -zv -w2 38.244.14.16 22</code></li>
<li><strong>结果</strong>：<code>real 0m0.175s</code> → <strong>175ms</strong></li>
<li><strong>结论</strong>：大陆到香港并非直连，延迟高达 175ms，属于绕路（大概率经美日）。高延迟会严重影响 TCP 效率，必须启用 BBR。</li>
</ul><hr /></section>
<section><h3>第5步：开启 BBR 加速（服务器端）<a href="#第5步开启-bbr-加速服务器端"><span>#</span></a></h3><ul>
<li><strong>操作</strong>：在云服务器依次执行：
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>"net.core.default_qdisc=fq"</span><span> &gt;&gt; </span><span>/etc/sysctl.conf</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>"net.ipv4.tcp_congestion_control=bbr"</span><span> &gt;&gt; </span><span>/etc/sysctl.conf</span></div></div><div><div><div>3</div></div><div><span>sysctl</span><span> </span><span>-p</span></div></div><div><div><div>4</div></div><div><span>lsmod</span><span> | </span><span>grep</span><span> </span><span>bbr</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li><strong>结果</strong>：<code>tcp_bbr</code> 出现，BBR 已生效。</li>
<li><strong>作用</strong>：提升高延迟下 TCP 吞吐量，后续所有速度改善的基础。</li>
</ul><hr /></section>
<section><h3>第6步：第一次下载测试 – 发现速度极低<a href="#第6步第一次下载测试--发现速度极低"><span>#</span></a></h3><ul>
<li><strong>操作</strong>：本地 <code>wget</code> 下载云服务器 5244 端口的文件（实际是 Alist 挂载的夸克网盘资源）</li>
<li><strong>速度</strong>：仅 <strong>182 KB/s (≈1.45 Mbps)</strong></li>
<li><strong>疑惑</strong>：按理说 BBR 生效后应明显提速，但实际没变化。</li>
</ul><hr /></section>
<section><h3>第7步：识别 Alist 为本地服务，分析环形路径<a href="#第7步识别-alist-为本地服务分析环形路径"><span>#</span></a></h3><ul>
<li><strong>信息澄清</strong>：Alist 运行在<strong>树莓派（本地）</strong>，通过 FRP 穿透到云服务器公网。</li>
<li><strong>数据流向</strong>：本地 wget → 云服务器(FRP服务端) → FRP隧道返回 → 树莓派(Alist) → 夸克网盘 → 原路返回。</li>
<li><strong>结论</strong>：速度受限于“夸克网盘限速”和“FRP隧道效率”双重因素。但用户有夸克会员且直连树莓派能跑满，所以排除夸克限速，<strong>问题锁定在 FRP 隧道</strong>。</li>
</ul><hr /></section>
<section><h3>第8步：黄金诊断 – 用 <code>iperf3</code> 剥离 FRP 裸测<a href="#第8步黄金诊断--用-iperf3-剥离-frp-裸测"><span>#</span></a></h3><ul>
<li><strong>服务器端</strong>：<code>iperf3 -s</code>（云服务器）</li>
<li><strong>客户端（本地）</strong>：<code>iperf3 -c 38.244.14.16 -t 30</code></li>
<li><strong>结果</strong>：带宽 <strong>7.89 Mbits/sec (≈0.99 MB/s)</strong>，峰值 13.1 Mbits/sec</li>
<li><strong>结论</strong>：底层 TCP 能跑 8~13 Mbps，但 FRP 只用了不到 1.5 Mbps，说明 <strong>FRP 配置不当</strong>，而非网络或限速问题。</li>
</ul><hr /></section>
<section><h3>第9步：针对性优化 FRP 配置（树莓派客户端）<a href="#第9步针对性优化-frp-配置树莓派客户端"><span>#</span></a></h3><ul>
<li><strong>推测问题</strong>：树莓派 CPU 弱，加密/压缩耗能；或缓冲区太小，高延迟下效率低。</li>
<li><strong>操作</strong>：在树莓派的 <code>frpc.toml</code> 的 <code>[transport]</code> 中添加：
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>tcpMux</span><span> = </span><span>true</span></div></div><div><div><div>2</div></div><div><span>poolCount</span><span> = </span><span>10</span></div></div><div><div><div>3</div></div><div><span>bufferSize</span><span> = </span><span>2097152</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
同时建议关闭加密压缩（<code>useEncryption = false</code>, <code>useCompression = false</code>，若存在）。</li>
<li><strong>结果</strong>：重启 FRP 服务后，服务启动失败（状态 <code>failed</code>）。</li>
</ul><hr /></section>
<section><h3>第10步：排查配置错误 – 手动运行查看报错<a href="#第10步排查配置错误--手动运行查看报错"><span>#</span></a></h3><ul>
<li><strong>操作</strong>：在树莓派进入 FRP 目录，手动执行 <code>./frpc -c frpc.toml</code></li>
<li><strong>报错</strong>：<code>json: unknown field "bufferSize"</code></li>
<li><strong>原因</strong>：FRP v0.70.1 的 toml 配置中，<code>bufferSize</code> 不是 <code>[transport]</code> 下的有效字段，应放在代理内部（或不支持）。</li>
<li><strong>修正</strong>：移除 <code>bufferSize</code>，只保留 <code>tcpMux</code> 和 <code>poolCount</code>。</li>
<li><strong>最终配置</strong>：<code>[transport]</code> 下保留 <code>tcpMux = true poolCount = 10</code>。</li>
</ul><hr /></section>
<section><h3>第11步：重新启动并测试速度<a href="#第11步重新启动并测试速度"><span>#</span></a></h3><ul>
<li><strong>操作</strong>：修改后手动启动成功，再用 systemctl 启动服务。</li>
<li><strong>再次下载同一个文件</strong>：
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>http://38.244.14.16:5244/...（同上）</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li><strong>结果</strong>：速度 <strong>2.28 MB/s (≈18.24 Mbps)</strong></li>
<li><strong>对比</strong>：达到云服务器带宽上限（18.90 Mbps）的 <strong>96.5%</strong>。</li>
<li><strong>结论</strong>：问题彻底解决，FRP 隧道已跑满。</li>
</ul><hr /></section>
<section><h2>✅ 最终结论<a href="#-最终结论"><span>#</span></a></h2><p>导致速度慢的<strong>唯一真凶</strong>是 <code>frpc.toml</code> 中错误地放置了 <code>bufferSize</code> 参数，导致 FRP 加载配置失败或回退到默认劣化参数，严重影响了传输效率。移除该无效参数后，配合 <code>tcpMux = true poolCount = 10</code> 和 BBR 加速，内网穿透速度瞬间从 1.45 Mbps 飙升到 18.24 Mbps。</p><hr /></section>
<section><h2>🧰 所有生效的关键措施<a href="#-所有生效的关键措施"><span>#</span></a></h2><ol>
<li><strong>云服务器开启 BBR</strong>（提升高延迟 TCP 效率）</li>
<li><strong>FRP 客户端启用 <code>tcpMux = true poolCount = 10</code></strong>（多路复用，提高单连接利用率）</li>
<li><strong>清理无效配置项</strong>（<code>bufferSize</code> 错误放置导致的性能退化）</li>
<li><strong>确认 FRP 服务正常启动</strong>（通过手动启动排查错误）</li>
</ol><hr /></section>
<section><h2>📌 最终验证<a href="#-最终验证"><span>#</span></a></h2><ul>
<li><code>iperf3</code> 裸跑 7.89 Mbps → 穿透实际 18.24 Mbps（超过裸跑是因为 <code>iperf3</code> 测试受 Ctrl+C 中断影响，实际峰值更高，且 FRP 复用后效率提升）</li>
<li>云服务器测速 18.90 Mbps → 穿透速度 18.24 Mbps → <strong>跑满带宽</strong>。</li>
</ul><hr /><p>至此，问题已完美解决。任何单独忽略上述某一步，都可能无法定位到最终的配置错误。</p><p>【注】clash影响网速的问题解决：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>在clash配置文件中开启多路复用</span></div></div><div><div><div>2</div></div><div><span>proxy-groups:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>- name: Proxies</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>type: select</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span># 添加smux 配置</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>smux:</span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>enabled: true</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>protocol: h2mux</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>max-streams: 32</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>proxies:</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>- 🇭🇰 Hong Kong | 01</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>- 🇭🇰 Hong Kong | 02</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>- 🇭🇰 Hong Kong | 03</span></div></div><div><div><div>14</div></div><div><span><span>      </span></span><span>- 🇭🇰 Hong Kong | 04</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
    <entry>
      <id>https://chachaprj.top/posts/linux-service/</id>
      <title type="text">linux自启动服务</title>
      <published>2026-10-07T00:00:00.000Z</published>
      <updated>2026-10-07T00:00:00.000Z</updated>
      <author><name>ChaCha</name></author>
      <link rel="alternate" href="https://chachaprj.top/posts/linux-service/"/>
      <summary type="text">配置 Ubuntu systemd 服务自启动，核心是创建一个 `.service` 文件，并使用 `systemctl` 命令进行管理。</summary>
      <content type="html"><![CDATA[<p>配置 Ubuntu systemd 服务自启动，核心是创建一个 <code>.service</code> 文件，并使用 <code>systemctl</code> 命令进行管理。</p>
<section><h3>🛠️ 操作步骤详解<a href="#️-操作步骤详解"><span>#</span></a></h3><ol>
<li>
<p><strong>创建并编辑服务文件</strong>
首先，为你的服务创建一个 <code>.service</code> 文件，通常放在 <code>/etc/systemd/system/</code> 目录下。你可以用 <code>nano</code> 或 <code>vim</code> 等编辑器创建它：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>nano</span><span> </span><span>/etc/systemd/system/your-service-name.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>请将 <code>your-service-name</code> 替换为你实际的服务名称。</p>
</li>
<li>
<p><strong>编写服务配置</strong>
一个标准的 <code>.service</code> 文件包含三个主要部分，以下是一个基本配置示例：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[Unit]</span></div></div><div><div><div>2</div></div><div><span>Description</span><span><span>=</span><span>My Custom Service         </span></span><span># 服务的描述信息</span></div></div><div><div><div>3</div></div><div><span>After</span><span><span>=</span><span>network.target                 </span></span><span># 指定在网络服务启动后启动</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>[Service]</span></div></div><div><div><div>6</div></div><div><span>Type</span><span><span>=</span><span>simple                          </span></span><span># 服务类型，通常为 simple</span></div></div><div><div><div>7</div></div><div><span>User</span><span><span>=</span><span>your_username                   </span></span><span># (可选) 指定运行服务的用户</span></div></div><div><div><div>8</div></div><div><span>WorkingDirectory</span><span><span>=</span><span>/path/to/your/app   </span></span><span># (可选) 指定工作目录</span></div></div><div><div><div>9</div></div><div><span>ExecStart</span><span><span>=</span><span>/path/to/your/application  </span></span><span># 服务启动时执行的命令，需要绝对路径</span></div></div><div><div><div>10</div></div><div><span>Restart</span><span><span>=</span><span>always                       </span></span><span># (可选) 自动重启策略，例如 always</span></div></div><div><div><div>11</div></div><div><span>RestartSec</span><span><span>=</span><span>3                         </span></span><span># (可选) 重启前等待的秒数</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>[Install]</span></div></div><div><div><div>14</div></div><div><span>WantedBy</span><span><span>=</span><span>multi-user.target           </span></span><span># 指定服务在哪个运行级别下启动</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p><strong>关键参数说明</strong>：</p>
<ul>
<li><strong><code>ExecStart</code></strong>: <strong>必须项</strong>，指定你的程序或脚本的<strong>绝对路径</strong>。</li>
<li><strong><code>User</code></strong>: 建议指定一个非 <code>root</code> 用户来运行服务，以提高安全性。</li>
<li><strong><code>Restart</code></strong>: 常用选项有 <code>always</code>（总是重启）、<code>on-failure</code>（仅在失败时重启）等。</li>
</ul>
</li>
<li>
<p><strong>加载并启用服务</strong>
保存并关闭文件后，依次执行以下命令：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 重新加载 systemd 配置，让系统识别新的服务文件</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2. 启用服务，使其在开机时自动启动</span></div></div><div><div><div>5</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>enable</span><span> </span><span>your-service-name.service</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 3. (可选) 立即启动服务，无需重启系统</span></div></div><div><div><div>8</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>start</span><span> </span><span>your-service-name.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ol></section>
<section><h3>💡 常用管理命令<a href="#-常用管理命令"><span>#</span></a></h3><p>配置完成后，你可以使用以下命令来管理你的服务：</p><ul>
<li><strong>查看服务状态</strong>: <code>sudo systemctl status your-service-name.service</code></li>
<li><strong>停止服务</strong>: <code>sudo systemctl stop your-service-name.service</code></li>
<li><strong>重启服务</strong>: <code>sudo systemctl restart your-service-name.service</code></li>
<li><strong>禁用开机自启</strong>: <code>sudo systemctl disable your-service-name.service</code></li>
<li><strong>检查是否已启用</strong>: <code>sudo systemctl is-enabled your-service-name.service</code></li>
<li><strong>查看已启用服务</strong>: <code>systemctl list-unit-files --state=enabled</code></li>
<li></li>
</ul></section>
<section><h3>🔍 故障排查<a href="#-故障排查"><span>#</span></a></h3><p>如果服务未能按预期启动，可以尝试以下方法排查：</p><ol>
<li><strong>查看详细日志</strong>：使用 <code>journalctl</code> 命令查看服务的详细日志，这是最直接的排查方式。
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>journalctl</span><span> </span><span>-u</span><span> </span><span>your-service-name.service</span><span> </span><span>-xe</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li><strong>检查配置与权限</strong>：
<ul>
<li>确认 <code>.service</code> 文件的路径和语法是否正确。</li>
<li>确保 <code>ExecStart</code> 指定的程序或脚本具有<strong>可执行权限</strong>。</li>
</ul>
</li>
<li><strong>修改后重新加载</strong>：如果你修改了 <code>.service</code> 文件，<strong>必须</strong>再次运行 <code>sudo systemctl daemon-reload</code> 使更改生效。</li>
</ol><p>【注】.sh脚本需要在行首添加</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h3>查看日志<a href="#查看日志"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>journalctl</span><span> </span><span>-u</span><span> </span><span>your-service-name.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
</feed>
