<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ロボ &gt; メカトロニクス on M1KE BL0G</title><link>https://www.m1ke.org/categories/robo_mechatronics/</link><description>Recent content in ロボ &gt; メカトロニクス on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><atom:link href="https://www.m1ke.org/categories/robo_mechatronics/index.xml" rel="self" type="application/rss+xml"/><item><title>EKFとUKFによるホイールオドメトリとIMUのセンサーフュージョン</title><link>https://www.m1ke.org/p/ekf%E3%81%A8ukf%E3%81%AB%E3%82%88%E3%82%8B%E3%83%9B%E3%82%A4%E3%83%BC%E3%83%AB%E3%82%AA%E3%83%89%E3%83%A1%E3%83%88%E3%83%AA%E3%81%A8imu%E3%81%AE%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%95%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3/</link><pubDate>Tue, 13 Oct 2026 15:30:00 +0900</pubDate><guid>https://www.m1ke.org/p/ekf%E3%81%A8ukf%E3%81%AB%E3%82%88%E3%82%8B%E3%83%9B%E3%82%A4%E3%83%BC%E3%83%AB%E3%82%AA%E3%83%89%E3%83%A1%E3%83%88%E3%83%AA%E3%81%A8imu%E3%81%AE%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%95%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3/</guid><description>&lt;img src="https://www.m1ke.org/p/ekf%E3%81%A8ukf%E3%81%AB%E3%82%88%E3%82%8B%E3%83%9B%E3%82%A4%E3%83%BC%E3%83%AB%E3%82%AA%E3%83%89%E3%83%A1%E3%83%88%E3%83%AA%E3%81%A8imu%E3%81%AE%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%95%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3/sensor-fusion.jpg" alt="Featured image of post EKFとUKFによるホイールオドメトリとIMUのセンサーフュージョン" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.m1ke.org/p/%E5%B7%AE%E5%8B%95%E4%BA%8C%E8%BC%AA%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E9%A7%86%E5%8B%95%E7%B3%BB%E3%81%A8amclslamnav2/" &gt;差動二輪ロボットの駆動系とAMCL・SLAM・Nav2&lt;/a&gt;で、ホイールオドメトリはホイールの回転量だけから積分した値のため、スリップやエンコーダのノイズでドリフトしていく、という前提を扱った&lt;/li&gt;
&lt;li&gt;このドリフトを、LiDARと地図の照合（AMCL・SLAM）とは別のレイヤーで、IMU（慣性計測装置）と組み合わせることで補う手法として、EKF（Extended Kalman Filter）・UKF（Unscented Kalman Filter）によるセンサーフュージョンがある。今回はその仕組みを整理する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="センサーフュージョンとは"&gt;センサーフュージョンとは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;センサーフュージョンとは、複数の異なるセンサーから得られる情報を組み合わせることで、単一のセンサーだけでは得られない、より正確で頑健な推定を得る技術&lt;/li&gt;
&lt;li&gt;組み合わせ方は、大きく以下の3種類に分類されることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;種類&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;相補的（Complementary）融合&lt;/td&gt;
&lt;td&gt;異なる種類の情報を持つセンサー同士を組み合わせ、互いの弱点を補い合う&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;競合的（Competitive）融合&lt;/td&gt;
&lt;td&gt;同じ対象を測る複数のセンサーを組み合わせ、冗長性や精度の向上を図る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;協調的（Cooperative）融合&lt;/td&gt;
&lt;td&gt;単体のセンサーでは得られない新しい情報を、複数センサーの組み合わせから導き出す（例: ステレオカメラによる距離推定）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;今回扱うホイールオドメトリとIMUの組み合わせは、「並進方向の推定には強いがスリップに弱いセンサー」と「短時間の姿勢変化には強いが長期的にドリフトするセンサー」という、異なる誤差特性を補い合う相補的融合にあたる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜセンサーフュージョンが必要か"&gt;なぜセンサーフュージョンが必要か&lt;/h2&gt;
&lt;h3 id="ホイールオドメトリの弱点"&gt;ホイールオドメトリの弱点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ホイールオドメトリは、ホイールの回転量（エンコーダ値）から並進・回転を積分して求める&lt;/li&gt;
&lt;li&gt;ホイールのスリップ（空転・横滑り）が起きると、実際には動いていない・向きが変わっていないのに、エンコーダ上は回転したことになってしまい、推定位置が大きくズレる&lt;/li&gt;
&lt;li&gt;ホイールオドメトリ単体では、このスリップが起きたこと自体を検出できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="imuの特性と弱点"&gt;IMUの特性と弱点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IMUは、角速度を測るジャイロスコープと、加速度（＋重力）を測る加速度計を組み合わせたセンサー&lt;/li&gt;
&lt;li&gt;ジャイロスコープは、短時間の角速度の変化には敏感で、ホイールの回転とは独立に姿勢の変化を検出できる。ただし、角速度を積分して姿勢を求めるため、センサー自体のバイアス誤差が蓄積し、長時間では姿勢（特にヨー角）がドリフトする&lt;/li&gt;
&lt;li&gt;加速度計は、重力方向を基準にしたロール・ピッチの推定には使えるが、ヨー角の基準にはならない。また、加速度を2回積分して位置を求めようとすると、ノイズが急激に拡大するため、位置推定にはほとんど使えない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="組み合わせる意義"&gt;組み合わせる意義&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ホイールオドメトリは並進方向の推定に強いがスリップに弱く、IMUは短時間の姿勢変化の検出に強いが長時間では姿勢がドリフトする、という互いに異なる誤差特性を持つ&lt;/li&gt;
&lt;li&gt;この2つを組み合わせることで、例えば「ホイールオドメトリ上は直進しているはずなのに、IMUのジャイロが大きな角速度を検出している」というような食い違いから、スリップの発生を間接的に検出し、推定値を補正できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="カルマンフィルタの基本"&gt;カルマンフィルタの基本&lt;/h2&gt;
&lt;h3 id="状態空間モデルと予測更新の2ステップ"&gt;状態空間モデルと予測・更新の2ステップ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;カルマンフィルタは、ロボットの位置・速度などの状態を、予測ステップと更新ステップの繰り返しで推定する手法&lt;/li&gt;
&lt;li&gt;予測ステップでは、前回の状態推定値と、運動モデル（今回であれば、速度・角速度からどれだけ移動するかという式）を使って、次の時刻の状態を予測する&lt;/li&gt;
&lt;li&gt;更新ステップでは、実際のセンサー観測値と、予測値から期待される観測値との差（残差）を使って、予測値を補正する&lt;/li&gt;
&lt;li&gt;線形カルマンフィルタは、運動モデル・観測モデルがどちらも線形である場合に最適な推定を与えるが、ロボットの姿勢（回転）を含む運動モデルは、三角関数を含む非線形な式になるため、そのままでは適用できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="具体例-1次元のカルマンフィルタ"&gt;具体例: 1次元のカルマンフィルタ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;直感をつかむために、簡単な1次元の例で予測・更新を計算してみる&lt;/li&gt;
&lt;li&gt;ロボットが毎秒$v=1.0$m/sで直進していると仮定し、現在の位置推定を$x=0$、その不確かさ（分散）を$P=1.0$とする。プロセスノイズ（運動モデルの不確かさ）を$Q=0.1$とする&lt;/li&gt;
&lt;li&gt;予測ステップでは、以下のように位置と不確かさを更新する&lt;/li&gt;
&lt;/ul&gt;
$$
x_{\text{pred}} = x + v \Delta t = 0 + 1.0 \times 1 = 1.0, \quad P_{\text{pred}} = P + Q = 1.0 + 0.1 = 1.1
$$&lt;ul&gt;
&lt;li&gt;ここに、ノイズを含むセンサー（測定誤差の分散$R=0.5$）が、位置$z=1.2$という観測値を返したとする&lt;/li&gt;
&lt;li&gt;更新ステップでは、まずカルマンゲイン$K$を計算する&lt;/li&gt;
&lt;/ul&gt;
$$
K = \frac{P_{\text{pred}}}{P_{\text{pred}} + R} = \frac{1.1}{1.1 + 0.5} \approx 0.69
$$&lt;ul&gt;
&lt;li&gt;この$K$を使って、予測値と観測値を重み付けして合成し、新しい推定値と不確かさを求める&lt;/li&gt;
&lt;/ul&gt;
$$
x = x_{\text{pred}} + K (z - x_{\text{pred}}) = 1.0 + 0.69 \times (1.2 - 1.0) \approx 1.14, \quad P = (1 - K) P_{\text{pred}} = (1 - 0.69) \times 1.1 \approx 0.34
$$&lt;ul&gt;
&lt;li&gt;カルマンゲイン$K$は、予測の不確かさ$P_{\text{pred}}$とセンサーの不確かさ$R$の相対的な大きさで決まる。センサーの方が信頼できる（$R$が小さい）ほど$K$は1に近づき、観測値を重視した更新になる。逆に予測の方が信頼できる（$P_{\text{pred}}$が小さい）ほど$K$は0に近づき、予測値をそのまま維持する&lt;/li&gt;
&lt;li&gt;更新後の不確かさ$P$は、更新前の$P_{\text{pred}}$より必ず小さくなる。新しい観測値を取り込むことで、推定の不確かさが必ず減ることを意味する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="非線形系への対応-ekfとukf"&gt;非線形系への対応: EKFとUKF&lt;/h2&gt;
&lt;h3 id="ekf-ヤコビアンによる線形化"&gt;EKF: ヤコビアンによる線形化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EKF（Extended Kalman Filter）は、非線形な運動モデル・観測モデルを、現在の推定値のまわりでヤコビアン（偏微分からなる行列）を使って1次近似（線形化）し、その線形化されたモデルに通常のカルマンフィルタの式を適用する手法&lt;/li&gt;
&lt;li&gt;予測ステップでは、非線形な運動モデル$f$で状態を予測しつつ、共分散（推定の不確かさ）の伝播には、$f$のヤコビアン$F$を使う&lt;/li&gt;
&lt;li&gt;更新ステップでは、観測値と予測観測値の残差を、観測モデルのヤコビアン$H$とカルマンゲインで重み付けして、状態を補正する&lt;/li&gt;
&lt;li&gt;非線形性が強い場面では、1次近似による誤差が無視できなくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ukf-シグマポイントによるunscented変換"&gt;UKF: シグマポイントによるUnscented変換&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;UKF（Unscented Kalman Filter）は、ヤコビアンによる線形化を行わず、Unscented変換と呼ばれる手法で非線形性を扱う&lt;/li&gt;
&lt;li&gt;現在の推定値の平均・共分散から、シグマポイントと呼ばれる複数の代表点（状態の次元を$n$とすると、$2n+1$個）を決定論的に選び出す&lt;/li&gt;
&lt;li&gt;各シグマポイントを、非線形な運動モデル・観測モデルにそのまま（線形化せず）通し、変換後の点群の平均・共分散を計算することで、変換後の分布を近似する&lt;/li&gt;
&lt;li&gt;ヤコビアンの導出・計算が不要になり、微分可能でない関数にも適用できる。非線形性が強い系でも、EKFより正確な推定が得られる傾向がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ekfとukfの比較"&gt;EKFとUKFの比較&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;EKF&lt;/th&gt;
&lt;th&gt;UKF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;非線形性への対応&lt;/td&gt;
&lt;td&gt;現在の推定値まわりでヤコビアンを計算し、1次近似（線形化）する&lt;/td&gt;
&lt;td&gt;シグマ点を使い、非線形関数をそのまま適用するUnscented変換を使う&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;必要な計算&lt;/td&gt;
&lt;td&gt;ヤコビアン（偏微分）の導出・計算が必要&lt;/td&gt;
&lt;td&gt;ヤコビアンは不要。微分可能でない関数にも適用できる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;精度&lt;/td&gt;
&lt;td&gt;強い非線形性があると近似誤差が大きくなる&lt;/td&gt;
&lt;td&gt;非線形性が強い系でも、より正確な平均・共分散を推定できる傾向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;計算コスト&lt;/td&gt;
&lt;td&gt;比較的軽い&lt;/td&gt;
&lt;td&gt;シグマ点（$2n+1$個）分の伝播が必要で、やや重い&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="ros2での実装-robot_localizationパッケージ"&gt;ROS2での実装: robot_localizationパッケージ&lt;/h2&gt;
&lt;h3 id="15次元の状態ベクトル"&gt;15次元の状態ベクトル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ROS2では、EKF・UKFによる複数センサーのフュージョンを行うパッケージとして、&lt;code&gt;robot_localization&lt;/code&gt;がよく使われる&lt;/li&gt;
&lt;li&gt;実際にソースを確認したところ、状態ベクトルは15次元で、以下のように定義されている&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;インデックス&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0〜2&lt;/td&gt;
&lt;td&gt;位置（$x, y, z$）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3〜5&lt;/td&gt;
&lt;td&gt;姿勢（roll, pitch, yaw）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6〜8&lt;/td&gt;
&lt;td&gt;並進速度（$v_x, v_y, v_z$）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9〜11&lt;/td&gt;
&lt;td&gt;角速度（roll, pitch, yawそれぞれの速度）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12〜14&lt;/td&gt;
&lt;td&gt;並進加速度（$a_x, a_y, a_z$）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ekf_node&lt;/code&gt;・&lt;code&gt;ukf_node&lt;/code&gt;は、この15次元の状態に対し、ホイールオドメトリ・IMU・GPSなど、複数のセンサーソースのうちどの成分（位置・速度・加速度など）をどのセンサーから取り込むかを、設定ファイルで細かく指定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dual-ekfパターン-odom-base_linkとmap-odomを分ける"&gt;dual EKFパターン: odom-&amp;gt;base_linkとmap-&amp;gt;odomを分ける&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;robot_localization&lt;/code&gt;は、&lt;code&gt;world_frame&lt;/code&gt;というパラメータを持ち、&lt;code&gt;odom&lt;/code&gt;または&lt;code&gt;map&lt;/code&gt;を指定できる&lt;/li&gt;
&lt;li&gt;代表的な使い方として、2つのEKF（またはUKF）ノードのインスタンスを同時に動かす、いわゆるdual EKFパターンがよく使われる
&lt;ul&gt;
&lt;li&gt;1つ目: &lt;code&gt;world_frame&lt;/code&gt;を&lt;code&gt;odom&lt;/code&gt;にし、ホイールオドメトリ・IMUのような、連続的でドリフトはするが滑らかなセンサーだけを融合し、&lt;code&gt;odom&lt;/code&gt;-&amp;gt;&lt;code&gt;base_link&lt;/code&gt;を配信する&lt;/li&gt;
&lt;li&gt;2つ目: &lt;code&gt;world_frame&lt;/code&gt;を&lt;code&gt;map&lt;/code&gt;にし、GPSのような、絶対的だが不連続な位置情報も追加で融合し、&lt;code&gt;map&lt;/code&gt;-&amp;gt;&lt;code&gt;odom&lt;/code&gt;を配信する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;この構成は、&lt;a class="link" href="https://www.m1ke.org/p/%E5%B7%AE%E5%8B%95%E4%BA%8C%E8%BC%AA%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E9%A7%86%E5%8B%95%E7%B3%BB%E3%81%A8amclslamnav2/" &gt;差動二輪ロボットの駆動系とAMCL・SLAM・Nav2&lt;/a&gt;で扱ったAMCL・SLAMの役割分担（&lt;code&gt;odom&lt;/code&gt;-&amp;gt;&lt;code&gt;base_link&lt;/code&gt;は駆動系側、&lt;code&gt;map&lt;/code&gt;-&amp;gt;&lt;code&gt;odom&lt;/code&gt;は自己位置推定側）と同じ構造を持っており、AMCL・SLAMの代わりに（あるいは併用して）&lt;code&gt;robot_localization&lt;/code&gt;が&lt;code&gt;map&lt;/code&gt;-&amp;gt;&lt;code&gt;odom&lt;/code&gt;を担うこともできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ホイールオドメトリはスリップに弱く、IMUは短時間の姿勢変化には強いが長時間ではドリフトするという、互いに異なる誤差特性を持つため、組み合わせることで単独より頑健な推定ができる&lt;/li&gt;
&lt;li&gt;カルマンフィルタは予測・更新の2ステップで状態を推定するが、回転を含むロボットの運動モデルは非線形なため、線形カルマンフィルタをそのまま適用できない&lt;/li&gt;
&lt;li&gt;EKFはヤコビアンによる1次近似で非線形性を扱い、UKFはシグマポイントによるUnscented変換で、線形化せずに非線形性を扱う。UKFの方が精度面で有利な傾向があるが、計算コストはやや高い&lt;/li&gt;
&lt;li&gt;ROS2の&lt;code&gt;robot_localization&lt;/code&gt;パッケージは、15次元（位置・姿勢・並進速度・角速度・並進加速度）の状態ベクトルに対し、複数センサーを融合するEKF・UKFノードを提供する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;world_frame&lt;/code&gt;を&lt;code&gt;odom&lt;/code&gt;にしたインスタンスで&lt;code&gt;odom&lt;/code&gt;-&amp;gt;&lt;code&gt;base_link&lt;/code&gt;、&lt;code&gt;map&lt;/code&gt;にしたインスタンスで&lt;code&gt;map&lt;/code&gt;-&amp;gt;&lt;code&gt;odom&lt;/code&gt;を配信するdual EKFパターンが代表的な構成で、AMCL・SLAMと同じTFの役割分担に沿っている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://en.wikipedia.org/wiki/Extended_Kalman_filter" target="_blank" rel="noopener"
&gt;Extended Kalman filter - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://en.wikipedia.org/wiki/Unscented_transform" target="_blank" rel="noopener"
&gt;Unscented transform - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cra-ros-pkg/robot_localization" target="_blank" rel="noopener"
&gt;cra-ros-pkg/robot_localization - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.avnet.com/japan/resources/article/what-is-sensor-fusion/" target="_blank" rel="noopener"
&gt;センサーフュージョンとは - Avnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.m1ke.org/p/%E5%B7%AE%E5%8B%95%E4%BA%8C%E8%BC%AA%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E9%A7%86%E5%8B%95%E7%B3%BB%E3%81%A8amclslamnav2/" &gt;差動二輪ロボットの駆動系とAMCL・SLAM・Nav2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.m1ke.org/p/ros2%E3%81%AE%E6%A6%82%E5%BF%B5%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%A1%E3%83%A2/" &gt;ROS2の概念を理解するためのメモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>