目次 — 知りたいところから読む
前提と読み方

前提知識 座標・速度・センサの基本用語。学習ガイドから前提記事を選べます。

入門 · 原理・構成・判断のための解説です。

ロボットが「右へ1 m、前へ2 m移動した」と知る最も素朴な方法は、移動量を自分で足し続けることだ。車輪の回転数、モータの速度、IMUの角速度を時系列で積分し、現在位置を推定する。この方法をDead Reckoning(推測航法)と呼ぶ。GPSやカメラが一時的に使えなくても動作する一方、わずかな車輪滑りやセンサバイアスが時間とともに位置誤差へ変わる。

RTK-GNSS測量機を使う測量者GNSS絶対観測の現場例
MPU-6050を搭載したGY-521 IMUモジュール低価格IMUの実例

画像: Surveyor Using GNSS Receiver with RTK Solution(SweetCanadianMullet, CC BY 4.0)およびGY-521 MPU-6050 module(Nevit Dilmen, CC BY-SA 3.0)、Wikimedia Commons。いずれも本文の特定構成を意味しない。

30秒で分かる結論

  • Dead Reckoningは「直前の状態+測った移動量」で現在状態を予測する。観測がない間も高い周期で更新できる。
  • 差動二輪では、左右車輪の移動量の差が旋回角、平均が前進距離を決める。車輪半径とトレッド幅の誤差は系統的な曲がりとして現れる。
  • オドメトリの誤差は積分で蓄積する。絶対位置を得るにはGNSS、LiDAR、カメラ、反射マーカなどの観測で補正する。
  • IMUは短時間の姿勢変化に強いが、加速度の二重積分で位置が急速にドリフトする。車輪とIMUをEKFや因子グラフで融合するのが一般的だ。
  • 実装では、タイムスタンプ、座標系、左右符号、車輪半径、滑り検知、共分散を最初に正しく定義する。ここが曖昧だと高価なセンサでも直らない。

1. 差動二輪の運動学

左右車輪の半径をr、車輪間距離(トレッド)をb、左・右の角速度を\omega_L,\omega_Rとする。車輪の線速度はv_L=r\omega_L、v_R=r\omega_Rであり、車体中心の並進速度vとヨー角速度\dot{\theta}は

v=\frac{v_R+v_L}{2},\qquad \dot{\theta}=\frac{v_R-v_L}{b}

となる。時刻kの姿勢を(x_k,y_k,\theta_k)、サンプリング周期を\Delta tとすれば、単純なオイラー積分は

x_{k+1}=x_k+v\cos\theta_k\Delta t,
y_{k+1}=y_k+v\sin\theta_k\Delta t, \qquad \theta_{k+1}=\theta_k+\dot{\theta}\Delta t

である。一定速度で円弧を走る場合は、厳密な積分(車体座標での指数写像)を使うと、低速・高旋回でも誤差が小さくなる。

図1 · ボタンで表示を切り替え
差動二輪ロボットの左右車輪、瞬間回転中心、速度ベクトルを示す図 車体中心から見た左輪速度vLと右輪速度vR、トレッドbの関係から瞬間回転中心が定まり、vRがvLより大きい場合は左へ旋回することを示す図。 車体中心左輪 vL右輪 vR トレッド b v瞬間回転中心vR > vLなら左へ旋回

図1 — 差動二輪では左右速度の差がヨー角速度を作る。片輪を止めればその車輪を中心に旋回できる。

2. オドメトリがずれる理由

車輪半径に1%の誤差があり、左右が同じだと思って走ると、直進しているつもりでも少しずつ旋回する。左右のエンコーダ分解能、ギヤのバックラッシュ、床面の凹凸、タイヤの摩耗、荷重による変形が系統誤差になる。濡れた床や砂利で片輪が滑ると、測った回転量と実際の移動量が一致しない。

姿勢誤差\delta\thetaは横方向の位置誤差を生む。前進距離をsとすると、短時間の近似で

\delta y\approx s\,\delta\theta

となる。1 km走って角度誤差が0.5度なら、横ずれは約8.7 mに達する。位置誤差を単純に「毎秒何cm」と表すだけでは、直進・旋回・滑りで異なる誤差の構造を説明できない。

車輪オドメトリの共分散は、左右の移動量の不確かさを姿勢へ伝播させて更新する。実装では、旋回中や滑り検知時に共分散を大きくし、後段のセンサ融合がオドメトリを過信しないようにする。

3. IMUを加える

IMUのジャイロで得た角速度\omega_zを積分すると

\theta(t)=\theta_0+\int_0^t(\omega_z(\tau)-b_g-n_g)\,d\tau

となる。b_gはジャイロバイアス、n_gはノイズである。車輪が滑った瞬間でも角速度の短時間変化は測れるため、車輪だけより滑らかな姿勢推定が得られる。加速度から速度・位置を二重積分する場合は、バイアスb_aによる誤差が

\delta p(t)\simeq\frac{1}{2}b_a t^2

で増えるので、IMU単体を長時間の位置センサとして使うことはできない。

車輪とIMUを組み合わせると、車輪は低周波の移動量、IMUは高周波の角速度・加速度を担当する。重力方向からロール・ピッチを初期化し、磁気センサやGNSSが使える場合はヨーの絶対基準も追加する。

4. EKF・因子グラフで補正する

状態ベクトルの一例は

\mathbf{x}=[x,y,\theta,v,b_g,b_a]^T

である。予測ステップでは車輪とIMUから非線形運動モデルfを計算し、観測が来たら残差を補正する。

\mathbf{x}_{k+1}=f(\mathbf{x}_k,\mathbf{u}_k)+\mathbf{w}_k,
\mathbf{z}_k=h(\mathbf{x}_k)+\mathbf{v}_k

拡張カルマンフィルタ(EKF)は、ヤコビ行列で非線形モデルを局所線形化する。GNSS位置、LiDARスキャンマッチング、カメラの特徴点、既知マーカの姿勢を観測\mathbf{z}として取り込める。大きなループや再訪を扱う場合は、過去の姿勢と観測を因子グラフに残し、後から全体を最適化する。

ROS 2(ここではJazzyの標準メッセージ定義を想定)では、車輪のnav_msgs/msg/Odometry、IMUのsensor_msgs/msg/Imu、TFのodom→base_linkを同じ時間基準で扱う。メッセージ型はROS 1のnav_msgs/Odometry表記と対応するが、ROS 2の実装・QoS・配布版の設定は別に確認する。robot_localizationのEKFは実装の出発点になるが、共分散をゼロにしたり、同じ情報を二重に入力したりすると、推定が不自然に硬くなる。

5. 現行ロボットでの使われ方

屋内搬送ロボット(AMR)は、車輪エンコーダとIMUを常時使い、LiDARやカメラの地図マッチングでドリフトをリセットする。自動運転車では、車輪速・ステア角・IMU・GNSS・LiDARを融合し、トンネルや高架下でGNSSが途切れても数秒〜数十秒の推定を維持する。農業ロボットでは、泥・わだち・傾斜により車輪滑りが増えるため、RTK-GNSS、IMU、作業機の力センサを組み合わせる。

水中ロボットや宇宙機では、GNSSが使えない時間が長い。速度計(DVL)や星センサ、地形照合を低頻度の絶対観測として加え、Dead Reckoningの共分散を管理する。重要なのは、推定値に「どれくらい自信があるか」を添えて計画・制御へ渡すことだ。

6. 実装チェックリスト

  1. センサのタイムスタンプを同じクロックへ変換し、遅延を測る。
  2. base_link、odom、mapの座標系と右手系の符号を図に描く。
  3. 車輪半径・トレッド・エンコーダ分解能を実走行で同定する。
  4. 直進、定常旋回、8の字、段差、低摩擦路で誤差を分けて評価する。
  5. 滑りや欠測を検知したら共分散を増やし、絶対観測が来たら補正する。
  6. ログを再生して同じ入力から同じ推定が得られるか確認する。

試験では、終点の位置誤差だけでなく、姿勢誤差、最大誤差、95パーセンタイル、欠測時のドリフト率を記録する。平均値が小さくても、たまに大きく外れる推定は安全な経路計画に使えない。

まとめ

Dead Reckoningは、ロボットの運動を最も短い遅延で推定する基礎である。車輪の移動量とIMUの角速度を積分し、GNSS・LiDAR・カメラなどの絶対観測でドリフトを抑える。センサを増やす前に、運動モデル、タイムスタンプ、座標系、共分散を正しく設計することが、精度と再現性を決める。

理解を確かめる
車輪回転を正確に測れば位置誤差は消える?

滑り、車輪径、取付寸法の誤差は残る。センサーの読取り精度と、運動モデルが実際に合うかを分ける。

参考資料

関連して読む

同じ分野を別の観点から読むICPはなぜ失敗するのか同じ分野を別の観点から読むROS 2で地図作成から自律走行まで — Jazzy・Nav2の最小再現手順