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, który odbiera zdarzenia z detektora ćwiczeń Aidlab i wypisuje w konsoli wykryte pompki, burpees czy przysiady.

Pomysł powstał podczas Stupid Hackathon w Pomorskim Hackerspace: wykorzystać pas Aidlab do rozpoznawania ćwiczeń. W tym poradniku zbudujemy prosty skrypt Pythona, który wypisuje wykryte ćwiczenia w konsoli.

Aidlab SDK obsługuje między innymi:

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

Przygotowanie

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==2.7.0"

Jak działa detektor?

Detektor korzysta z dwóch rodzajów danych: przyspieszenia z akcelerometru i orientacji urządzenia w przestrzeni.

Przy rozpoznawaniu pompki zmiany przyspieszenia zestawiamy z ułożeniem ciała względem podłogi. Detektor uruchamia się po włączeniu odbioru danych 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], [])

Nie musisz samodzielnie pisać klasyfikatora ruchu. SDK udostępnia moduł workout detector, który rozpoznaje ćwiczenia, w tym pompki.

Odbieranie wyników

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, ExerciseEvent

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_receive_event(self, device, event):
        if isinstance(event, ExerciseEvent):
            print(event.exercise)

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

Po rozpoznaniu ćwiczenia SDK przekaże ExerciseEvent do did_receive_event, a skrypt wypisze wynik.

Jeśli chcesz zbudować własny detektor, wykorzystaj surowe dane z akcelerometru i kwaternion opisujący orientację. Możesz wtedy samodzielnie sprawdzić, które cechy sygnału pomagają rozpoznawać wybrany ruch.