2023-01-06

Kalmanフィルタで重量データのノイズを取り除く

k-tkr

こんにちは、R&Dエンジニアの@k-tkrです。 在庫管理に使われている弊社のスマートマットは自動で定期的に在庫の重量をクラウドに送信することでリアルタイムに在庫把握ができるようになります。ただ、スマートマットから送られてくる重量データには、計測時の環境によって微小なノイズが混じり込む可能性があります。典型的なものが振動で、仮に計測時にスマートマットの上の在庫が揺れていたり、スマートマットを設置しているもの自体が振動の影響を受けたりしているとスマートマットから送られてくる重量にノイズが混じる可能性が高くなります。このノイズを除去するために確率フィルタリングの手法が使えないかと考え実験してみました。

スマートマットの重量計算

スマートマットの中にはロードセルと呼ばれるセンサが入っています。ロードセルには圧力が掛かると抵抗値が変化する性質があります。この仕組みを利用して、ロードセルに繋がっているマイコンの端子にかかる電圧を測定し、安定化させた後に数値変換することで最終的な重量が計算されます。

Kalmanフィルタとは

今回は確率フィルタリングの中でも最も基本的なものの一つであるKalmanフィルタを使いました。Kalmanフィルタは元々動的システム制御における理論として誕生し、ノイズの混じった観測過程からノイズを除去し、元のシステムの理論的な状態を得るための方法です。NASAのロケット事業で使われていたことでも有名です。 Kalmanフィルタでは、「真の」状態を表す確率過程と観測(測定)される確率過程を導入します。ここで、「真の」状態は決して観測できず観測できるのはノイズを含んだ状態の過程だけなのですが、ノイズを含んだ値から真の値を推定していきます。 ここでは、スマートマットから送られてくる重量の時系列データをノイズの混じった観測過程と考え、そこからノイズを除去し真の重量を推定することを目標とします。

スマートマットから送られてくる重量のモデル化

時刻 t における真の重量を X(t) とします。また、スマートマットから送られてくる重量を W(t) とします。 W(t) は真の重量に何らかのノイズ e(t) が載った状態と考え、W(t) = X(t) + e(t) とモデル化します。ここで、ノイズは平均 0 、標準偏差 s の独立な正規分布に従っていると仮定します。 X(t) は真の重量が従う確率過程であり、真の重量は在庫が消費・補充されない限りは増えたり減ったりしないので、 dX(t) = n(t) + dJ(t) 、ただし n(t) は所謂ホワイトノイズ過程でかつ分散がものすごく小さい、 J(t) は予測可能なジャンプ過程、というようにモデル化したいのですが、今回は簡単のために一旦消費や補充が全くない定常状態の期間を考え、 dX(t) = n(t) とします。 実際の重量増減とノイズの区別をする、というのは面白く難しいテーマなのですが、今回はそれについては扱わず、あくまで定常状態の在庫にノイズが載った重量情報がスマートマットから送られてくる、という状況を考えてみます。

Kalmanフィルタの逐次計算

簡単のためここでは離散的な過程 t = 0, 1, 2, ... を考えます。 マットからの重量が得られた時の真の重量の推定値を Y(t) とします。 Y(t) は、時刻 t までにマット送信された重量が得られた下での条件付き期待値 Y(t) = E[X(t) | W(s); s <= t] です。また、推定誤差分散を P(t) = Var(X(t) | W(s); s <= t) とします。 また、時刻 t までのマットからの重量が得られた状態での、時刻 t+1 における真の重量の推定値と推定誤差分散を Z(t+1) = E[X(t+1) | W(s); s <= t], Q(t+1) = Var(X(t+1) | W(s); s <= t) としておきます。 初期状態として、 Y(0) = W(0), P(0) = (重量を何回か連続で測ったときの分散) とします。 ここで、 v(t) = W(t) - Y(t), F(t) = Q(t) + e(t)^2, K(t) = Q(t) / F(t) とすると、 Y(t) = Z(t) + K(t)v(t) P(t) = Q(t)(1 - K(t)) Z(t+1) = Y(t) Q(t+1) = P(t) + (n(t)の分散) が成り立つことが分かるので、初期状態から重量データが送られてくるにしたがって {Y(0), P(0)} -> {Z(1), Q(1)} -> {Y(1), P(1)} -> {Z(2), Q(2)} -> ... というように逐次的に変数を更新するアルゴリズムが出来上がりました。

このあたりの詳しい計算は、離散モデルであれば 野村俊一(2016). カルマンフィルタ 共立出版 連続モデルであれば ヴェァーント・エクセンダール / 谷口説男 訳(1999). 確率微分方程式 入門から応用まで シュプリンガー・フェアラーク東京 あたりに書かれています。

実際にやってみた

上で書いたように、スマートマットにはロードセルから送られてくる値を重量に変換する過程でノイズを減少させるような仕組みが入っています。ただ今回はノイズの大きいデータが欲しかったため、敢えて重量に変換される前の不安定に見えるデータを使いました。 スマートマットの上に2Lのペットボトル2本を置き、1秒間隔でロードセルから送られてくるデータ(を少し加工したもの)を10,000個程度取得しました。 ノイズと真の過程の分散を与えなければならないのですが、ノイズに関しては過去のデータから計算した母分散を使い、真の過程の分散は小さい値であれば良いので今回は0.01で決め打ちしています。  ADC_Filtered

グラフの青い線が元データ、オレンジの線がKalmanフィルタを適用した値になります。スマートマットの秤を剥き出しにした横でキーボードを叩いていたので振動により元データはかなり変動しています(と言っても実際の重量に直すと数グラム程度)がフィルターを掛けたオレンジの線は安定しているのが見て分かります。

今後に向けて

今回はまだToy Modelでの実験という段階でしたが、今後は実際の消費・補充とノイズを分離させたりノイズを分離した後の重量の動きを見たりすることでより正確な在庫把握に繋げられればと考えています。

最新の記事