主頁 >  其他 > 卡爾曼濾波器

卡爾曼濾波器

2021-12-09 10:56:34 其他

卡爾曼濾波器

  • 卡爾曼濾波器的前言
  • 卡爾曼濾波器的推導
  • 卡爾曼濾波器的相關基礎知識
  • 卡爾曼濾波器的仿真
  • 卡爾曼濾波器的總結

卡爾曼濾波器的前言

首先,介紹條件概率,
思考這一個問題:在一個學校里面,學生里面的男生占比0.6,女生占比0.4,男生留長發的概率是0.2,男生短發的概率是0.8,女生留長發的概率是0.9,女生短發的概率是0.1,現在你從背影看到一個留長發的人,判斷他(她)是男生還是女生?
P ( s = 男 生 ) = 0.6 P ( s = 女 生 ) = 0.4 P(s=男生)=0.6 \quad P(s=女生)=0.4 P(s=)=0.6P(s=)=0.4

P ( o = 短 發 ∣ s = 男 生 ) = 0.8 P ( o = 長 發 ∣ s = 男 生 ) = 0.2 P ( o = 短 發 ∣ s = 女 生 ) = 0.1 P ( o = 長 發 ∣ s = 女 生 ) = 0.9 P(o=短發|s=男生)=0.8 \quad P(o=長發|s=男生)=0.2 \\ P(o=短發|s=女生)=0.1 \quad P(o=長發|s=女生)=0.9 P(o=s=)=0.8P(o=s=)=0.2P(o=s=)=0.1P(o=s=)=0.9

那么
P ( s = 男 生 ∣ o = 長 發 ) = P ( s = 男 生 , o = 長 發 ) P ( o = 長 發 ) = P ( o = 長 發 ∣ s = 男 生 ) P ( s = 男 生 ) P ( o = 長 發 ∣ s = 男 生 ) P ( s = 男 生 ) + P ( o = 長 發 ∣ s = 女 生 ) P ( s = 女 生 ) = 0.2 × 0.6 0.2 × 0.6 + 0.9 × 0.4 = 0.25 P(s=男生|o=長發)=\frac{P(s=男生,o=長發)}{P(o=長發)}=\frac{P(o=長發|s=男生)P(s=男生)}{P(o=長發|s=男生)P(s=男生)+P(o=長發|s=女生)P(s=女生)}=\frac{0.2×0.6}{0.2×0.6+0.9×0.4}=0.25 P(s=o=)=P(o=)P(s=,o=)?=P(o=s=)P(s=)+P(o=s=)P(s=)P(o=s=)P(s=)?=0.2×0.6+0.9×0.40.2×0.6?=0.25

P ( s = 女 生 ∣ o = 長 發 ) = P ( s = 女 生 , o = 長 發 ) P ( o = 長 發 ) = P ( o = 長 發 ∣ s = 女 生 ) P ( s = 女 生 ) P ( o = 長 發 ∣ s = 男 生 ) P ( s = 男 生 ) + P ( o = 長 發 ∣ s = 女 生 ) P ( s = 女 生 ) = 0.9 × 0.4 0.2 × 0.6 + 0.9 × 0.4 = 0.75 P(s=女生|o=長發)=\frac{P(s=女生,o=長發)}{P(o=長發)}=\frac{P(o=長發|s=女生)P(s=女生)}{P(o=長發|s=男生)P(s=男生)+P(o=長發|s=女生)P(s=女生)}=\frac{0.9×0.4}{0.2×0.6+0.9×0.4}=0.75 P(s=o=)=P(o=)P(s=,o=)?=P(o=s=)P(s=)+P(o=s=)P(s=)P(o=s=)P(s=)?=0.2×0.6+0.9×0.40.9×0.4?=0.75
所以,當看到背影是長發的同學,是女生的概率更大一些,有0.75,所以我們猜測這是個女生,
PS:根據上邊這個例子,直觀點的解釋如下,
假設這個學校有1000個學生,按照上面的概率,那么男生約600人,女生約400人,留長發的女生約360人,留短發的女生約40人,留長發的男生約120人,留短發的男生約480人,當看到一個背影長發的同學,這個同學肯定從長發男生和長發女生這個總體選出來的一個,長發群體總共480人(男生120人,女生360人),那么我們肯定推斷這個選出來的背影是長發的同學肯定是女生的概率更大,

下面對這個例子作一些補充,其中 s s s為隱狀態,意思是我們不能直觀看到, o o o是觀測量,是我們我可以直觀看到的,就像上面的例子一樣,同學的真實性別我們觀測不到,是隱狀態,但是我們可以根據背影看到是否為長發,是否為長發就是觀測量,

下面給出卡爾曼濾波器的兩個式子,
x k = A x k ? 1 + B u k ? 1 + w k ? 1 x_{k}=Ax_{k-1}+Bu_{k-1}+w_{k-1} xk?=Axk?1?+Buk?1?+wk?1?
上式是系統的狀態方程,其中 x k x_{k} xk?是系統在 k k k時刻的系統狀態量, x k : n × 1 x_{k}:n×1 xk?:n×1 x k ? 1 x_{k-1} xk?1?是系統在 k ? 1 k-1 k?1時刻的系統狀態量, x k ? 1 : n × 1 x_{k-1}:n×1 xk?1?:n×1 A A A是系統矩陣, A : n × n A:n×n A:n×n B B B是輸入矩陣(也叫控制矩陣), B : n × r B:n×r B:n×r u k ? 1 u_{k-1} uk?1?是系統在 k ? 1 k-1 k?1時刻的系統輸入, u k ? 1 : r × 1 u_{k-1}:r×1 uk?1?:r×1 w k ? 1 w_{k-1} wk?1?是服從高斯分布的隨機向量,相當于是系統噪聲, w k ? 1 : n × 1 w_{k-1}:n\times 1 wk?1?:n×1 w k ? 1 ~ N p ( 0 , Q ) w_{k-1}\sim N_{p}(0,Q) wk?1?Np?(0,Q) Q Q Q是系統噪聲服從的協方差矩陣, Q : n × n Q:n\times n Q:n×n
y k = H x k + v k y_{k}=Hx_{k}+v_{k} yk?=Hxk?+vk?
上式是系統的觀測方程,其中 x k x_{k} xk?是系統在 k k k時刻的系統狀態量, x k : n × 1 x_{k}:n×1 xk?:n×1 H H H是系統狀態到觀測值(系統中的傳感器資料)的轉換矩陣, H : m × n H:m\times n H:m×n, v k v_{k} vk?是測量噪聲, v k : m × 1 v_{k}:m\times 1 vk?:m×1 v k ~ N p ( 0 , R ) v_{k}\sim N_{p}(0,R) vk?Np?(0,R) R R R是測量噪聲服從的協方差矩陣, R : m × m R:m\times m R:m×m y k y_{k} yk?是系統的觀測值(系統中的傳感器資料),
與上面舉的學校男女生的例子類比,系統的狀態量 x k x_{k} xk?是我們直接觀測不到的,即隱狀態,我們能觀測到的量是傳感器的資料 y k y_{k} yk?,現在我們要推算 k k k時刻系統中的真實狀態值 x k x_{k} xk?,在推測 x k x_{k} xk?的同時,我們已經知道系統過往的測量值 y 1 , y 2 , … , y k y_{1},y_{2},\dots,y_{k} y1?,y2?,,yk?,系統過往的真實狀態值 x 1 , x 2 , … , x k ? 1 x_{1},x_{2},\dots,x_{k-1} x1?,x2?,,xk?1?我們是不知道的,即使我們對 x 1 , x 2 , … , x k ? 1 x_{1},x_{2},\dots,x_{k-1} x1?,x2?,,xk?1?做出了估計,為了更好的展示該程序的邏輯,如下圖所示,
系統狀態及觀測值
如上圖所示,系統的真實狀態隨著時間逐漸變化,在時間步 k k k對應觀測向量 y k y_{k} yk?(可能系統有多個傳感器,所以每一次可以得到一個觀測向量),重點來了!!!現在,需要要做的是,在已知系統過往的觀測值向量 y 1 , y 2 , … , y k ? 1 y_{1},y_{2},\dots,y_{k-1} y1?,y2?,,yk?1?和當前觀測值向量 y k y_{k} yk?的前提下,估計當前狀態 x k x_{k} xk?最可能取到的值,其數學運算式為
x ^ k = argmax P ( x k ∣ y 1 , y 2 , … , y k ) \hat{x}_{k}=\text{argmax}P(x_{k}|y_{1},y_{2},\dots,y_{k}) x^k?=argmaxP(xk?y1?,y2?,,yk?)
這里舉個例子,幫助理解上式,如果 P ( x k ∣ y 1 , y 2 , … , y k ) = 1 2 π σ e ? ( x k ? μ ) 2 2 σ 2 P(x_{k}|y_{1},y_{2},\dots,y_{k})=\frac{1}{\sqrt{2\pi}\sigma}e^{\frac{-(x_{k}-\mu)^{2}}{2\sigma^{2}}} P(xk?y1?,y2?,,yk?)=2π ?σ1?e2σ2?(xk??μ)2?,那么讓我們估計一下 x k x_{k} xk?的值,我們肯定將估計值 x ^ k \hat{x}_{k} x^k? μ \mu μ,因為在 x k = μ x_{k}=\mu xk?=μ發生的概率最大,其實卡爾曼濾波就做了這件事,計算出 k k k時刻的 P ( x k ∣ y 1 , y 2 , … , y k ) P(x_{k}|y_{1},y_{2},\dots,y_{k}) P(xk?y1?,y2?,,yk?),這個式子是多元正態分布(為什么呢?下面我就介紹),先說一下,多元正態分布運算式的一般形式,如下所示,
f ( x ) = 1 ( 2 π ) p ∣ Σ ∣ 1 2 e ? 1 2 ( x ? μ ) T Σ ? 1 ( x ? μ ) f(x)=\frac{1}{(\sqrt{2\pi})^{p}{|\Sigma|^{\frac{1}{2}}}}e^{-\frac{1}{2}(x-\mu)^{T}\Sigma^{-1}(x-\mu)} f(x)=(2π ?)pΣ21?1?e?21?(x?μ)TΣ?1(x?μ)
其中, x x x是隨機向量, x : p × 1 x:p\times 1 x:p×1, Σ \Sigma Σ是隨機向量 x x x的協方差矩陣, Σ : p × p \Sigma :p\times p Σ:p×p μ \mu μ是隨機向量 x x x的均值, μ : p × 1 \mu:p\times 1 μ:p×1 f ( x ) f(x) f(x)也稱為隨機向量 x x x的概率密度函式,也記作 x ~ N p ( μ , Σ ) x\sim N_{p}(\mu,\Sigma) xNp?(μ,Σ)

卡爾曼濾波器的推導

首先,為了便于閱讀,我把系統的狀態方程和觀測方程和系統中狀態轉移圖放在這里,每個量的含義都在上文有解釋,這里不再贅述,
x k = A x k ? 1 + B u k ? 1 + w k ? 1 x_{k}=Ax_{k-1}+Bu_{k-1}+w_{k-1} xk?=Axk?1?+Buk?1?+wk?1?

y k = H x k + v k y_{k}=Hx_{k}+v_{k} yk?=Hxk?+vk?
系統狀態及觀測值
首先,假設我們這個系統是個電阻電容系統,在時間 t = 1 t=1 t=1時,系統剛上電,此時系統中的觀測值為 y 1 y_{1} y1?,在觀測值 y 1 y_{1} y1?發生的前提下,我們假設
P ( x 1 ∣ y 1 ) ~ N n ( μ ^ 1 , Σ ^ 1 ) P(x_{1}|y_{1})\sim N_{n}(\hat{\mu}_{1},\hat{\Sigma}_{1}) P(x1?y1?)Nn?(μ^?1?,Σ^1?)
事實上,這個是我們必須做出的假設,假設中的引數也容易寫,因為系統剛上電, μ ^ 1 \hat{\mu}_{1} μ^?1?直接取作系統的初始狀態值就行了,因為系統中是存在不確定性(噪聲),如果噪聲很小,我們 Σ ^ 1 \hat{\Sigma}_{1} Σ^1?就可以方差取小一些,反之,取大一些,這個算是,我們使用卡爾曼濾波器的一個超引數,是需要我們提前做出假設的,PS:肯定有人會問,如果我們開始這個假設和系統真實情況 P ( x 1 ∣ y 1 ) P(x_{1}|y_{1}) P(x1?y1?)不太符合怎么辦,其實問題不大,后面再迭代程序中,這個初始假設中存在的不合理性,會慢慢榷訓,后面仿真,會對這個初始假設做進一步說明,

然后,在時間 t = 2 t=2 t=2的時候,我們需要計算 P ( x 2 ∣ y 1 , y 2 ) P(x_{2}|y_{1},y_{2}) P(x2?y1?,y2?)

根據數學歸納法,假設 t = k ? 1 t=k-1 t=k?1時, P ( x k ? 1 ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( μ ^ k ? 1 , Σ ^ k ? 1 ) P(x_{k-1}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(\hat{\mu}_{k-1},\hat{\Sigma}_{k-1}) P(xk?1?y1?,y2?,,yk?1?)Nn?(μ^?k?1?,Σ^k?1?),在 t = k t=k t=k時,
P ( x k ∣ y 1 , y 2 , … , y k ) = P ( x k , y k ∣ y 1 , y 2 , … , y k ? 1 ) P ( y k ∣ y 1 , y 2 , … , y k ? 1 ) P(x_{k}|y_{1},y_{2},\dots,y_{k})=\frac{P(x_{k},y_{k}|y_{1},y_{2},\dots,y_{k-1})}{P(y_{k}|y_{1},y_{2},\dots,y_{k-1})} P(xk?y1?,y2?,,yk?)=P(yk?y1?,y2?,,yk?1?)P(xk?,yk?y1?,y2?,,yk?1?)?
因為 P ( x k ? 1 ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( μ ^ k ? 1 , Σ ^ k ? 1 ) P(x_{k-1}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(\hat{\mu}_{k-1},\hat{\Sigma}_{k-1}) P(xk?1?y1?,y2?,,yk?1?)Nn?(μ^?k?1?,Σ^k?1?),且 x k = A x k ? 1 + B u k ? 1 + w k ? 1 x_{k}=Ax_{k-1}+Bu_{k-1}+w_{k-1} xk?=Axk?1?+Buk?1?+wk?1?,則有
P ( x k ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( A μ ^ k ? 1 + B u k ? 1 , A Σ ^ k ? 1 A T + Q ) P(x_{k}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(A\hat{\mu}_{k-1}+Bu_{k-1},A\hat{\Sigma}_{k-1}A^{T}+Q) P(xk?y1?,y2?,,yk?1?)Nn?(Aμ^?k?1?+Buk?1?,AΣ^k?1?AT+Q)

因為 P ( x k ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( A μ ^ k ? 1 + B u k ? 1 , A Σ ^ k ? 1 A T + Q ) P(x_{k}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(A\hat{\mu}_{k-1}+Bu_{k-1},A\hat{\Sigma}_{k-1}A^{T}+Q) P(xk?y1?,y2?,,yk?1?)Nn?(Aμ^?k?1?+Buk?1?,AΣ^k?1?AT+Q),且 y k = H x k + v k y_{k}=Hx_{k}+v_{k} yk?=Hxk?+vk?,則有
P ( y k ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( H ( A μ ^ k ? 1 + B u k ? 1 ) , H ( A Σ ^ k ? 1 A T + Q ) H T + R ) P(y_{k}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(H(A\hat{\mu}_{k-1}+Bu_{k-1}),H(A\hat{\Sigma}_{k-1}A^{T}+Q)H^{T}+R) P(yk?y1?,y2?,,yk?1?)Nn?(H(Aμ^?k?1?+Buk?1?),H(AΣ^k?1?AT+Q)HT+R)
因為 P ( x k ∣ y 1 , y 2 , … , y k ? 1 ) P(x_{k}|y_{1},y_{2},\dots,y_{k-1}) P(xk?y1?,y2?,,yk?1?) P ( y k ∣ y 1 , y 2 , … , y k ? 1 ) P(y_{k}|y_{1},y_{2},\dots,y_{k-1}) P(yk?y1?,y2?,,yk?1?)的分布知道了,可以得到 P ( x k , y k ∣ y 1 , y 2 , … , y k ? 1 ) P(x_{k},y_{k}|y_{1},y_{2},\dots,y_{k-1}) P(xk?,yk?y1?,y2?,,yk?1?)的分布,該分布仍然是多元正態分布,分布為
P ( x k , y k ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n + p ( [ A μ ^ k ? 1 + B u k ? 1 H ( A u ^ k ? 1 + B u k ? 1 ) ] , [ A Σ ^ k ? 1 A T + Q ( A Σ ^ k ? 1 A T + Q ) H T H ( A Σ ^ k ? 1 A T + Q ) T H ( A Σ ^ k ? 1 A T + Q ) H T + R ] ) P(x_{k},y_{k}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n+p}( \left[ \begin{array}{c} A\hat{\mu}_{k-1}+Bu_{k-1}\\ H(A\hat{u}_{k-1}+Bu_{k-1}) \end{array} \right], \left[ \begin{array}{cc} A\hat{\Sigma}_{k-1}A^{T}+Q & (A\hat{\Sigma}_{k-1}A^{T}+Q)H^{T}\\ H(A\hat{\Sigma}_{k-1}A^{T}+Q)^{T} & H(A\hat{\Sigma}_{k-1}A^{T}+Q)H^{T}+R \end{array} \right]) P(xk?,yk?y1?,y2?,,yk?1?)Nn+p?([Aμ^?k?1?+Buk?1?H(Au^k?1?+Buk?1?)?],[AΣ^k?1?AT+QH(AΣ^k?1?AT+Q)T?(AΣ^k?1?AT+Q)HTH(AΣ^k?1?AT+Q)HT+R?])

知道上面 P ( x k , y k ∣ y 1 , y 2 , … , y k ? 1 ) P(x_{k},y_{k}|y_{1},y_{2},\dots,y_{k-1}) P(xk?,yk?y1?,y2?,,yk?1?)這個概率分布函式后,如何求 P ( x k ∣ y 1 , y 2 , … , y k ) P(x_{k}|y_{1},y_{2},\dots,y_{k}) P(xk?y1?,y2?,,yk?),下面給定引理:
( u v ) n + m ~ N n + m ( [ μ u μ v ] , [ Σ u Σ u v Σ v u Σ v ] ) \begin{pmatrix} u\\ v\\ \end{pmatrix}_{n+m}\sim N_{n+m}( \left[ \begin{array}{c} \mu_{u}\\ \mu_{v} \end{array} \right], \left[ \begin{array}{cc} \Sigma_{u} & \Sigma_{uv}\\ \Sigma_{vu} & \Sigma_{v} \end{array} \right]) (uv?)n+m?Nn+m?([μu?μv??],[Σu?Σvu??Σuv?Σv??])
P ( u ∣ v ) ~ N n ( μ u + Σ u v Σ v ? 1 ( v ? μ v ) , Σ u ? Σ u v Σ v ? 1 Σ u v T ) P(u|v)\sim N_{n}(\mu_{u}+\Sigma_{uv}\Sigma^{-1}_{v}(v-\mu_{v}),\Sigma_{u}-\Sigma_{uv}\Sigma^{-1}_{v}\Sigma^{T}_{uv}) P(uv)Nn?(μu?+Σuv?Σv?1?(v?μv?),Σu??Σuv?Σv?1?ΣuvT?)

對于 P ( x k , y k ∣ y 1 , y 2 , … , y k ? 1 ) P(x_{k},y_{k}|y_{1},y_{2},\dots,y_{k-1}) P(xk?,yk?y1?,y2?,,yk?1?),根據以上引理,可以得到
P ( x k ∣ y 1 , y 2 , … , y k ) ~ ( A μ ^ k ? 1 + B u k ? 1 + ( A Σ ^ k ? 1 A T + Q ) H T [ H ( A Σ ^ k ? 1 A T + Q ) H T + R ] ? 1 [ y k ? H ( A μ ^ k ? 1 + B u k ? 1 ) ] , ( A Σ ^ k ? 1 A T + Q ) ? ( A Σ ^ k ? 1 A T + Q ) H T [ H ( A Σ ^ k ? 1 A T + Q ) H T + R ] ? 1 H ( A Σ ^ k ? 1 A T + Q ) T ) P(x_{k}|y_{1},y_{2},\dots,y_{k})\sim(A\hat{\mu}_{k-1}+Bu_{k-1}+(A\hat{\Sigma}_{k-1}A^{T}+Q)H^{T}[H(A\hat{\Sigma}_{k-1}A^{T}+Q)H^{T}+R]^{-1}[y_{k}-H(A\hat{\mu}_{k-1}+Bu_{k-1})],(A\hat{\Sigma}_{k-1}A^{T}+Q)-(A\hat{\Sigma}_{k-1}A^{T}+Q)H^{T}[H(A\hat{\Sigma}_{k-1}A^{T}+Q)H^{T}+R]^{-1}H(A\hat{\Sigma}_{k-1}A^{T}+Q) ^{T}) P(xk?y1?,y2?,,yk?)(Aμ^?k?1?+Buk?1?+(AΣ^k?1?AT+Q)HT[H(AΣ^k?1?AT+Q)HT+R]?1[yk??H(Aμ^?k?1?+Buk?1?)],(AΣ^k?1?AT+Q)?(AΣ^k?1?AT+Q)HT[H(AΣ^k?1?AT+Q)HT+R]?1H(AΣ^k?1?AT+Q)T)

上式看起來有點繁瑣,我們令 x ^ k  ̄ = A μ ^ k ? 1 + B u k ? 1 \hat{x}_{\overline{k}}=A\hat{\mu}_{k-1}+Bu_{k-1} x^k?=Aμ^?k?1?+Buk?1? P k  ̄ = A Σ ^ k ? 1 A T + Q P_{\overline{k}}=A\hat{\Sigma}_{k-1}A^{T}+Q Pk?=AΣ^k?1?AT+Q K k = P k  ̄ H T [ H P k  ̄ H T + R ] ? 1 K_{k}=P_{\overline{k}}H^{T}[HP_{\overline{k}}H^{T}+R]^{-1} Kk?=Pk?HT[HPk?HT+R]?1,則 P ( x k ∣ y 1 , y 2 , … , y k ) P(x_{k}|y_{1},y_{2},\dots,y_{k}) P(xk?y1?,y2?,,yk?)可以被重寫成

P ( x k ∣ y 1 , y 2 , … , y k ) ~ ( x ^ k  ̄ + K k ( y k ? H x ^ k  ̄ ) , P k  ̄ ? K k H P k  ̄ ) P(x_{k}|y_{1},y_{2},\dots,y_{k})\sim(\hat{x}_{\overline{k}}+K_{k}(y_{k}-H\hat{x}_{\overline{k}}),P_{\overline{k}}-K_{k}HP_{\overline{k}}) P(xk?y1?,y2?,,yk?)(x^k?+Kk?(yk??Hx^k?),Pk??Kk?HPk?)

此時,我們知道 P ( x k ∣ y 1 , y 2 , … , y k ) ~ ( x ^ k  ̄ + K k ( y k ? H x ^ k  ̄ ) , P k  ̄ ? K k H P k  ̄ ) P(x_{k}|y_{1},y_{2},\dots,y_{k})\sim(\hat{x}_{\overline{k}}+K_{k}(y_{k}-H\hat{x}_{\overline{k}}),P_{\overline{k}}-K_{k}HP_{\overline{k}}) P(xk?y1?,y2?,,yk?)(x^k?+Kk?(yk??Hx^k?),Pk??Kk?HPk?),為了形式上和 P ( x k ? 1 ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( μ ^ k ? 1 , Σ ^ k ? 1 ) P(x_{k-1}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(\hat{\mu}_{k-1},\hat{\Sigma}_{k-1}) P(xk?1?y1?,y2?,,yk?1?)Nn?(μ^?k?1?,Σ^k?1?)一致,我們記
μ ^ k = x ^ k  ̄ + K k ( y k ? H x ^ k  ̄ ) \hat{\mu}_{k}=\hat{x}_{\overline{k}}+K_{k}(y_{k}-H\hat{x}_{\overline{k}}) μ^?k?=x^k?+Kk?(yk??Hx^k?)

Σ ^ k = P k  ̄ ? K k H P k  ̄ = ( I ? K k H ) P k  ̄ \hat{\Sigma}_{k}=P_{\overline{k}}-K_{k}HP_{\overline{k}}=(I-K_{k}H)P_{\overline{k}} Σ^k?=Pk??Kk?HPk?=(I?Kk?H)Pk?

那么有 P ( x k ∣ y 1 , y 2 , … , y k ) ~ N n ( μ ^ k , Σ ^ k ) P(x_{k}|y_{1},y_{2},\dots,y_{k})\sim N_{n}(\hat{\mu}_{k},\hat{\Sigma}_{k}) P(xk?y1?,y2?,,yk?)Nn?(μ^?k?,Σ^k?),所以在當前時間 t = k t=k t=k時,在發生了測量值 y 1 , y 2 , … , y k y_{1},y_{2},\dots,y_{k} y1?,y2?,,yk?的情況下,系統真實狀態 x k x_{k} xk? μ ^ k \hat{\mu}_{k} μ^?k?的概率最大,我們也說 μ ^ k \hat{\mu}_{k} μ^?k?是系統在 t = k t=k t=k時真實狀態 x k x_{k} xk?的最優估計,

總結一下上面的推導,一共五個式子,首先,我們知道 t = k ? 1 t=k-1 t=k?1時系統的狀態 x k ? 1 x_{k-1} xk?1?符合 P ( x k ? 1 ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( μ ^ k ? 1 , Σ ^ k ? 1 ) P(x_{k-1}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(\hat{\mu}_{k-1},\hat{\Sigma}_{k-1}) P(xk?1?y1?,y2?,,yk?1?)Nn?(μ^?k?1?,Σ^k?1?),即系統在 t = k ? 1 t=k-1 t=k?1時的真實狀態 x k ? 1 x_{k-1} xk?1?的最優估計是 μ ^ k ? 1 \hat{\mu}_{k-1} μ^?k?1?,現在根據 P ( x k ? 1 ∣ y 1 , y 2 , … , y k ? 1 ) ~ N n ( μ ^ k ? 1 , Σ ^ k ? 1 ) P(x_{k-1}|y_{1},y_{2},\dots,y_{k-1})\sim N_{n}(\hat{\mu}_{k-1},\hat{\Sigma}_{k-1}) P(xk?1?y1?,y2?,,yk?1?)Nn?(μ^?k?1?,Σ^k?1?)可以推算出 t = k t=k t=k時系統的狀態 x k x_{k} xk?符合 P ( x k ? 1 ∣ y 1 , y 2 , … , y k ) ~ N n ( μ ^ k , Σ ^ k ) P(x_{k-1}|y_{1},y_{2},\dots,y_{k})\sim N_{n}(\hat{\mu}_{k},\hat{\Sigma}_{k}) P(xk?1?y1?,y2?,,yk?)Nn?(μ^?k?,Σ^k?)
計算公式為
x ^ k  ̄ = A μ ^ k ? 1 + B u k ? 1 \hat{x}_{\overline{k}}=A\hat{\mu}_{k-1}+Bu_{k-1} x^k?=Aμ^?k?1?+Buk?1?

P k  ̄ = A Σ ^ k ? 1 A T + Q P_{\overline{k}}=A\hat{\Sigma}_{k-1}A^{T}+Q Pk?=AΣ^k?1?AT+Q

K k = P k  ̄ H T [ H P k  ̄ H T + R ] ? 1 K_{k}=P_{\overline{k}}H^{T}[HP_{\overline{k}}H^{T}+R]^{-1} Kk?=Pk?HT[HPk?HT+R]?1

μ ^ k = x ^ k  ̄ + K k ( y k ? H x ^ k  ̄ ) \hat{\mu}_{k}=\hat{x}_{\overline{k}}+K_{k}(y_{k}-H\hat{x}_{\overline{k}}) μ^?k?=x^k?+Kk?(yk??Hx^k?)

Σ ^ k = P k  ̄ ? K k H P k  ̄ = ( I ? K k H ) P k  ̄ \hat{\Sigma}_{k}=P_{\overline{k}}-K_{k}HP_{\overline{k}}=(I-K_{k}H)P_{\overline{k}} Σ^k?=Pk??Kk?HPk?=(I?Kk?H)Pk?

談點對卡爾曼濾波器的理解,卡爾曼濾波器的實際做的就是時刻 t = k ? 1 t=k-1 t=k?1,在系統觀測量 y 1 , y 2 , … , y k ? 1 y_{1},y_{2},\dots,y_{k-1} y1?,y2?,,yk?1?已知的情況下,根據系統狀態 x k ? 1 x_{k-1} xk?1?的條件概率密度函式,來計算在 t = k t=k t=k時,且系統觀測量 y 1 , y 2 , … , y k y_{1},y_{2},\dots,y_{k} y1?,y2?,,yk?已知的情況下,系統狀態 x k x_{k} xk?的條件概率密度函式,如下圖所示,系統狀態條件概率密度轉變圖
圖中的系統狀態為 x x x x : 2 × 1 x:2\times 1 x:2×1,即系統狀態有兩個分量 x ( 1 ) x^{(1)} x(1) x ( 2 ) x^{(2)} x(2),系統的條件密度函式由服從 N 2 ( μ ^ k ? 1 , Σ ^ k ? 1 ) N_{2}(\hat{\mu}_{k-1},\hat{\Sigma}_{k-1}) N2?(μ^?k?1?,Σ^k?1?)的多元高斯分布變成了另一個服從 N 2 ( μ ^ k , Σ ^ k ) N_{2}(\hat{\mu}_{k},\hat{\Sigma}_{k}) N2?(μ^?k?,Σ^k?)的多元高斯分布,

卡爾曼濾波器的相關基礎知識

筆者是自動化專業的,關于卡爾曼濾波器中的狀態方程和觀測方程,我就沒多說,默認讀者都是會的,如果大家不是很清楚,推薦閱讀劉豹的《現代控制理論》第一章,

關于卡爾曼濾波器最難的也就是概率推算,這一塊基本上是多元正態分布的知識,僅僅學習過概率論的同學應該看著很費解,推薦閱讀高惠璇的《應用多元統計分析》第二章,從中可以系統的了解多元正態分布的定義和相關性質,本文的推導使用的知識都能從中找到對應的推導和證明,

關于和卡爾曼濾波器的相關知識很接近的知識是HMM(Hidden Markov Model)和粒子濾波,推薦看B站的徐亦達老師的卡爾曼濾波器部分,HMM和粒子濾波部分,講的真的很好(建立在讀者有扎實的數學基礎層面上)
B站徐亦達老師卡爾曼濾波器講解視頻

卡爾曼濾波器的仿真

下面放上MATLAB仿真程式,

%%% kalman filter %%%
% the state space function is as follows
% x_{k} = Ax_{k-1}+Bu_{k-1}+ w_{k-1}
% where Cov(ww^{T}) = Q . Matrix size: A: n×n  B: n×p  
% the measurement function is as follows
% z_{k} = Hx_{k} + v_{k}
% where Cov(vv^{T}) = R . Matrix size: H: m×n

% k=1:   P(x_{1}|y_{1})=N(posterior probability{u_{1}},posterior probability{sigma_{1}})
% k=2:   P(x_{2}|y_{1})=N(prior probability{u_{2}},prior probability{sigma_{2}}) 
%        P(x_{2}|y_{1},y_{2})=N(posterior probability{u_{2}},posterior probability{sigma_{2}})
% k=t:   P(x_{k}|y_{1},y_{2},...,y_{k})=N(prior probability{u_{k}},prior probability{sigma_{k}}) 
%        P(x_{k}|y_{1},y_{2},...,y_{k})=N(posterior probability{u_{k}},posterior probability{sigma_{k}})

A = [0, 0.1, 0; 0, 0.2, 0; 0, 0, 0.3];
B = [0.1; 0.1; 0.1];
H = [1, 0, 0;0, 1, 0;0, 0, 1];
Q = [0.01, 0, 0; 0, 0.01, 0; 0, 0, 0.01]; % 注意這里我仿真設定的協方差矩陣中,噪聲的每一個分量都是不相關的,實際中不同噪聲分量可以相關,
R = [0.09, 0, 0;0, 0.09, 0;0, 0, 0.09]; % 注意這里我仿真設定的協方差矩陣中,噪聲的每一個分量都是不相關的,實際中不同噪聲分量可以相關,

posterior_probability_u=[0;0;0]; % 時間步為1時的初始化狀態期望
posterior_probability_sigma=[0,0,0;0,0,0;0,0,0]; % 初始時刻t=1,初始化狀態協方差矩陣
real_state=zeros(3,1000);
estimate_state=zeros(3,1000);
input_u=ones(1,1000);
measurement_value=zeros(3,1000);
estimate_state(:,1)=posterior_probability_u; 
t=150;
for i = 2:t
    a=normrnd(0,0.1,[3,1]);
    real_state(:,i)=A*real_state(:,i-1)+B*input_u(:,i-1)+a;
    measurement_value(:,i)=H*real_state(:,i)+normrnd(0,0.3,[3,1]);
    prior_probability_u=A*estimate_state(:,i-1)+B*input_u(:,i-1);
    prior_probability_sigma=A*posterior_probability_sigma*A'+Q;
    kalman_gain=prior_probability_sigma*H'/(H*prior_probability_sigma*H'+R);
    estimate_state(:,i)=prior_probability_u+kalman_gain*(measurement_value(:,i)-H*prior_probability_u);
    posterior_probability_sigma=(eye(3,3)-kalman_gain*H)*prior_probability_sigma;
end
figure(1);
plot(real_state(1,1:t),'r');
hold on;
plot(measurement_value(1,1:t),'y');
hold on;
plot(estimate_state(1,1:t),'b');
legend('real state','mesurement value','estimate state');

figure(2);
plot(real_state(2,1:t),'r');
hold on;
plot(measurement_value(2,1:t),'y');
hold on;
plot(estimate_state(2,1:t),'b');
legend('real state','mesurement value','estimate state');

上面程式中的 t = 1 t=1 t=1時, P ( x 1 ∣ y 1 ) ~ N 3 ( μ ^ 1 , Σ ^ 1 ) P(x_{1}|y_{1})\sim N_{3}(\hat{\mu}_{1},\hat{\Sigma}_{1}) P(x1?y1?)N3?(μ^?1?,Σ^1?)中的 μ ^ 1 \hat{\mu}_{1} μ^?1?對應的是posterior_probability_u Σ ^ 1 \hat{\Sigma}_{1} Σ^1?對應的是posterior_probability_sigma,這是我們事前根據自己對系統的了解設定的,在上述程式中的系統的真實初始值 x 1 = [ 0 ; 0 ; 0 ] x_{1}=[0;0;0] x1?=[0;0;0],當我們把posterior_probability_u初始化為 [ 0 ; 0 ; 0 ] [0;0;0] [0;0;0]時,對于系統狀態的第一個分量 x ( 1 ) x^{(1)} x(1)仿真結果如下圖,
初值設定與系統真實值吻合時的仿真圖
上圖中的紅線是系統的真實狀態值(因為我是在仿真,我計算出來了系統真實值,在實際工程中,我們是不知道系統狀態的真實值的),黃線是系統中的測量值(可以認為是傳感器傳回來的資料),藍線是卡爾曼濾波器估計出來的系統狀態最優值,
這個仿真是我根據實際情況可能出現的情況給出的仿真,在使用陀螺儀加速度計這類傳感器時,傳感器測量噪聲比較大,所以黃線波動幅度很大,紅線按道理波動可以再小一點,這里我把系統狀態方程中的噪聲設定的有點大,在不少的控制系統中,由于反饋的作用,系統中的噪聲會相對小一些,所以從圖中可以看出來,估計出來的狀態最優值波動還是較小的,和系統真實狀態值比較貼近,傳感器的噪聲被很大程度抑制了,如果只使用傳感器的讀數作為系統狀態值,那么可以看到兩者差距還是很大的,
如果傳感器噪聲很小,我們完全可以不用卡爾曼濾波器,因為測量值基本就是系統真實狀態值了,這很容易理解,為了驗證一下,我把程式中的 R R R的改為R = [0.0001, 0, 0;0, 0.0001, 0;0, 0, 0.0001],仿真結果如下,紅線和黃線基本重合,反而卡爾曼濾波器估計出來的最優值不如測量值靠譜,傳感器測量噪聲很小時的仿真圖
再回到系統初始設定的問題,在 t = 1 t=1 t=1時,系統初始 P ( x 1 ∣ y 1 ) ~ N 3 ( μ ^ 1 , Σ ^ 1 ) P(x_{1}|y_{1})\sim N_{3}(\hat{\mu}_{1},\hat{\Sigma}_{1}) P(x1?y1?)N3?(μ^?1?,Σ^1?)中的 μ ^ 1 \hat{\mu}_{1} μ^?1?對應的是posterior_probability_u,在上述程式中的系統的真實初始值 x 1 = [ 0 ; 0 ; 0 ] x_{1}=[0;0;0] x1?=[0;0;0],當我們把posterior_probability_u初始化為 [ 1 ; 1 ; 1 ] [1;1;1] [1;1;1]時,這個設定和系統真實情況出入很大,對于系統狀態的第一個分量 x ( 1 ) x^{(1)} x(1)仿真結果如下圖,
初值設定與系統真實值差異較大時的仿真圖
可以看出來即使初始假設和系統真實情況出入比較大,關于系統狀態的最優估計還是很快回歸到系統真實狀態值附近,這是因為有測量值幫助修正最優估計,所以允許在初始假設時,出現與系統真實狀態分布的偏差,

卡爾曼濾波器的總結

卡爾曼濾波器利用了兩條線,第一條線是系統的狀態方程,狀態方程保證了系統狀態變數的一個基本物理變換程序,即使有系統噪聲的存在,也可以根據系統的時刻 t = k ? 1 t=k-1 t=k?1的狀態值得到 t = k t=k t=k時,系統狀態值大概值(概率分布),第二條線是我們有系統的傳感器傳回來的測量值(大多時候傳感器的測量噪聲比較大),根據這兩條線,來計算系統最可能的狀態值(即最優估計 μ ^ k \hat{\mu}_{k} μ^?k?),

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/377283.html

標籤:AI

上一篇:python小專案人臉識別(一點小小的了解)

下一篇:OpenCV-單峰三角閾值法Thresh_Unimodal

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more