Guest User

Untitled

a guest
Apr 25th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. import random
  2.  
  3. def generate_pressure_reading():
  4. return random.randint(0,1023)
  5.  
  6. def generate_euler_angles():
  7. return [random.uniform(-360,360) for i in range(3)]
  8.  
  9. def generate_1_sensor_set():
  10. '''randomly generates 27x1 array of sensor data in a fixed sensor order.'''
  11. data = [[generate_pressure_reading()] + # left toe pressure pad
  12. [generate_pressure_reading()] + # left arch pressure pad
  13. [generate_pressure_reading()] + # left heel pressure pad
  14. [generate_pressure_reading()] + # right toe pressure pad
  15. [generate_pressure_reading()] + # right arch pressure pad
  16. [generate_pressure_reading()] + # right heel pressure pad
  17. generate_euler_angles() + # left shoe euler angles
  18. generate_euler_angles() + # right shoe euler angles
  19. generate_euler_angles() + # left calf euler angles
  20. generate_euler_angles() + # right calf euler angles
  21. generate_euler_angles() + # right thigh euler angles
  22. generate_euler_angles() + # left thigh euler angles
  23. generate_euler_angles()] # small of back euler angles
  24.  
  25. return data[0] # I used a 1-long list of data so I could comment each line
  26.  
  27.  
  28. def zero_pad(reading, des_len):
  29. '''takes in a reading and 0-pads it to desired length'''
  30. reading = str(reading)
  31. while len(reading) < des_len: # keep adding '0' until it's long enough
  32. reading = '0' + reading
  33.  
  34. return reading
  35.  
  36.  
  37. def pack_pressure_reading(reading):
  38. '''convert pressure sensor to binary string'''
  39. if reading > 1000: # cap to 999
  40. reading = 999
  41. bin_str = "{0:b}".format(reading)
  42. reading = zero_pad(bin_str, 10)
  43.  
  44. return reading
  45.  
  46.  
  47. def pack_euler_reading(reading):
  48. '''convert euler sensor to binary string'''
  49. reading = int(reading*100)
  50. neg_parity = str(int(reading < 0))
  51. reading = abs(reading)
  52.  
  53. reading = "{0:b}".format(reading)
  54. reading = zero_pad(reading, 16)
  55. reading = neg_parity + reading
  56.  
  57. return reading
  58.  
  59.  
  60. def encode(data):
  61. '''convert 27x1 list of sensor readings to binary string'''
  62. encoded = ''
  63. for i in range(6):
  64. encoded += pack_pressure_reading(data[i])
  65.  
  66. for i in range(6,27):
  67. encoded += pack_euler_reading(data[i])
  68.  
  69. return encoded
  70.  
  71. def unpack_pressure_binary(bin_reading):
  72. '''convert binary string to pressure reading'''
  73. unpacked = int(bin_reading,2)
  74. return unpacked
  75.  
  76. def unpack_euler_binary(bin_reading):
  77. '''convert binary string to euler reading'''
  78. sign = 1
  79. if (bin_reading[0] == '1'):
  80. bin_reading = bin_reading[1:]
  81. sign = -1
  82.  
  83. return sign * int(bin_reading,2)/100.
  84.  
  85.  
  86. def decode(bin_msg):
  87. '''convert binary string to 27x1 list of sensor readings'''
  88. decoded = []
  89.  
  90. idx = 0
  91. for i in range(6):
  92. bin_reading = bin_msg[idx:(idx+10)]
  93. reading = unpack_pressure_binary(bin_reading)
  94. decoded.append(reading)
  95.  
  96. idx += 10
  97.  
  98. for i in range(6,27):
  99. bin_reading = bin_msg[idx:(idx+17)]
  100. reading = unpack_euler_binary(bin_reading)
  101. decoded.append(reading)
  102.  
  103. idx += 17
  104.  
  105. return decoded
  106.  
  107.  
  108. # Code demonstration
  109. raw_data = generate_1_sensor_set()
  110. bin_msg = encode(raw_data)
  111. decoded = decode(bin_msg)
  112.  
  113. # error checking
  114. for i in range(27):
  115. print raw_data[i] - decoded[i]
Add Comment
Please, Sign In to add comment