micropython-samples/quaternion/test_imu.py

39 wiersze
1.2 KiB
Python

# test_imu.py Demo of cube being rotated by IMU data.
# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2020 Peter Hinch
from math import pi
from time import sleep
import gc
from quat import Rotator, euler
import graph3d as g3d
from setup3d import * # Hardware setup and colors
def imu_demo():
# Dict of display objects, each comprises a Shape
dobj = g3d.DisplayDict(setup(), pi/6, 5) # Camera angle and z distance
dobj['axes'] = g3d.Axes(WHITE) # Draw axes
# Create a reference cube. Don't display.
cube = g3d.Cube(RED, BLUE, GREEN) * (0.8, 0.8, 0.8) - (0.4, 0.4, 0.4)
imuquat = Rotator()
x = 0
while True:
dobj.show()
sleep(0.1)
imuquat[:] = imu.quaternion() # Assign IMU data to Quaternion instance
# imuquat.normalise() No need: BNo055 data is a rotation quaternion
dobj['cube'] = cube @ imuquat
x += 1
if x == 10:
x = 0
print('Quat heading {0:5.2f} roll {2:5.2f} pitch {1:5.2f}'.format(*euler(imuquat)))
print('IMU heading {:5.2f} roll {:5.2f} pitch {:5.2f}'.format(*[x * pi/180 for x in imu.euler()]))
gc.collect()
print(gc.mem_free(), gc.mem_alloc())
del dobj['cube']
imu_demo()