金宏和實です。
ジャイロセンサーの返すヨー(yaw)角を使って、ロボットを90度右に旋回させてみます。
ジャイロセンサーはヨー(yaw)とピッチ(picth)とロール(role)を返す。飛行機で考えるとヨーは左右の向きで、ピッチは上下の向き、ロールは機体の傾きである。
Spikeアプリではハブアイコンをクリックすると、ヨー、ピッチ、ロールが表示できる。

まずはワードブロックでヨー角を使ってみよう。

ワードブロックのプログラムでは、まずロボットの左右のモーターを指定して、ヨー角を0に設定している。いわゆる初期化処理である。次に移動スピードを速くし過ぎると、曲がりすぎるので30%に設定している。右90の向きに移動開始するで鋭角に動かす。この90をステアリング値と呼ぶようだが、この数値が大きいと軌跡が鋭くなる。そして、ヨー角が90度を超えるまで待つ。これでだいたい90度に曲がる。正確を期すには移動スピードに合わせて角度を若干調整すると良いと思う。
次にこのプログラムをPythonで書いてみると、これが結構難しくなる。runloop()を使ってawaitで待機を入れているせいもあるかもしれない。
import motor_pair
import runloop
import sys
from hub import port , motion_sensor
def turn_done():
return abs(motion_sensor.tilt_angles()[0] * -0.1) > 90
async def main():
motor_pair.pair(motor_pair.PAIR_1, port.C, port.D)
motion_sensor.reset_yaw(0)
await runloop.until(motion_sensor.stable)
motor_pair.move(motor_pair.PAIR_1, 90, velocity=200)
await runloop.until(turn_done)
motor_pair.stop(motor_pair.PAIR_1)
sys.exit(0)
runloop.run(main())
概略を説明すると、turn_done関数は右に90度曲がるとTrueを返す。tilt_angles()はヨー、ピッチ、ロールの3つを要素とするタプルを返すが、右に90度曲がると-900が返ってくるので90と比較できるように適宜変換している。main関数内のreset_yaw(0)はヨー角の初期化である。await runloop.until(turn_done)で右に90度回るのを待っている。