Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- def generate_pressure_reading():
- return random.randint(0,1023)
- def generate_euler_angles():
- return [random.uniform(-360,360) for i in range(3)]
- def generate_1_sensor_set():
- '''randomly generates 27x1 array of sensor data in a fixed sensor order.'''
- data = [[generate_pressure_reading()] + # left toe pressure pad
- [generate_pressure_reading()] + # left arch pressure pad
- [generate_pressure_reading()] + # left heel pressure pad
- [generate_pressure_reading()] + # right toe pressure pad
- [generate_pressure_reading()] + # right arch pressure pad
- [generate_pressure_reading()] + # right heel pressure pad
- generate_euler_angles() + # left shoe euler angles
- generate_euler_angles() + # right shoe euler angles
- generate_euler_angles() + # left calf euler angles
- generate_euler_angles() + # right calf euler angles
- generate_euler_angles() + # right thigh euler angles
- generate_euler_angles() + # left thigh euler angles
- generate_euler_angles()] # small of back euler angles
- return data[0] # I used a 1-long list of data so I could comment each line
- def zero_pad(reading, des_len):
- '''takes in a reading and 0-pads it to desired length'''
- reading = str(reading)
- while len(reading) < des_len: # keep adding '0' until it's long enough
- reading = '0' + reading
- return reading
- def pack_pressure_reading(reading):
- '''convert pressure sensor to binary string'''
- if reading > 1000: # cap to 999
- reading = 999
- bin_str = "{0:b}".format(reading)
- reading = zero_pad(bin_str, 10)
- return reading
- def pack_euler_reading(reading):
- '''convert euler sensor to binary string'''
- reading = int(reading*100)
- neg_parity = str(int(reading < 0))
- reading = abs(reading)
- reading = "{0:b}".format(reading)
- reading = zero_pad(reading, 16)
- reading = neg_parity + reading
- return reading
- def encode(data):
- '''convert 27x1 list of sensor readings to binary string'''
- encoded = ''
- for i in range(6):
- encoded += pack_pressure_reading(data[i])
- for i in range(6,27):
- encoded += pack_euler_reading(data[i])
- return encoded
- def unpack_pressure_binary(bin_reading):
- '''convert binary string to pressure reading'''
- unpacked = int(bin_reading,2)
- return unpacked
- def unpack_euler_binary(bin_reading):
- '''convert binary string to euler reading'''
- sign = 1
- if (bin_reading[0] == '1'):
- bin_reading = bin_reading[1:]
- sign = -1
- return sign * int(bin_reading,2)/100.
- def decode(bin_msg):
- '''convert binary string to 27x1 list of sensor readings'''
- decoded = []
- idx = 0
- for i in range(6):
- bin_reading = bin_msg[idx:(idx+10)]
- reading = unpack_pressure_binary(bin_reading)
- decoded.append(reading)
- idx += 10
- for i in range(6,27):
- bin_reading = bin_msg[idx:(idx+17)]
- reading = unpack_euler_binary(bin_reading)
- decoded.append(reading)
- idx += 17
- return decoded
- # Code demonstration
- raw_data = generate_1_sensor_set()
- bin_msg = encode(raw_data)
- decoded = decode(bin_msg)
- # error checking
- for i in range(27):
- print raw_data[i] - decoded[i]
Add Comment
Please, Sign In to add comment