Inżynieria

Detektor ćwiczeń z własną masą ciała w Pythonie

Author avatar

Jakub Domaszewicz

Ostatnia aktualizacja3 grudnia 2021

Detektor ćwiczeń z własną masą ciała w Pythonie

Uruchom skrypt w Pythonie, który nasłuchuje detektora treningów Aidlab i zapisuje każdą pompkę, burpee czy przysiad.

Ile pompek potrafisz zrobić? Zespół biorący udział w Stupid Hackathon, hackathonie organizowanym w Pomorskim Hackerspace, chciał stworzyć aplikację wykorzystującą pas piersiowy Aidlab, która zachęca do aktywnego i zdrowego stylu życia.

Pokażemy, jak zbudować prostą aplikację, która komunikuje się z Aidlabem za pomocą Aidlab SDK. Gotowy skrypt Pythona będzie wypisywał w konsoli wykryte ćwiczenia, takie jak:

  • pompki
  • brzuszki
  • burpees
  • podskoki
  • przysiady
  • podciąganie na drążku

Wymagania: do połączenia z Aidlabem potrzebujesz komputera z obsługą Bluetooth.

Zacznij od przygotowania projektu:

  1. Utwórz pusty katalog, a w nim plik workout-detector.py.
  2. Zainstaluj aidlabsdk za pomocą pip:
python -m pip install aidlabsdk

Zliczanie podstawowych ćwiczeń jest stosunkowo proste, ponieważ wymaga tylko dwóch rodzajów danych. Pierwszym jest sygnał z akcelerometru, który pokazuje zmiany przyspieszenia podczas ruchu. Drugim jest orientacja urządzenia w przestrzeni.

Aby rozpoznać ćwiczenie, mierzymy niewielkie zmiany przyspieszenia i sprawdzamy, czy ćwicząca osoba jest zwrócona przodem do podłogi. Właśnie to Aidlab robi w tle po włączeniu odbioru sygnałów motion i orientation:

devices = await AidlabManager().scan()
if len(devices) > 0:
    aidlab = devices[0]
    await aidlab.connect(delegate)
    await aidlab.collect([DataType.MOTION, DataType.ORIENTATION], [])

Prawidłowe określenie orientacji bywa kłopotliwe. Na szczęście odbiór sygnałów motion i orientation automatycznie uruchamia wykrywanie ćwiczeń za pomocą modułu workout detector, więc nie musimy tworzyć wszystkiego od zera. Moduł ten ma wiele przydatnych funkcji, w tym licznik pompek.

Aby obsługiwać zdarzenia związane z ćwiczeniami, utwórz klasę WorkoutDetector, która implementuje DeviceDelegate:

import asyncio
from aidlab import AidlabManager, DataType, DeviceDelegate, DisconnectReason

class WorkoutDetector(DeviceDelegate):

    async def run(self):
        devices = await AidlabManager().scan()
        if len(devices) > 0:
            await devices[0].connect(self)
            while True:
                await asyncio.sleep(1)

    def did_connect(self, device):
        print("Connected to:", device.address)
        asyncio.create_task(device.collect([DataType.MOTION, DataType.ORIENTATION], []))

    def did_disconnect(self, device, reason: DisconnectReason):
        print("Disconnected from:", device.address, reason)

    def did_detect_exercise(self, device, exercise):
        print(exercise)

asyncio.run(WorkoutDetector().run())

Funkcja zwrotna modułu workout detector jest teraz wywoływana przy każdym rozpoznaniu nowego ćwiczenia.

Zachęcamy do dalszych eksperymentów z surowymi danymi ruchowymi — sygnałem z akcelerometru i kwaternionem orientacji. Możesz na ich podstawie zbudować własny detektor ćwiczeń.