Products/7IMUduino/技術情報 のバックアップ
2016-07-19 (火) 19:58:58 のバックアップ(No.2)
* ジャイロの基礎 MPU-6050は3軸ジャイロと3軸加速度センサーを搭載しています。ジャイロは傾きがわかります。傾き表現を以下のように定義します。 - Z軸に関連付けられた回転をYaw, - Y軸に関連付けられた回転をPitch, - X軸に関連付けられた回転をRoll ”理想的なジャイロセンサー”は誤差が全くなく、静止していたら一切数値が変化しないものですが、残念ながらMPU-6050のジャイロセンサーはそのような理想には程遠く、静止状態でも誤差によって少しずつずれていきます。このずれをドリフトと呼びます。 一方で、MPU-6050には加速度センサーも搭載されています。加速度センサーは、物体の加速度を知ることができます。物体が完全に静止している状態でも、地球上のあらゆる物体では「重力」という加速度成分でひっぱられているので、加速度センサーは重力センサーでもあります。 MPU-6050のDMPは、前述のジャイロセンサーと加速度センサーの情報をフュージョンし、ジャイロのドリフトを重力加速度で補正してくれます。 静止状態ではRoll,Pitchは重力方向の成分によって補正が可能です。一方で、Yawに関しては重力成分では補正できません。このため、Yawの補正は時系列によるしかなく、MPU-6050を初期化してからも1分くらいはじわじわとYawの値が変化します。しかも変化量は毎回まちまちです。30度くらいで終わる場合もあるし、140度ほど回ってしまうこともあります。これは センサーの原理上 *絶対に避けることはできない挙動=仕様* です。 * センサーキャリブレーション そもそもズレの原因は、各センサーの生の測定値(raw data)の誤差ですから、各サンプルごとの測定値に対して誤差分のオフセットを与えれば、早く収束させることができそうです。一般的に使われているArduino用MPU6050ライブラリ(https://github.com/jrowberg/i2cdevlib )には、set[XYZ]GyroOffset(), set[XYZ]AccelOffset()という設定メソッドによってセンサーのオフセットを指定することで、早く収束させることができるようになります。 このオフセット値を求めることを、一般にキャリブレーション作業と呼びます。キャリブレーションは、実行環境での試行錯誤が必要なことは言うまでもありません。オフセット値はチップの個体差によって異なりますし、測定場所の緯度や高度でも違います。MPU-6050のキャリブレーションについてはURLをご参照ください(http://www.i2cdevlib.com/forums/topic/96-arduino-sketch-to-automatically-calculate-mpu6050-offsets/)。 * 【余談】IoT開発について 一見、MPU-6050は「使えない」センサーに見えるかもしれません。実際、大学の実験用途や、台数が少ない&高価でも良い、ということであれば、もっと高いハードウェア(地磁気センサー内蔵や光学式ジャイロ)を使えば良いだけです。 しかしIoTの分野では、センサーそのものではなくアプリケーションやシステム側で、測定値の校正やドリフト補正する場面が多々あります。1000台,1万台と配布するシステムであれば、高価で正確なハードウェアを使うことはできないかもしれません。組込開発・IoT分野というのは、ハードウェアの持つ制限・制約をアイデアで回避しつつ、如何に面白いアプリケーションを作れるか、に尽きると私は思います。