Guide til myo armbånd+python
View the Project on GitHub DDlabAU/myo-gesture-control-armband
Guide sidst testet: 08/10-2025
Guide til Myo, på Windows computere (labbet har måske nogle der kan lånes :)
Denne guide er taget næsten 1:1 fra interaction-lab.wiki.utwente.nl/playground:myo:myo_python, men med ekstra kode og præcisering.
Download Myo SDK
Download og gem Myo SDK et sted (fx Documents eller Desktop).
Download her
...\myo-sdk-win-0.9.0\bin
(hvor du har gemt og udpakket SDK)Verificer at armbåndet er tilsluttet
Brug Myo Connect appen (download .exe-filen herfra (hvis du bruger windows)), kør appen og følg guiden i appen.
pip install "myo-python>=1.0.0"
Sørg for at computeren har Python installeret først.
## Kode 1: Test om Myo virker
Her er et eksempel på Python-kode, der tester om armbåndet er tilsluttet og reagerer:
import myo
class Listener(myo.DeviceListener):
def on_paired(self, event):
print(f"Hello, {event.device_name}!")
event.device.vibrate(myo.VibrationType.short)
def on_unpaired(self, event):
print("No paired device present")
return False # Stop hub
if __name__ == '__main__':
myo.init(sdk_path=r'C/Users/ddlab/Documents/myo-sdk-win-0.9.0') # VIGTIGT: juster path alt efter hvor i har gemt sdk mappen henne
hub = myo.Hub()
listener = Listener()
while hub.run(listener.on_event, 500):
pass
Bemærk:
sdk_path
til den korrekte sti, hvor du har udpakket Myo SDK.myo-python
skal være installeret.## Kode 2: Pose-detektion og udskrivning af gestur-nummer
Denne kode opdager hvilken gestur (pose) der bruges og printer et tal for hver gestur:
0
= afslappet hånd1
= knytnæve (“Fist”)2
= fingers spredt (“Fingers spread”)3
= bøjet hånd (“Wave in”)4
= strakt hånd (“Wave out”)5
= tommelfinger rører langemand (“Double tap”)Det er altså nemt herfra og tilføje et if-statement, der gør noget alt efter hvilket tal/pose der registreres
import myo
class PoseLogger(myo.DeviceListener):
def on_connected(self, event):
print(f"Connected to {event.device_name}")
event.device.stream_emg(False) # Disable EMG if you don’t need it
def on_pose(self, event):
print(f"Pose detected: {event.pose}")
if __name__ == '__main__':
# Initialize Myo SDK (replace with correct path if needed)
myo.init(sdk_path=r'C:\Users\ddlab\Documents\myo-sdk-win-0.9.0')
hub = myo.Hub()
listener = PoseLogger()
try:
print("Listening for poses... (Ctrl+C to quit)")
while hub.run(listener.on_event, 500):
pass
except KeyboardInterrupt:
print("Exiting...")
finally:
hub.stop()
Bemærk:
sdk_path
til den korrekte sti, hvor du har udpakket Myo SDK.myo-python
er installeret.## Kode 3: Data logging til .csv (avanceret)
Læs og plot armbåndets værdier
Dette script forbinder til armbåndet, venter på at posen “Fist” registreres, og begynder derefter at læse og gemme data fra armbåndet i en CSV-fil. Når “Fingers spread” registreres, gemmes data, et plot vises, og programmet afsluttes.
Formålet med koden er at vise, hvordan man bruger forskellige on_something
-funktioner til at optage data, samt hvordan pose-detektion for standard-poser kan implementeres i Python.
# Imports for tid, myo, tidsinterval, lagring og plot af data
import myo
from myo.utils import TimeInterval
import csv
import matplotlib.pyplot as plt
class Listener(myo.DeviceListener):
def __init__(self):
self.interval = TimeInterval(None, 0.05) # tid i sekunder
self.orientation_data = []
self.emg_data = []
self.rssi = None
def on_connected(self, event):
event.device.request_rssi()
print(f"Hello, {event.device_name}!")
event.device.stream_emg(True)
def on_rssi(self, event):
self.rssi = event.rssi
print(f"received signal strength = {self.rssi}")
def on_emg(self, event):
if not self.interval.check_and_reset():
return
self.emg_data.append(event.emg)
def on_orientation(self, event):
if not self.interval.check_and_reset():
return
self.orientation_data.append(event.orientation)
def save_emg_to_csv(self, filename):
with open(filename, 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(self.emg_data)
print(f'Data saved to {filename}.')
def save_orientation_to_csv(self, filename):
with open(filename, 'w', newline='') as csvfile:
fieldnames = ['w', 'x', 'y', 'z']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for row in self.orientation_data:
writer.writerow({'w': row[0], 'x': row[1], 'y': row[2], 'z': row[3]})
print(f'Data saved to {filename}.')
def plot_emg_data(self):
fig, axs = plt.subplots(8, 1, figsize=(10, 20), sharex=True)
fig.suptitle('EMG Data')
for i in range(8):
axs[i].plot([sample[i] for sample in self.emg_data])
axs[i].set_ylabel(f'Channel {i + 1}')
plt.tight_layout()
plt.subplots_adjust(top=0.95)
plt.show()
if __name__ == '__main__':
myo.init(sdk_path=r'C/Users/ddlab/Documents/myo-sdk-win-0.9.0') # VIGTIGT: juster path alt efter hvor i har gemt sdk mappen henne
hub = myo.Hub()
listener = Listener()
try:
print("Collecting data. Please perform gestures...")
while hub.run(listener.on_event, 500):
pass
except KeyboardInterrupt:
pass
finally:
hub.stop()
listener.save_emg_to_csv('csv/myo_emg_data.csv')
listener.save_orientation_to_csv('csv/myo_orient_data.csv')
listener.plot_emg_data()
Bemærk:
sdk_path
til den korrekte sti, hvor du har udpakket Myo SDK.csv/
før du kører koden, ellers får du fejl.matplotlib
er installeret (pip install matplotlib
).