Esempio n. 1
0
    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:
Esempio n. 2
0
    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:
Esempio n. 3
0
File: emg.py Progetto: qtux/myo-raw
    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)
Esempio n. 4
0
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