diff options
Diffstat (limited to 'src/argaze/utils/tobii_imu_calibrate.py')
-rw-r--r-- | src/argaze/utils/tobii_imu_calibrate.py | 76 |
1 files changed, 58 insertions, 18 deletions
diff --git a/src/argaze/utils/tobii_imu_calibrate.py b/src/argaze/utils/tobii_imu_calibrate.py index 1422e78..369134e 100644 --- a/src/argaze/utils/tobii_imu_calibrate.py +++ b/src/argaze/utils/tobii_imu_calibrate.py @@ -21,6 +21,7 @@ def main(): # manage arguments parser = argparse.ArgumentParser(description=main.__doc__.split('-')[0]) parser.add_argument('-t', '--tobii_ip', metavar='TOBII_IP', type=str, default=None, help='tobii glasses ip') + parser.add_argument('-i', '--imu_calibration', metavar='IMU_CALIB', type=str, default=None, help='json imu calibration filepath') parser.add_argument('-b', '--buffer_size', metavar='BUFFER_SIZE', type=int, default=500, help='number of samples to store into calibration buffer') parser.add_argument('-o', '--output', metavar='OUT', type=str, default='imu.json', help='destination filepath') args = parser.parse_args() @@ -41,6 +42,11 @@ def main(): # Create tobii imu handler tobii_imu = TobiiInertialMeasureUnit.TobiiInertialMeasureUnit() + # Load optional imu calibration file + if args.imu_calibration != None: + + tobii_imu.load_calibration_file(args.imu_calibration) + # Enable tobii data stream tobii_data_stream = tobii_controller.enable_data_stream() @@ -50,28 +56,44 @@ def main(): while True: print('-' * 52) - menu_input = input('Tobii Inertial Measure Unit sensor calibration menu:\n\t\'a\' for accelerometer calibration.\n\t\'g\' for gyroscope calibration.\n\t\'s\' save calibration.\n\t\'q\' quit calibration without saving.\n>') + menu_input = input('Tobii Inertial Measure Unit sensor calibration menu:\n\t\'a\' for accelerometer calibration.\n\t\'g\' for gyroscope calibration.\n\t\'p\' print current calibration.\n\t\'s\' save calibration.\n\t\'q\' quit calibration without saving.\n>') match menu_input: case 'a': - print('\nACCELEROMETER CALIBRATION') - input('Press \'Enter\' to start data acquisition.\n') + axis = ['X', 'Y', 'Z'] + directions = ['upward', 'downward', 'perpendicular'] - # Initialise progress bar - MiscFeatures.printProgressBar(0, args.buffer_size, prefix = 'Data acquisition:', suffix = 'Complete', length = 100) + for i, axis in enumerate(axis): - # Enable accelerometer calibration process listening to incoming Tobii data stream - for progress in tobii_imu.calibrate_gyroscope(tobii_data_stream, args.buffer_size): + print(f'\nACCELEROMETER {axis} AXIS CALIBRATION') - # Update progress Bar - MiscFeatures.printProgressBar(progress, args.buffer_size, prefix = 'Data acquisition:', suffix = 'Complete', length = 100) + axis_buffers = {} - print(f'\n\nGyroscope average over {progress} values for each axis:') - print('\tX offset: ', tobii_imu.get_gyroscope_offset().value[0]) - print('\tY offset: ', tobii_imu.get_gyroscope_offset().value[1]) - print('\tZ offset: ', tobii_imu.get_gyroscope_offset().value[2]) + for j, direction in enumerate(directions): + + input(f'\nKeep Tobii Glasses accelerometer {axis} axis {direction} then press \'Enter\' to start data acquisition.\n') + + # Initialise progress bar + MiscFeatures.printProgressBar(0, args.buffer_size, prefix = 'Data acquisition:', suffix = 'Complete', length = 100) + + # Capture accelerometer data stream + for progress, data_ts_buffer in tobii_data_stream.capture('Accelerometer', args.buffer_size): + + # Update progress Bar + MiscFeatures.printProgressBar(progress, args.buffer_size, prefix = 'Data acquisition:', suffix = 'Complete', length = 100) + + axis_buffers[direction] = data_ts_buffer + + tobii_imu.calibrate_accelerometer_axis_coefficients(i, axis_buffers['upward'], axis_buffers['downward'], axis_buffers['perpendicular']) + + accelerometer_coefficients = tobii_imu.get_accelerometer_coefficients() + + print(f'\n\nAccelerometer optimal linear fit coefficients over {progress} values for each axis:') + print('\tX coefficients: ', accelerometer_coefficients[0]) + print('\tY coefficients: ', accelerometer_coefficients[1]) + print('\tZ coefficients: ', accelerometer_coefficients[2]) case 'g': @@ -81,16 +103,34 @@ def main(): # Initialise progress bar MiscFeatures.printProgressBar(0, args.buffer_size, prefix = 'Data acquisition:', suffix = 'Complete', length = 100) - # Enable gyroscope calibration process listening to incoming Tobii data stream - for progress in tobii_imu.calibrate_gyroscope(tobii_data_stream, args.buffer_size): + # Capture gyroscope data stream + for progress, buffer in tobii_data_stream.capture('Gyroscope', args.buffer_size): # Update progress Bar MiscFeatures.printProgressBar(progress, args.buffer_size, prefix = 'Data acquisition:', suffix = 'Complete', length = 100) + gyroscope_offset = tobii_imu.calibrate_gyroscope_offset(buffer) + print(f'\n\nGyroscope average over {progress} values for each axis:') - print('\tX offset: ', tobii_imu.get_gyroscope_offset().value[0]) - print('\tY offset: ', tobii_imu.get_gyroscope_offset().value[1]) - print('\tZ offset: ', tobii_imu.get_gyroscope_offset().value[2]) + print('\tX offset: ', gyroscope_offset[0]) + print('\tY offset: ', gyroscope_offset[1]) + print('\tZ offset: ', gyroscope_offset[2]) + + case 'p': + + gyroscope_offset = tobii_imu.get_gyroscope_offset() + + print(f'\nGyroscope offset for each axis:') + print('\tX offset: ', gyroscope_offset[0]) + print('\tY offset: ', gyroscope_offset[1]) + print('\tZ offset: ', gyroscope_offset[2]) + + accelerometer_coefficients = tobii_imu.get_accelerometer_coefficients() + + print(f'\nAccelerometer optimal linear fit coefficients for each axis:') + print('\tX coefficients: ', accelerometer_coefficients[0]) + print('\tY coefficients: ', accelerometer_coefficients[1]) + print('\tZ coefficients: ', accelerometer_coefficients[2]) case 's': |