目次 — 知りたいところから読む

入力を変えて確かめる

実験パネルを開き、実行を押すとPythonを読み込みます。停止と初期値へのリセットができます。結果はこの端末内で計算します。Pythonのインストールは不要です。

下にあるローカル実行の手順は、配布ソースを再現するための任意の手順です。ブラウザ実験には不要です。

実験パネルを別タブで開く

再現用ソースをダウンロード

前提と読み方

前提知識 IMUの角速度、平均と分散。

実装・実験 · 本文の条件と確認項目に沿って、計算例や比較表を追う。

ブラウザ実験の条件

ページ上部で一定オフセット、白色ノイズの標準偏差、解析時間を変えられます。保存済みの合成CSV(100 Hz、60,000点、seed 7)の同じノイズ列を使い、y = offset + (saved_y - 0.01) × (std / 0.002) で変換します。解析時間を短くすると同じ記録の先頭部分を使い、毎回乱数を引き直しません。10秒刻みの各解析時間で使うブロックサイズは、NumPyの版による丸めの違いを避けるため、基準の解析環境で求めた値に固定しています。初期値は本文の保存済み結果を再現します。これは実機の測定・性能比較ではありません。

上の図は先頭10秒(終端を除く)の生データ、下の図は選択した全サンプルによる非重複アラン偏差の両対数表示です。平均と標本標準偏差も全サンプルから計算します。100 Hzは固定で、標準偏差は1サンプルの角速度の値です。ノイズ密度ではありません。τごとの隣接組数は数値表の adjacent_pairs に表示します。少なくとも10ブロックを使いますが、長いτの少ない組数から長期安定性を断定できません。

プリセットでオフセットのみの変化、ノイズ標準偏差の2倍化、10秒への短縮を比較できます。一定オフセットは平均に現れますが、隣接平均の差から計算するアラン偏差では相殺されます。温度変化・ドリフト・ランダムウォーク・フィルタは追加していません。自分のCSVをブラウザへ読み込む機能はこの実験には含めていません。

同じ実行コード・解析カーネル・入力CSVを保存できます。ローカルで再現する場合は3ファイルを同じディレクトリに置きます。ブラウザでの実行にはインストール不要です。以下のローカル実行手順は任意です。

静止しているIMUの出力がゼロからずれていても、そのずれ全部をランダムノイズとは呼べない。平均的な偏り、短時間の散らばり、時間とともに変わる安定性を分けて読む。ここではジャイロ1軸を対象にし、実測CSVにも使える解析コードを、条件が既知の合成データで検証する。

まず静止と時刻を確かめる

IMUを固定し、ウォームアップ、出力レート、フィルタ設定、温度、測定時間、単位を記録する。机の振動やケーブルからの力、温度変化があると、センサ固有の雑音だけを見ているとは言えなくなる。加速度計の静止出力には重力が含まれるため、本記事の「静止ならゼロ付近」という読み方をそのまま適用しない。

平均角速度にはバイアス以外に、感度や設置条件によっては地球自転なども含まれる。ADIのIMU評価ガイドを参考に、無外乱・温度条件を重視する。特定機種向けの収録条件を全IMU共通の仕様として扱わない。

CSVと再現手順

CSVはtime_s,gyro_rad_sの2列、単位は秒とrad/sにそろえる。解析コードを保存し、既知の合成データを作る。

python3 imu_noise.py --synthetic
python3 imu_noise.py stationary.csv

2行目は自分で用意した静止ログを読む場合の別の実行である。Python 3.12.3、NumPy 1.26.4、Matplotlib 3.6.3で合成モードを実行した。コードは100点以上の有限値、時刻の単調増加、標本間隔のずれが中央値の1%以内であることを要求する。この1%は本演習の入力検査であり、IMUの一般的な合格基準ではない。

欠測を詰めて等間隔だったことにすると平均時間が変わる。まず連続した区間へ分ける。再標本化する場合もフィルタや補間で雑音特性が変わることを記録する。

平均と標準偏差で分かること

合成データは100 Hzで600 s、60,000点、seed=7。一定バイアス0.01 rad/sに標準偏差0.002 rad/sの独立な正規雑音を加えた。実行結果は平均0.009991 rad/s、標本標準偏差0.001994 rad/sである。入力CSVと集計JSONを公開した。

平均はこの時間区間の代表値であり、別の温度や電源投入後にも同じという証明ではない。標準偏差だけではゆっくりした変動と高速の雑音を十分に区別できない。そこで平均する時間を変えて見る。

Allan偏差は平均時間ごとの変化を見る

m個ずつ重ならないブロックに分けた角速度平均をȳ、ブロック数をKとする。このコードが計算する非重複Allan偏差は次のとおり。

\sigma_A(\tau)=\sqrt{\frac{1}{2(K-1)}\sum_{j=1}^{K-1}(\bar y_{j+1}-\bar y_j)^2},\qquad \tau=m\Delta t

単位は入力と同じrad/sである。長さがmの倍数でない末尾は、そのmの計算でのみ切り捨てる。隣り合う平均の差を取るので一定のオフセットは消える。したがって、Allan偏差だけでは一定バイアスの大きさは分からない。定義と重複型との違いはNIST SP 1065で確認できる。周波数安定度の資料を参照しているが、ここではジャイロ角速度の隣接平均へ同じ統計式を適用している。

合成結果を読む

図1 · ボタンで表示を切り替え
白色雑音のみを含む合成ジャイロの非重複Allan偏差。横軸は平均時間s、縦軸はrad/s。

独立な白色雑音では、m点平均の散らばりはおおむね1/√mとなり、この合成例の理論線は0.002/√(100τ)である。図の長い平均時間側はブロック数が減って揺らぐ。Allan偏差CSVのadjacent_pairs列に比較数を載せた。コードは少なくとも10ブロックを確保するが、末端の9組程度から強い結論は出せない。

このデータにはバイアス不安定性やランダムウォークを追加していない。曲線が下がったことから、実物のIMUが長時間安定しているとは言えない。また、曲線の最小値を単に「バイアス不安定性」と読むには、雑音モデル、傾き、定義に応じた係数の確認が必要である。

実測の比較表に残す項目

機種名とファームウェア、ODR、帯域、単位、温度範囲、総時間、欠測率、軸、平均、標準偏差、各τの比較数を残す。ODRはセンサ内部の出力データレートであり、ホストが読み出す回数とは別である。同じ機種でもフィルタ設定が違えば曲線は変わる。サンプリングとエイリアシングで、ログを速く読むだけでは情報が増えない理由を確認できる。

関連して読む

ODR・読み出し周期・帯域の違いを理解する。サンプリングとエイリアシング同じ分野を別の観点から読むロボットの電源設計 — モータ起動で計算機が落ちる原因を追う同じ分野を別の観点から読むエッジAI推論チップ徹底比較 — Coral・Jetson・Movidius