ぽぽろん研究所のサムシング

twitter:@poporon_labもよろしく

オブジェクトの回転角を知りたかった【2022/09/04】

こんにちは、ぽぽろん研究所です。

今日はとあるオブジェクトの設置回転角を測りたかったので、ジャイロで測ったろというお話です。これまでは目分量で測定していて、「45度より小さそうだから30度、ヨシ!!」みたいに決めてました。それを解決するために、今回はジャイロで設置角を測定しようというわけです。分度器を使えばいいみたいなことは言ってはいけません。(うちには分度器はありません。6軸センサ内蔵マイコンならあります。)

測る方向

回転角は図のようにX,Y,Z軸を中心に3方向の角度があります。Z軸を地面に垂直な方向とすると、X,Y軸は重力加速度から計算可能ですが、Z軸の回転量は重力加速度では計算できません。Z軸の回転角の簡単な計算方法としては角速度をセンサで求めて、これを積分する方法となります。

ドリフト

先程、回転角は角速度を積分すれば求められるといったな。あれは(少し)嘘だ。
嘘ではないが積分していくだけでは、積分誤差として蓄積され、だんだんと誤差の成分が大きくなり、計算結果がズレていくのです。この問題を少しでも改善するために今回はMadgwickフィルタを使用します。よくわからないですけど、すごいヤツみたいです。ライブラリを使用することで、中身を知らなくてもなんとかなります。と、思ってましたが使い方を間違っていたのが値が正常に取れなかったので、その記録です。

実装

今回はArduino101を使用して角度を取得します。Arduino101には6軸センサが内蔵されているArduinoなので、これを選択しました。

docs.arduino.cc

また、Arduinoを使う理由としてはライブラリが豊富なのもあります。Madgwickフィルタのライブラリもあるようなので、簡単にできそうです。
一応、表示系にどこの誤家庭にも落ちているSSD1306を使用しました。UARTでも出力しているのでオプションです。

ここからはソースになります。ソースはこちらにおいておきます。前提ライブラリはMadgwickAHRSとU8g2libです。 GitHub - poporon-lab/gyro_arduino101: arduino101で回転角を取得


ソース上でのポイントはMadgwickライブラリの値更新を設定した周波数で行うことです。loop関数内で以下の関数を使用して、フィルタの値を更新しています。

filter.updateIMU(gx, gy, gz, ax, ay, az);

これを呼び出すタイミングを設定した周期で呼び出す必要があるのです。この周期を間違えると値がおかしな方向に飛んでいきます。特にZ軸の回転角が。。。
その周期の設定は以下のbegin関数の引数で行います。ここで周波数[Hz]を指定することで周期を設定します。

filter.begin(25);

あとはいい感じ表示系を整えて完成です。

youtu.be

最後に

今回のソースはほぼサンプルのままです。サンプルソースにSSD1306の表示系を追加しただけです。適当にMadgwickライブラリを使おうとしたら、思ったように動かなかったので、その原因についての内容でした。
後から気づいたのですが、今回やりたかったことはスマホでもできそうなので、そちらでも調べてみます。そもそも、スマホなら6軸も画面もバッテリーまでついているという。。。(多分アプリがすでにありそう)
なぜ、Arduinoで作ろうと思ったのか(´・ω・`)


それでは、また次回。