def setup(self): libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 7.5, 7.5, 0, 6000) sleep(1.5) e = Event() def processor_created(context, pointer): self.processor = pointer e.set() fn_wrapper = cbindings.FnVoid_VoidP_VoidP(processor_created) acc = libmetawear.mbl_mw_acc_get_acceleration_data_signal( self.device.board) gyro = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal( self.device.board) signals = (c_void_p * 1)() signals[0] = gyro libmetawear.mbl_mw_dataprocessor_fuser_create(acc, signals, 1, None, fn_wrapper) e.wait() libmetawear.mbl_mw_datasignal_subscribe(self.processor, None, self.callback)
def start(self): if self.device == None: self.log("ERROR", "Device not available") return False dev_board = self.device.board self.log("INFO", "Configuring device") lmw.mbl_mw_settings_set_connection_parameters(dev_board, 7.5, 7.5, 0, 6000) time.sleep(1.5) # Subscribe to accelerometer data acc = lmw.mbl_mw_acc_get_acceleration_data_signal(dev_board) lmw.mbl_mw_datasignal_subscribe(acc, None, self.callback_acc) # Subscribe to gyro data gyro = lmw.mbl_mw_gyro_bmi160_get_rotation_data_signal(dev_board) lmw.mbl_mw_datasignal_subscribe(gyro, None, self.callback_gyr) self.log("INFO", "Starting device...") # Enable accelerometer sampling lmw.mbl_mw_acc_enable_acceleration_sampling(dev_board) lmw.mbl_mw_acc_start(dev_board) # Enable gyrp sampling lmw.mbl_mw_gyro_bmi160_enable_rotation_sampling(dev_board) lmw.mbl_mw_gyro_bmi160_start(dev_board) self.log("INFO", "Device started.") return True
def setup(self): # setup ble libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 7.5, 7.5, 0, 6000) sleep(1.5) # setup event e = Event() # processor callback fxn def processor_created(context, pointer): self.processor = pointer e.set() fn_wrapper = cbindings.FnVoid_VoidP_VoidP(processor_created) # get acc signal acc = libmetawear.mbl_mw_acc_get_acceleration_data_signal( self.device.board) # create acc averager (averages 4 consecutive acc data entriess) libmetawear.mbl_mw_dataprocessor_average_create( acc, 4, None, fn_wrapper) # wait for averager to be created e.wait() # subscribe to signal libmetawear.mbl_mw_datasignal_subscribe(self.processor, None, self.callback)
def setup(self): libmetawear.mbl_mw_settings_set_connection_parameters(self.device.board, 7.5, 7.5, 0, 600) sleep(1.5) e = Event() def processor_created(context, pointer): self.processor = pointer e.set() fn_wrapper = cbindings.FnVoid_VoidP_VoidP(processor_created) # set accelerometer to 100Hz sampling rate and range to +/- 16 g's libmetawear.mbl_mw_acc_set_odr(s.device.board, 100.0) libmetawear.mbl_mw_acc_set_range(s.device.board, 16.0) libmetawear.mbl_mw_acc_write_acceleration_config(s.device.board) # set gyro to 100Hz sampling rate and +/- 1000 deg/sec. libmetawear.mbl_mw_gyro_bmi160_set_odr(s.device.board, MBL_MW_GYRO_BMI160_ODR_100Hz) libmetawear.mbl_mw_gyro_bmi160_set_range(s.device.board, MBL_MW_GYRO_BMI160_RANGE_1000dps) libmetawear.mbl_mw_gyro_bmi160_write_config(s.device.board) acc = libmetawear.mbl_mw_acc_get_acceleration_data_signal(self.device.board) gyro = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal(self.device.board) signals = (c_void_p * 1)() signals[0] = gyro # libmetawear.mbl_mw_dataprocessor_accounter_create(signals, None, fn_wrapper) fuser = create_voidp(lambda fn: libmetawear.mbl_mw_dataprocessor_fuser_create(acc, signals, 1, None, fn), resource = "fuser", event = e) accounter = create_voidp(lambda fn: libmetawear.mbl_mw_dataprocessor_accounter_create(fuser, None, fn), resource = "accounter", event = e) # libmetawear.mbl_mw_datasignal_subscribe(self.processor, None, self.callback) libmetawear.mbl_mw_datasignal_subscribe(accounter, None, self.callback)
def btn_start_shot_click(self): self.mw_states = [] self.xyz_shots = [] for device in self.mw_devices: # try: # device.connect() # except: # print 'connection to %s failed (the device might be already connected)' % device.address self.mw_states.append( MetaWearState(device, self.mw_positions[device.address], self)) for s in self.mw_states: libmetawear.mbl_mw_settings_set_connection_parameters( s.device.board, 7.5, 7.5, 0, 6000) sleep(1.5) libmetawear.mbl_mw_acc_set_odr(s.device.board, 100.0) libmetawear.mbl_mw_acc_set_range(s.device.board, 16.0) libmetawear.mbl_mw_acc_write_acceleration_config(s.device.board) signal = libmetawear.mbl_mw_acc_get_acceleration_data_signal( s.device.board) libmetawear.mbl_mw_datasignal_subscribe(signal, None, s.callback) libmetawear.mbl_mw_acc_enable_acceleration_sampling(s.device.board) libmetawear.mbl_mw_acc_start(s.device.board) # t = Timer(15, self.time_elapsed) # t.start() print 'shot has started' return
def setup(self): # ble settings libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 7.5, 7.5, 0, 6000) sleep(1.5) # events e = Event() # processor callback fxn def processor_created(context, pointer): self.processor = pointer e.set() # processor fxn ptr fn_wrapper = cbindings.FnVoid_VoidP_VoidP(processor_created) # get acc signal acc = libmetawear.mbl_mw_acc_get_acceleration_data_signal( self.device.board) # get gyro signal - MMRl, MMR, MMc ONLY #gyro = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal(self.device.board) # get gyro signal - MMRS ONLY gyro = libmetawear.mbl_mw_gyro_bmi270_get_rotation_data_signal( self.device.board) # create signals variable signals = (c_void_p * 1)() signals[0] = gyro # create acc + gyro signal fuser libmetawear.mbl_mw_dataprocessor_fuser_create(acc, signals, 1, None, fn_wrapper) # wait for fuser to be created e.wait() # subscribe to the fused signal libmetawear.mbl_mw_datasignal_subscribe(self.processor, None, self.callback)
def setup(self): # set BLE connection params (min connect interval, max interval, # latency, timeout) all in milliseconds libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 7.5, 7.5, 0, 6000) # set BLE advertising strength (higher strength = higher power consumption # but theoretically better connectivity) libmetawear.mbl_mw_settings_set_tx_power(self.device.board, 4) sleep(1.5) e = Event() def processor_created(context, pointer): self.processor = pointer e.set() fn_wrapper = metacbindings.FnVoid_VoidP_VoidP(processor_created) # set accelerometer to 100Hz sampling rate and range to +/- 16 g's libmetawear.mbl_mw_acc_set_odr(s.device.board, 100.0) libmetawear.mbl_mw_acc_set_range(s.device.board, 16.0) libmetawear.mbl_mw_acc_write_acceleration_config(s.device.board) # set gyro to 100Hz sampling rate and +/- 1000 deg/sec. libmetawear.mbl_mw_gyro_bmi160_set_odr(s.device.board, MBL_MW_GYRO_BMI160_ODR_100Hz) libmetawear.mbl_mw_gyro_bmi160_set_range( s.device.board, MBL_MW_GYRO_BMI160_RANGE_1000dps) libmetawear.mbl_mw_gyro_bmi160_write_config(s.device.board) # get pointers referencing the acc and gyro data signals acc = libmetawear.mbl_mw_acc_get_acceleration_data_signal( self.device.board) gyro = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal( self.device.board) signals = (c_void_p * 1)() signals[0] = gyro # //libmetawear.mbl_mw_dataprocessor_accounter_create(signals, None, fn_wrapper) # chain two processors together (fuser and accounter) to get timestamped acc+gyro data # create a fuser "data processor" which packages the acc and gyro signals into same packets before sending fuser = create_voidp( lambda fn: libmetawear.mbl_mw_dataprocessor_fuser_create( acc, signals, 1, None, fn), resource="fuser", event=e) # accounter processor adds correct epoch data to BLE packets, necessary for timestamping stream-mode data accounter = create_voidp( lambda fn: libmetawear.mbl_mw_dataprocessor_accounter_create( fuser, None, fn), resource="accounter", event=e) # //libmetawear.mbl_mw_datasignal_subscribe(self.processor, None, self.callback) libmetawear.mbl_mw_datasignal_subscribe(accounter, None, self.callback)
def init_device(self, device): print(f"Configuring device: {device.device.address}") # reset(device.device) libmetawear.mbl_mw_settings_set_connection_parameters( device.device.board, 7.5, 7.5, 0, 6000) sleep(1.5) libmetawear.mbl_mw_acc_set_odr(device.device.board, 25.0) libmetawear.mbl_mw_acc_set_range(device.device.board, 8.0) libmetawear.mbl_mw_acc_write_acceleration_config(device.device.board)
def setup(self): #Set up file self.file.write( "Time, Time from start (s), Acc x, Acc y, Acc z, Gyro x, Gyro y, Gyro z, Mag x, Mag y, Mag z \n" ) #Set up board libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 7.5, 7.5, 0, 6000) #Acceleration sampling frequency libmetawear.mbl_mw_acc_set_odr(s.device.board, 100.0) #fastest frequency is 400 Hz #range of acceleration libmetawear.mbl_mw_acc_set_range(s.device.board, 16.0) #write acceleration config libmetawear.mbl_mw_acc_write_acceleration_config(s.device.board) #Gyro sampling frequency libmetawear.mbl_mw_gyro_bmi160_set_odr(self.device.board, 8) #9 = 200Hz, 8 = 100Hz #Gyro range libmetawear.mbl_mw_gyro_bmi160_set_range( self.device.board, 0) #0 = 2000 dps, 1 = 1000 dps #Write gyro config libmetawear.mbl_mw_gyro_bmi160_write_config(self.device.board) libmetawear.mbl_mw_mag_bmm150_set_preset(self.device.board, 3) sleep(1.5) e = Event() def processor_created(context, pointer): self.processor = pointer e.set() fn_wrapper = cbindings.FnVoid_VoidP_VoidP(processor_created) acc = libmetawear.mbl_mw_acc_get_acceleration_data_signal( self.device.board) gyro = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal( self.device.board) mag = libmetawear.mbl_mw_mag_bmm150_get_b_field_data_signal( self.device.board) signals = (c_void_p * 2)() signals[0] = gyro signals[1] = mag libmetawear.mbl_mw_dataprocessor_fuser_create(acc, signals, 2, None, fn_wrapper) e.wait() libmetawear.mbl_mw_datasignal_subscribe(self.processor, None, self.callback)
def setup(self): # s represents a device's MAC address for s in self.states: # Device configuration print("Configuring device...") # Not sure what these parameters are for, but they're synchronized with the rest of the settings. libmetawear.mbl_mw_settings_set_connection_parameters( s.device.board, 7.5, 7.5, 0, 6000) # Acceleration libmetawear.mbl_mw_acc_set_odr(s.device.board, 25.0) # 25 Hz data collection rate libmetawear.mbl_mw_acc_set_range(s.device.board, 16.0) # Unsure libmetawear.mbl_mw_acc_write_acceleration_config( s.device.board) # Save to the board's configuration signal_acceleration = libmetawear.mbl_mw_acc_get_acceleration_data_signal( s.device.board) libmetawear.mbl_mw_datasignal_subscribe(signal_acceleration, s.callback_accel) libmetawear.mbl_mw_acc_enable_acceleration_sampling(s.device.board) # Gyrometer libmetawear.mbl_mw_gyro_bmi160_set_odr(s.device.board, 6) # 6 is index for 25 Hz libmetawear.mbl_mw_gyro_bmi160_write_config(s.device.board) signal_gyro = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal( s.device.board) libmetawear.mbl_mw_datasignal_subscribe(signal_gyro, s.callback_gyro) libmetawear.mbl_mw_gyro_bmi160_enable_rotation_sampling( s.device.board) # Magnometer libmetawear.mbl_mw_mag_bmm150_configure(s.device.board, 1, 1, 6) # 6 is index for 25 Hz signal_mag = libmetawear.mbl_mw_mag_bmm150_get_b_field_data_signal( s.device.board) libmetawear.mbl_mw_datasignal_subscribe(signal_mag, s.callback_mag) # Run LED - Stays green until IMUs / system starts with a pulse pattern = LedPattern(repeat_count=Const.LED_REPEAT_INDEFINITELY) libmetawear.mbl_mw_led_load_preset_pattern(byref(pattern), LedPreset.SOLID) libmetawear.mbl_mw_led_write_pattern(s.device.board, byref(pattern), LedColor.GREEN) libmetawear.mbl_mw_led_play(s.device.board) return
def setDevice(mmr): libmetawear.mbl_mw_settings_set_connection_parameters( mmr.device.board, 7.5, 7.5, 0, 6000) sleep(1.5) # Get the signal from i2c communication # (device.board address, the size of data(byte), id : Numerical value identifying the data) mmr.i2c_signal = libmetawear.mbl_mw_i2c_get_data_signal( mmr.device.board, 3, 0xa) # Get the signal from Acceleration acc_signal = libmetawear.mbl_mw_acc_get_acceleration_data_signal( mmr.device.board) # get the signal from Gyro gyro_signal = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal( mmr.device.board) # Subscribe the i2c signal # (i2c signal value, context(Pointer to additional data for the call back function # , Callback function to handle data received from the signal)) libmetawear.mbl_mw_datasignal_subscribe(mmr.i2c_signal, None, mmr.callback_i2c) # Subscribe the acc acc_signal # libmetawear.mbl_mw_datasignal_subscribe(acc_signal, None, mmr.callback_acc) # Subscribe the gyro gyro acc_signal # libmetawear.mbl_mw_datasignal_subscribe(gyro_signal, None, mmr.callback_gyro) # device_addr = 7bit(the slave device address) + 1bit(W : 0 / R : 1) # Parameter : (device address, register address : CAP DATA REGISTER(0x01)) # libmetawear.mbl_mw_i2c_write(mmr.device.board, AD7745_ADDR_WRITE, RESET_ADDR, value, 1) # Setup the configuration for I2C Communication libmetawear.mbl_mw_i2c_write(mmr.device.board, AD7745_ADDR, REG_CAP_SETUP, c_uint8(CAP_SETUP_PROP), 1) sleep(0.5) libmetawear.mbl_mw_i2c_write(mmr.device.board, AD7745_ADDR, REG_EXC_SETUP, c_uint8(EXC_SETUP_PROP), 1) sleep(0.5) libmetawear.mbl_mw_i2c_write(mmr.device.board, AD7745_ADDR, REG_CONFIGURATION, c_uint8(CONFIGURATION_PROP), 1) sleep(0.5) libmetawear.mbl_mw_i2c_write(mmr.device.board, AD7745_ADDR, REG_CAP_DAC_A, c_uint8(CAP_DAC_A_PROP), 1) sleep(0.5)
def setup(self): libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 7.5, 7.5, 0, 6000) sleep(1.5) e = Event() def processor_created(context, pointer): self.processor = pointer e.set() fn_wrapper = cbindings.FnVoid_VoidP_VoidP(processor_created) acc = libmetawear.mbl_mw_acc_get_acceleration_data_signal( self.device.board) libmetawear.mbl_mw_dataprocessor_average_create( acc, 4, None, fn_wrapper) e.wait() libmetawear.mbl_mw_datasignal_subscribe(self.processor, None, self.callback)
def download_data(self, name='blank'): try: libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 7.5, 7.5, 0, 6000) time.sleep(1.0) e = Event() def progress_update_handler(context, entries_left, total_entries): if (entries_left == 0): e.set() fn_wrapper = FnVoid_VoidP_UInt_UInt(progress_update_handler) download_handler = LogDownloadHandler(context = None, \ received_progress_update = fn_wrapper, \ received_unknown_entry = cast(None, FnVoid_VoidP_UByte_Long_UByteP_UByte), \ received_unhandled_entry = cast(None, FnVoid_VoidP_DataP)) # print('Opening log file to write') f = open(name + self.default_name, 'a') callback = FnVoid_VoidP_DataP(lambda ctx, p: print( "{epoch: %d, value: %s}" % (p.contents.epoch, parse_value(p)), file=f)) libmetawear.mbl_mw_logger_subscribe(self.logger, None, callback) libmetawear.mbl_mw_logging_download(self.device.board, 0, byref(download_handler)) e.wait() # close the file, process the data into a csv, then delete the original file f.close() self.process_data(name) # os.remove(name + self.default_name) logging.info('data downloaded') return 1 except RuntimeError as err: print(err) logging.info('runtime error in download_data() occurred') return 0
import platform import sys device = MetaWear('FB:81:71:31:92:7A') device.connect() # Callback function to process/parse the battery data def data_handler(self, ctx, data): print("%s -> %s" % (self.device.address, parse_value(data))) callback = FnVoid_VoidP_DataP(data_handler) print("Configuring device") libmetawear.mbl_mw_settings_set_connection_parameters(device.board, 7.5, 7.5, 0, 6000) battery_signal = libmetawear.mbl_mw_settings_get_battery_state_data_signal( device.board) libmetawear.mbl_mw_datasignal_subscribe(battery_signal, None, callback) sleep(1.0) libmetawear.mbl_mw_datasignal_read(battery_signal) sleep(5.0) libmetawear.mbl_mw_datasignal_unsubscribe(battery_signal) libmetawear.mbl_mw_debug_disconnect(device.board) device.on_disconnect = lambda status: print("we are disconnected!")
def __init__(self, mac_adr): # Create publisher self.frame_id = rospy.get_name().split('/')[-1] self.pub_rotation = rospy.Publisher(self.frame_id + '/rotation', QuaternionStamped, queue_size=10) self.pub_accel = rospy.Publisher(self.frame_id + '/accel', Vector3Stamped, queue_size=10) self.pub_gyro = rospy.Publisher(self.frame_id + '/gyro', Vector3Stamped, queue_size=10) self.pub_g = rospy.Publisher(self.frame_id + '/gravity', Vector3Stamped, queue_size=10) self.pub_acc_lin = rospy.Publisher(self.frame_id + '/lin_acc', Vector3Stamped, queue_size=10) d = MetaWear(mac_adr) d.connect() print("Connected to " + d.address) self.device = d self.samples_acc = 0 self.samples_rot = 0 self.samples_gyro = 0 self.cb_gyro_cpp = FnVoid_VoidP_DataP(self.gyro_cb) self.cb_acc_cpp = FnVoid_VoidP_DataP(self.acc_cb) self.cb_rot_cpp = FnVoid_VoidP_DataP(self.rot_cb) self.cb_g_cpp = FnVoid_VoidP_DataP(self.g_cb) self.cb_acc_lin_cpp = FnVoid_VoidP_DataP(self.acc_lin_cb) print("Configuring device") libmetawear.mbl_mw_settings_set_connection_parameters( self.device.board, 10, 20, 0, 6000) print("Sensor Fusion") libmetawear.mbl_mw_sensor_fusion_set_mode(self.device.board, SensorFusionMode.IMU_PLUS) libmetawear.mbl_mw_sensor_fusion_set_acc_range( self.device.board, SensorFusionAccRange._8G) libmetawear.mbl_mw_sensor_fusion_write_config(self.device.board) rospy.sleep(1) #self.gyro_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal(self.device.board, SensorFusionData.CORRECTED_GYRO) #self.acc_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal(self.device.board, SensorFusionData.CORRECTED_ACC) self.rot_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal( self.device.board, SensorFusionData.QUATERNION) #self.g_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal(self.device.board, SensorFusionData.GRAVITY_VECTOR) #self.acc_lin_signal = libmetawear.mbl_mw_sensor_fusion_get_data_signal(self.device.board, SensorFusionData.LINEAR_ACC) rospy.sleep(1) #libmetawear.mbl_mw_datasignal_subscribe(self.gyro_signal, None, self.cb_gyro_cpp) #libmetawear.mbl_mw_datasignal_subscribe(self.acc_signal, None, self.cb_acc_cpp) libmetawear.mbl_mw_datasignal_subscribe(self.rot_signal, None, self.cb_rot_cpp) #libmetawear.mbl_mw_datasignal_subscribe(self.g_signal, None, self.cb_g_cpp) #libmetawear.mbl_mw_datasignal_subscribe(self.acc_lin_signal, None, self.cb_acc_lin_cpp) rospy.sleep(1) #libmetawear.mbl_mw_sensor_fusion_enable_data(self.device.board, SensorFusionData.CORRECTED_GYRO) #libmetawear.mbl_mw_sensor_fusion_enable_data(self.device.board, SensorFusionData.CORRECTED_ACC) libmetawear.mbl_mw_sensor_fusion_enable_data( self.device.board, SensorFusionData.QUATERNION) #libmetawear.mbl_mw_sensor_fusion_enable_data(self.device.board, SensorFusionData.GRAVITY_VECTOR) #libmetawear.mbl_mw_sensor_fusion_enable_data(self.device.board, SensorFusionData.LINEAR_ACC) rospy.sleep(1) libmetawear.mbl_mw_sensor_fusion_start(self.device.board)