2 This example is more comprehensive than most, as it aims to illustrate 3 how you can put together a complete, ready-to-run script, by combining 4 information from different examples. Note that running this script 5 will produce a small CSV data file in the parent directory. 11 import tobii_research
as tr
17 EYETRACKER_ADDRESS =
"" 21 gaze_data_samples = []
26 if EYETRACKER_ADDRESS:
27 eyetracker = tr.EyeTracker(EYETRACKER_ADDRESS)
29 sys.exit(
"Specified eye tracker not found, please check the address.")
33 all_eyetrackers = tr.find_all_eyetrackers()
34 if not all_eyetrackers:
36 "No connected eye trackers found. Please check the connection " 37 "and/or install any missing drivers with Tobii Pro Eye Tracker Manager." 39 return all_eyetrackers[0]
41 def gaze_data_callback(gaze_data):
46 global gaze_data_samples
47 gaze_data_samples.append(gaze_data)
49 def calibrate(eyetracker):
50 calibration = tr.ScreenBasedCalibration(eyetracker)
53 calibration.enter_calibration_mode()
54 print(
"Entered calibration mode for eye tracker with serial number {0}.".format(eyetracker.serial_number))
58 points_to_calibrate = [(0.5, 0.5), (0.1, 0.1), (0.1, 0.9), (0.9, 0.1), (0.9, 0.9)]
60 for point
in points_to_calibrate:
63 print(
"Show a point on screen at {0}.".format(point))
68 print(
"Collecting data at {0}.".format(point))
69 if calibration.collect_data(point[0], point[1]) != tr.CALIBRATION_STATUS_SUCCESS:
72 calibration.collect_data(point[0], point[1])
74 print(
"Computing and applying calibration.")
75 calibration_result = calibration.compute_and_apply()
76 print(
"Compute and apply returned {0} and collected at {1} points.".
77 format(calibration_result.status, len(calibration_result.calibration_points)))
80 recalibrate_point = (0.1, 0.1)
81 print(
"Removing calibration point at {0}.".format(recalibrate_point))
82 calibration.discard_data(recalibrate_point[0], recalibrate_point[1])
85 print(
"Show a point on screen at {0}.".format(recalibrate_point))
86 calibration.collect_data(recalibrate_point[0], recalibrate_point[1])
89 print(
"Computing and applying calibration.")
90 calibration_result = calibration.compute_and_apply()
91 print(
"Compute and apply returned {0} and collected at {1} points.".
92 format(calibration_result.status, len(calibration_result.calibration_points)))
97 calibration.leave_calibration_mode()
99 print(
"Left calibration mode.")
101 def save_gaze_data(gaze_samples_list):
102 if not gaze_samples_list:
103 print(
"No gaze samples were collected. Skipping saving")
107 print(
"Sample dictionary keys:", gaze_samples_list[0].keys())
110 file_handle = open(
"my_gaze_data.csv",
"w")
111 gaze_writer = csv.writer(file_handle)
112 gaze_writer.writerow([
"time_seconds",
"left_x",
"left_y",
"right_x",
"right_y"])
113 start_time = gaze_samples_list[0][
"system_time_stamp"]
114 for recording_dict
in gaze_samples_list:
115 sample_time_from_start = recording_dict[
"system_time_stamp"] - start_time
117 sample_time_from_start = sample_time_from_start / (10**(6))
120 left_x, left_y = recording_dict[
"left_gaze_point_on_display_area"]
121 right_x, right_y = recording_dict[
"right_gaze_point_on_display_area"]
122 gaze_writer.writerow(
123 [sample_time_from_start, left_x, left_y, right_x, right_y]
128 eyetracker = get_eyetracker()
130 print(
"Subscribing to gaze data for eye tracker with serial number {0}.".format(eyetracker.serial_number))
131 eyetracker.subscribe_to(tr.EYETRACKER_GAZE_DATA, gaze_data_callback, as_dictionary=
True)
132 calibrate(eyetracker)
134 print(
"Unsubscribing from gaze data for eye tracker with serial number {0}.".format(eyetracker.serial_number))
135 eyetracker.unsubscribe_from(tr.EYETRACKER_GAZE_DATA, gaze_data_callback)
137 save_gaze_data(gaze_data_samples)
143 if __name__ ==
"__main__":