Predict acceleration

  1'''
  2TinyML - predict_acceleration.py.
  3
  4This example demonstrates how to detect the acceleration or the rotation of movement from time-series data.
  5
  6The read_and_predict function uses measured acceleration and orientation to predict the movement.
  7Then, It will predict four situation:
  8-which is X_acc, Y_acc,  Z_acc and No Predicted Acceleration.
  9The output is the Led, which will be RED for X_acc, GREEN for Y_acc and BLUE for Z_acc.
 10
 11For other examples please check:
 12    https://github.com/WPC-Systems-Ltd/WPC_Stand-alone_Python_release/tree/main/examples
 13
 14Copyright (c) 2024 WPC Systems Ltd.
 15All rights reserved.
 16'''
 17
 18## Standard
 19import time
 20from ulab import numpy as np
 21
 22## WPC
 23import pywpc
 24
 25## TinyML
 26from test_tree_acc import WPC_test_acceleration_tree
 27
 28## Parameters
 29DR = np.pi / 180
 30
 31class Queue:
 32    '''First In, First Out - FIFO'''
 33    def __init__(self, n):
 34        self.list = np.zeros(n)
 35        self.size = n
 36        self.head = 0
 37
 38    def add(self, item):
 39        self.list[self.head] = item
 40        self.head = (self.head + 1) % self.size
 41
 42def most_frequent_element(list, return_max_freq = False):
 43    '''Returns most frequent element of a list, and optionally, the frequency of this element'''
 44    if not list:  # For the case of an empty list
 45        return (None, 0) if return_max_freq else None
 46    most_freq_el = list[0]
 47    max_freq = 1
 48    h =  {}
 49    for items in list:
 50        if items not in h:
 51            h[items] = 1
 52        else:
 53            h[items] += 1
 54
 55        if h[items] > max_freq:
 56            max_freq = h[items]
 57            most_freq_el = items
 58    if return_max_freq:
 59        return most_freq_el, max_freq
 60    return most_freq_el
 61
 62def initialization(model):
 63    '''defines all the variables for prediction'''
 64    global data_acc, data_paste_gyr, data_current_gyr, data_diff_gyr, pred_acc, pred_gyr, wide_tab, MODEL, MAP, MAP_LED
 65    data_acc = np.zeros(3)
 66
 67    data_past_gyr = np.zeros(3)
 68    data_current_gyr = np.zeros(3)
 69    data_diff_gyr = data_current_gyr - data_past_gyr
 70
 71    pred_acc = Queue(7)
 72    pred_gyr = Queue(7)
 73
 74    '''wide_tab is the "concatenation" of seven current tabs, 6x7 = 42, hence a such result'''
 75    wide_tab = np.zeros(42)
 76
 77    MODEL = model
 78
 79    MAP_LED = {0: pywpc.LED_reset, 1: pywpc.LED_setGreen, 2: pywpc.LED_setBlue, 3: pywpc.LED_setRed}
 80
 81def read_and_predict(g):
 82    '''it reads the current data, and predicts the movement based on the last 7 data read'''
 83    global data_acc, data_current_gyr, data_diff_gyr, wide_tab
 84    t0 = time.ticks_ms()
 85
 86    '''Read AI data.'''
 87    data_past_gyr = data_current_gyr
 88    data_current_gyr = np.array(pywpc.AHRS_getOrientation())
 89    data_diff_gyr = data_current_gyr - data_past_gyr
 90
 91    '''remove the gravity component'''
 92    data_acc = np.array(pywpc.AHRS_getAcceleration()) - 9.81*np.array([np.sin(DR*data_current_gyr[1]),
 93                                                np.sin(DR*data_current_gyr[0])*np.cos(DR*data_current_gyr[1]),
 94                                                np.cos(DR*data_current_gyr[0])*np.cos(DR*data_current_gyr[1])])
 95
 96    wide_tab = np.concatenate((data_acc, data_diff_gyr, wide_tab[:-6]))
 97
 98    pred = MODEL(wide_tab)
 99
100    return pred
101
102def main():
103    '''predicts movement for 10 iterations, and return the most frequent prediction'''
104    pywpc.AHRS_start()
105    pywpc.LED_reset()
106    initialization(model = WPC_test_acceleration_tree)
107    time.sleep(1)
108
109    preds = Queue(10)
110    start = time.ticks_ms()
111    while True:
112        preds.add(read_and_predict(0))
113        time.sleep_ms(45)
114        end = time.ticks_ms()
115        print(time.ticks_diff(end, start))
116        start = time.ticks_ms()
117        '''X_acc: RED ; Y_acc: GREEN ; Z_acc: RED, No Acceleration Detected: No Color'''
118        MAP_LED[most_frequent_element(preds.list)]()
119    pywpc.AHRS_stop()
120print('[Main] Starting script')
121
122main()