慣性計測ユニットを使ってsense hatの動作の検出をしてみた

2018年11月21日

非常に久方ぶりの Sense Hat の part6 です。チュートリアルに従い、IMUを触ってみました。

チュートリアルの「Detecting movement」には、以下の説明が出ています。

Sense HATには、動作を検出する一連のセンサーを含むIMU(慣性計測ユニット)チッ プがあります。実際には3つのセンサーが1つになっています
ジャイロスコープ:運動量と回転を測定してボードがどの方向にあるかを検出します
加速度計:加速力を測定し、重力の方向を見つけることができます
磁力計:地球の磁場を測定します。コンパスのようなものです

そして、これらのセンサーが何故重要なのかを説明した文章が載っています。

その中で、宇宙においては、自分がどの方向に向いているかの重要性が説かれています。

Sense Hat 上のIMU(慣性計測ユニット)チップがこれです。

Sense Hat IMU(慣性計測ユニット)チップの画像
スポンサーリンク

ピッチ、ロール、ヨーについて学ぶ

チュートリアルにある説明はこうなっています。

全てのオブジェクトには、回転可能な3つの軸があります。
ピッチ – 飛行機が離陸すると想像してください
ロール – 勝利のロールをしている飛行機を想像してください
ヨー – 車のように飛行機を操縦することを想像してください

オブジェクトの各軸でどのくらいの回転が行われたかを知っていれば、オブジェクトがどのような位置を指しているかを知ることができます。

うーん、いまいち、良くわからないですが、飛行機をモデルに考えると、この三つの動きを理解できると思います。

チュートリアルにある以下のビデオを見ると、よくわかりますね。

Sense Hat のピッチ、ロール、ヨーは、このようになってます(チュートリアル Learn about pitch, roll, and yawより転載)。

ピッチ・ロール・ヨーの説明画像

ピッチ、ロール、ヨーを検出する

チュートリアルに従って、現在のピッチ、ロール、ヨーを検出するプログラムを作成します。

from sense_hat import SenseHat
sense = SenseHat()
sense.clear()o = sense.get_orientation()
pitch = o["pitch"]
roll = o["roll"]
yaw = o["yaw"]
print("pitch {0} roll {1} yaw {2}".format(pitch, roll, yaw))

プログラムを実行し、Sense HATを動かし、値がどのように変化するかを見てください。

pitch 0.5117787640722093 roll 8.434573285292066 yaw 123.55536268910598

以前のプログラムはこうでした。

from sense_hat import SenseHat
sense = SenseHat()
while True:
orientation = sense.get_orientation()
pitch = orientation['pitch']
roll = orientation['roll']
yaw = orientation['yaw']
print("pitch={0}, roll={1}, yaw={2}".format(pitch,yaw,roll))

こちらを実行して、ラズパイを色々動かすと、こんな結果になりました。ラズパイの位置が変化するのにつれて、pitch,roll,yaw の値が、その位置に合わせて、値が次々と変化します。

数値の表示する状況は目で追いきれないくらい早いです。


加速度計による計測

sense.get_accelerometer_raw()メソッドは、各軸(x、y、z)に作用するG-forceの量 を示します。

いずれかの軸に±1Gがある場合、その軸が下を指していることがわかります。

この例では、各軸の重力加速度の量が抽出され、次に最も近い整数に丸められます。

from sense_hat import SenseHat
sense = SenseHat()
while True:
acceleration = sense.get_accelerometer_raw()
x = acceleration['x']
y = acceleration['y']
z = acceleration['z']
x=round(x, 0)
y=round(y, 0)
z=round(z, 0)
print("x={0}, y={1}, z={2}".format(x, y, z))

Sense HATを回転させると x と y の値が -1 と 1 の間で変化します。ラズパイをフラットにしたり、逆さまにすると、z軸の値は 1 になり、-1 になります。

プログラムを実行して、ラズパイを動かした結果です。x,y,z の値が次々と変化していきました。

目で追えないくらいです。

どの方向?

Sense HAT がどの方向に向いているかを確認(以前に学習したset_rotationメソッドを使用)し、文字 ”J” をディスプレイの向きに表示します。

from sense_hat import SenseHat
sense = SenseHat()
# Display the letter J
sense.show_letter("J")
while True:
acceleration = sense.get_accelerometer_raw()
x = acceleration['x']
y = acceleration['y']
z = acceleration['z']
x=round(x, 0)
y=round(y, 0)
z=round(z, 0)
print("x={0}, y={1}, z={2}".format(x, y, z))
# Update the rotation of the display depending on which way up the Sense HAT is
if x == -1:
sense.set_rotation(180)
elif y == 1:
sense.set_rotation(90)
elif y == -1:
sense.set_rotation(270)
else:
sense.set_rotation(0)

Sense Hat を動かして試してみました。

ボードが回転しているだけの場合は、いずれの方向にも1Gの加速度が発生します。Sense Hat を振ってみると、センサーは1G以上の値を示します。

下記プログラムは、センサーが x,y,z 軸いずれかに1以上の値を検知した場合、LEDに赤い!を表示します。

from sense_hat import SenseHat
sense = SenseHat()
red = (255, 0, 0)
while True:
acceleration = sense.get_accelerometer_raw()
x = acceleration['x']
y = acceleration['y']
z = acceleration['z']
x = abs(x)
y = abs(y)
z = abs(z)
if x > 1 or y > 1 or z > 1:
sense.show_letter("!", red)
else:
sense.clear()

実際に Sense HAT を振って試してみました。赤の!を判定するのはちょっと難しいかもしれません。一瞬、赤い何かが表示するさまをご覧ください。

何かが表示されたらしいとはわかりますが、その内容を把握するのは無理ですなあ!

スポンサーリンク

最後に

この記事では、sense hatに搭載されている慣性計測ユニットを使って動作の検出を行いました。

ピッチ、ロール、ヨーについて学んだあと、それらの値を検出しました。

さらには、加速度計や方向を示す動作検出をしてみました。

60爺には、ちょっと難しかった漢字ですな!

■「sense hatで遊ぶ!」の記事は次の通りです

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら