ozwk
ifYvaIqM8Zm7Fm6h.qrunch.io

加速度センサの出力を二重積分すれば変位が得られると思っているあなたへ

2018/12/06に投稿

加速度を積分すれば速度
速度を積分すれば変位

力学を習えばこう教わるし、スマホ内蔵のセンサや電子工作キットで手軽に加速度を測れます。
じゃあ加速度センサがあれば出力を積分して位置がわかるじゃん!と考えているあなた、
それ無理です。

(ノイズの関係上)無理

加速度に限らずセンサにはノイズがつきものです。
静止している加速度センサの出力を積分するとどうなるかシミュレーションしてみましょう。
サンプリングレート20Hzで60秒ぶんのデータを生成しました。
ノイズの分散は0.01m/s/sにしました。実際の加速度センサもこんなものです:

これを積分して速度にします。初期速度は0とします:

更に積分して変位にします:

1分間で12cmずれます。

同一条件の加速度ノイズを100パターン生成して変位を計算するとこうなりました:

平均0で標準偏差0.3mぐらいになりました。

(オフセットの関係上)無理

どうにかノイズを抑え1分で10cmなら許容できる範囲かもしれません。
しかし加速度に限らずセンサにはオフセットがつきものです。
つまり静止させていても出力が出てしまいます。

事前の測定により取り除けますが、温度などで変化するので完全には取り除けません。

例えば0.01m/s/sのオフセットが残ったとすると
1秒で5mm、10秒で0.5m、1分で18mずれます。

オフセットを1/10にしても1分で1.8mずれます。

(座標系の関係上)無理

ここまでの話からするとノイズとオフセットを許容できる大きさまで抑えれば可能なように思えるかもしれませんが、今までの話は1次元、またはセンサが平行移動するという前提で話していました。

ある方向、例えばx軸の変位を得たければ、理論的にはx軸の加速度成分を積分すればいいのですが、センサの姿勢が変わる場合、センサの座標系と得たい変位の座標系の向きが変わるので、加速度成分を取り出すこと自体が難しくなります。
例えば初期状態ではセンサーのX軸が北を向いていたが、途中で進路を変えて西を向くようになった、のような状況です。もちろん加速度センサ単体では途中で西を向いたことを知りようがありません。
例のような北から西のような90度の回転でなくても、少しずれただけでも誤差はひどくなります。0.01m/s/sのズレが継続すると1分後に18mのズレになることを思い出してください。
また重力加速度も問題です。9.8m/s/sなので水平方向から約0.1度傾いただけで0.017m/s/sのオフセットが混入します。

絶対にセンサを微塵も回さない・傾けないというなら可能ですが、こういうことをやりたいとき、大抵の対象はロボットや人間、手に持ったスマホなど並進以外の動きをする移動体であり、センサの座標系は基準座標系から回転することがほとんどです。(そして並進しかしない物体であれば、たいてい機構的にもっと適した測定法があります。例えばレール上を動くロボットならタイヤや駆動ベルトの回転数を見ればいいです。)
なので加速度センサ単体で位置計測はどう頑張っても無理なのです。

どうしてもやりたい?

要するにセンサの回転を得られれば良いので、
角速度センサや磁気センサを追加して姿勢推定を行えばできます。

また、移動体の運動の特徴によっては、それを利用して誤差を軽減することができます。
例えば歩行中の人間のつま先は、足が地面についている間は速度が0になります。
加速度の分散などを利用し、足が地面についているかを判定し、
ついていたら速度を0にするようにすると速度の誤差の積み重なりを軽減できます。
(ZUPT : Zero velocity UPdaTe)

文字で書くと簡単なようですが、実装するとなると

  • クォータニオンや回転行列の知識
  • 拡張カルマンフィルタなど最尤推定の知識

が必要になるので、高校で理系でした!レベルでは難しいです。
覚悟しましょう。

関連記事

コメントはありません。
ozwk
ifYvaIqM8Zm7Fm6h.qrunch.io
フォロー
フォロワー
ブログを開設

クランチで技術ブログを
始めてみませんか?

この先は、クランチへのアカウント登録、及びログインが必要なページになります。

Markdownの書き方
見出し # 見出し(h1)
## 見出し(h2) , ### 見出し(h3) ...
リスト - 箇条書き
   - タブでインデント
番号付きリスト 1. テキスト
2. テキスト
改行 行末に半角スペース2つ
リンクの挿入 [タイトル](https://xxx.com)
引用 > テキスト
コード挿入 ```cpp:title
code
```
画像の挿入 ![代替テキスト](URL "タイトル")
太字 **テキスト**
斜体 *テキスト*
打消し線 ~~テキスト~~
水平線 ***
技術ブログを開設
ログイン