choices=[m.value for m in EMGMode], help='Choose the EMG receiving mode ({0} - default: %(default)s)'.format( modes)) parser.add_argument('-v', '--verbose', action='count', default=0, help='Increase verbosity') args = parser.parse_args() # set logging level to at least logging.INFO logging.basicConfig(level=max(2 - args.verbose, 0) * 10) # setup the BLED112 dongle or a native Bluetooth stack with bluepy and connect to a Myo armband myo = MyoRaw(args.tty, args.native, args.mac) # add handlers to process EMG, IMU and battery level data myo.add_handler(DataCategory.EMG, emg_handler) myo.add_handler(DataCategory.IMU, imu_handler) myo.add_handler(DataCategory.BATTERY, battery_handler) # subscribe to all data services myo.subscribe(args.emg_mode) # disable sleep to avoid disconnects while retrieving data myo.set_sleep_mode(1) # vibrate and change colors (green logo, blue bar) to signalise a successfull setup myo.vibrate(1) myo.set_leds([0, 255, 0], [0, 0, 255]) # run until terminated by the user try: while True: myo.run(1) except KeyboardInterrupt:
outdir.mkdir(parents=True, exist_ok=True) emg_file = outdir.joinpath(now + '_emg.csv').open(mode='w', newline='') imu_file = outdir.joinpath(now + '_imu.csv').open(mode='w', newline='') emg_writer = csv.writer(emg_file, csv.unix_dialect, quoting=csv.QUOTE_MINIMAL) emg_writer.writerow(emg_header) imu_writer = csv.writer(imu_file, csv.unix_dialect, quoting=csv.QUOTE_MINIMAL) imu_writer.writerow(imu_header) m = MyoRaw(args.tty, args.native, args.mac) m.add_handler(DataCategory.EMG, lambda *args: write_data(emg_writer, args)) m.add_handler(DataCategory.IMU, lambda *args: write_data(imu_writer, args)) m.subscribe(args.emg_mode) # Enable never sleep mode. m.set_sleep_mode(1) # vibrate to signalise which Myo will start to stream data m.vibrate(1) try: while True: m.run(1) except KeyboardInterrupt: pass finally:
times.append(time.time()) if len(times) > 20: # print((len(times) - 1) / (times[-1] - times[0])) times.pop(0) def proc_battery(timestamp, battery_level): print("Battery level: %d" % battery_level) if battery_level < 5: m.set_leds([255, 0, 0], [255, 0, 0]) else: m.set_leds([128, 128, 255], [128, 128, 255]) m = MyoRaw(sys.argv[1] if len(sys.argv) >= 2 else None) m.add_handler(DataCategory.EMG, proc_emg) m.add_handler(DataCategory.BATTERY, proc_battery) m.subscribe() m.add_handler(DataCategory.ARM, lambda arm, xdir: print('arm', arm, 'xdir', xdir)) m.add_handler(DataCategory.POSE, lambda p: print('pose', p)) # m.add_handler(DataCategory.IMU, lambda quat, acc, gyro: print('quaternion', quat)) m.set_sleep_mode(1) m.set_leds([128, 128, 255], [128, 128, 255]) # purple logo and bar LEDs m.vibrate(1) try: while True: m.run(1)
class Myo(): def __init__(self, stream, tty, native, mac): # Instantiate self.myo = MyoRaw(tty, native, mac) self.stream = stream self.recording = False self.recording_type = self.init_recording() # Recording self.emg_file = None self.emg_writer = None # Setup self.setup() def close(self): self.myo.disconnect() self.record(False) def setup(self): # Add handles to process EMG and battery level data self.myo.add_handler(DataCategory.EMG, self.handle_emg) self.myo.add_handler(DataCategory.BATTERY, self.handle_battery) # Subscribe to all data services in full RAW mode (200 Hz) self.myo.subscribe(EMGMode.RAW) # Disable sleep to a void disconnects while retrieving data self.myo.set_sleep_mode(1) # Vibrate to signalise a successful setup # myo.vibrate(1) def run(self): self.myo.run(1) def disconnect(self): self.myo.disconnect() def sleep(self): self.myo.deep_sleep() def handle_emg(self, timestamp, emg, moving, characteristic_num): emg = list(emg) _, ca_data, _ = self.stream.plot(emg, recording=self.recording) record_data = ca_data if len(ca_data) > 0 else emg if self.recording: csv_data = [timestamp] csv_data.extend(record_data) try: self.emg_writer.writerow(csv_data) except AttributeError: print("Error! Unable to write to CSV!") if VERBOSE: print(f"[myo] {self.recording_type}: {timestamp}, {record_data}") def handle_battery(self, timestamp, battery_level): if battery_level < 5: self.myo.set_leds([255, 0, 0], [255, 0, 0]) # red logo, red bar else: self.myo.set_leds([128, 128, 255], [128, 128, 255]) # purple logo, purple bar if VERBOSE: print(f"[myo] battery level: {timestamp}, {battery_level}") def init_recording(self): if self.stream.pca is not None: return "pca" elif self.stream.ica is not None: return "ica" return "raw" def record(self, state=False, toggle=False): if toggle: recording = not self.recording else: recording = state if recording: filename = f"recordings/{self.recording_type}/{time.strftime('%Y%m%d-%H%M%S')}.csv" os.makedirs(os.path.dirname(filename), exist_ok=True) self.emg_file = open(filename, "w", newline="") self.emg_writer = csv.writer(self.emg_file, csv.unix_dialect, quoting=csv.QUOTE_MINIMAL) if self.recording_type == "raw": self.emg_writer.writerow(CSV_HEADER_EMG) else: self.emg_writer.writerow( CSV_HEADER_CA[:self.stream.ca_components + 1]) elif self.emg_file is not None: self.emg_file.close() self.emg_file = None self.emg_writer = None self.recording = recording