Titta is a toolbox for using eye trackers from Tobii with Python, specifically offering integration with PsychoPy.
Project description
Titta is a toolbox for using eye trackers from Tobii Pro AB with Python, specifically offering integration with PsychoPy. A Matlab version that integrates with PsychToolbox is also available from https://github.com/dcnieho/Titta. For a similar toolbox for SMI eye trackers, please see www.github.com/marcus-nystrom/SMITE.
Titta is an alternative to using the eye tracking functionality already available in PsychoPy (through ioHub), but instead of a general interface to many eye trackers, it is specifically designed to offer full access to the Tobii Pro SDK, has an intuitive calibration interface, and includes scripts for analysis of eye-tracking data.
For questions, bug reports or to check for updates, please visit https://github.com/marcus-nystrom/Titta.
To minimize the risk of missing samples, the current repository uses TittaPy (pip install TittaPy
), a C++ wrapper around the Tobii SDK, to pull samples made available from the eye tracker.
To get started
pip install titta
or
python -m pip install titta
Then run read_me.py
from the 'demos' folder (first change the monitor settings and the eye tracker name in read_me.py
).
To get started with the Tobii Pro Lab integration
- Open read_read_me_TalkToProLab.py in PsychoPy.
- Download Tobii Pro Lab
- Open a new External Presenter Project in Pro Lab. The Project name must be the same as the project name in read_read_me_TalkToProLab.py.
- In PsychoPy, run read_read_me_TalkToProLab.py (first change the monitor settings and the eye tracker name).
Tested on Windows 10 using PsychoPy 2022.1.3 using Python 3.8. Ideally, make sure that the eye tracker is detected and works in the Tobii Eye Tracker Manager before trying to use it with Titta.
Contents
The toolbox consists of two main parts:
The Titta.Connect
and Tobii.MyTobii
classes
The Titta module (which utilizes the Tobii module) is the main workhorse of this toolbox, providing a wrapper around the Tobii Pro SDK, and a convenient graphical user interface (rendered through PsychoPy) for participant setup, calibration and validation. Only the Titta.calibrate()
participant setup and calibration interface requires PsychoPy.
These modules connect to Tobii via TittaPy
. Although TittaPy
is located in a separate repository, documentation for it is included here since it is powering the Titta
and Tobii
modules here.
The TalkToProLab
class
The TalkToProLab
class provides an implementation of Tobii Pro Lab's External Presenter interface, allowing experiments to be created and run from Python with PsychoPy or other presentation methods, while recording, project management, recording playback/visualization and analysis can be performed in Tobii Pro Lab.
Usage
As demonstrated in the demo scripts, the toolbox is configured through the following interface:
-
Retrieve (default) settings for eye tracker of interest:
settings = Titta.getDefaults('tracker model name');
Supported eye trackers and their corresponding model names in the Tobii Pro SDK/Titta are:Eye tracker Model name Tobii Pro Spectrum Tobii Pro Spectrum
Tobii Pro Fusion Tobii Pro Fusion
Tobii Pro TX300 Tobii TX300
Tobii Pro T60 XL Tobii T60 XL
Tobii Pro Nano Tobii Pro Nano
Tobii Pro Spark Tobii Pro Spark
Tobii Pro X3-120 Tobii Pro X3-120
orTobii Pro X3-120 EPU
Tobii Pro X2-60 X2-60_Compact
Tobii Pro X2-30 X2-30_Compact
Tobii Pro X60 Tobii X60
Tobii Pro X120 Tobii X120
Tobii Pro T60 Tobii T60
Tobii Pro T120 Tobii T120
Tobii 4C (Upgrade Key required) IS4_Large_Peripheral
Eye trackers marked in bold font have been tested. Note that the VR eye trackers are not supported by Titta. Also note that the Tobii 4C cannot be used for research purposes without buying the Pro Upgrade Key, and is compatible with Titta only after this purchase. Unfortunately, the Pro Upgrade Key is no longer sold by Tobii.
-
Change settings from their defaults if wanted.
-
Create a Titta instance using this settings struct:
tracker = Titta(settings);
-
Interact with the eye tracker using the Titta API.
-
When calling
Titta.calibrate()
, a participant setup and calibration interface is shown. For each screen, several keyboard hotkeys are available to activate certain functionality. By default, the hotkey for each button is printed in the button's label.
API
Titta
module
Module-level methods
The below method can be called on the Titta module directly.
Call | Inputs | Outputs | Description |
---|---|---|---|
get_defaults() |
|
|
Gets all supported settings with defaulted values for the indicated eyeTracker, can be modified and used for constructing an instance of Titta. See the supported options section below. |
Construction
An instance of Titta.Connect is constructed by calling Titta.Connect()
with either the name of a specific supported eye tracker model (in which case default settings for this model will be used) or with a settings struct retrieved from Titta.get_defaults()
, possibly with changed settings (passing the settings object unchanged is equivalent to using the eye tracker model name as input argument).
Methods
The following method calls are available on a Titta.Connect
instance:
Call | Inputs | Outputs | Description |
---|---|---|---|
init() |
|
Connect to the Tobii eye tracker and initialize it according to the requested settings |
Supported options
The get_defaults()
method call returns the appropriate set of options for the indicated eye tracker.
Option name | Explanation |
---|---|
settings.SAMPLING_RATE |
Sampling frequency |
Tobii
module
Methods
The following methods are available for an instance of Tobii.MyTobii
(and, by extension, Titta.Connect
).
Call | Inputs | Outputs | Description |
---|---|---|---|
init() |
|
Connect to the Tobii eye tracker and initialize it according to the requested settings | |
calibrate() |
|
Do participant setup, calibration and validation. | |
start_recording() |
|
Begin recording the specified kind of data. If none of the input parameters are set to true, then this method does nothing. | |
stop_recording() |
|
Stop recording the specified kind of data. If none of the input parameters are set to true, then this method does nothing. | |
send_message() |
|
Store timestamped message | |
save_data() |
|
Save data to HDF5 container at specified location | |
calibration_history() |
|
Get the calibration history thus far. | |
system_info() |
A dictionary containing all the information included in TittaPy 's properties, plus python_version , psychopy_version , TittaPy_version , and titta_version . |
Get information about the system and connected eye tracker. | |
get_system_time_stamp() |
|
Get the current system time through the Tobii Pro SDK. | |
set_sample_rate() |
|
Set the sampling rate of the connected eye tracker (if it is a supported frequency). | |
get_sample_rate() |
|
Get the sampling rate of the connected eye tracker. |
TittaPy
class
These methods can be accessed via Tobii.MyTobii
, which itself can be accessed via Titta.Connect
.
Module-level methods
Call | Inputs | Outputs | Description |
---|---|---|---|
get_SDK_version |
|
Get the version of the Tobii Pro SDK dynamic library that is used by TittaPy . |
|
get_system_timestamp |
|
Get the current system time through the Tobii Pro SDK. | |
find_all_eye_trackers() |
|
Gets the eye trackers that are connected to the system, as listed by the Tobii Pro SDK. | |
start_logging() |
|
|
Start listening to the eye tracker's log stream, store any events to buffer. |
get_log() |
|
|
Return and (optionally) remove log events from the buffer. |
stop_logging() |
Stop listening to the eye tracker's log stream. |
Construction and initialization
An instance of TittaPy is constructed by calling TittaPy.EyeTracker()
. Before it becomes fully functional, its init()
method should be called to provide it with the address of an eye tracker to connect to. A list of connected eye trackers is provided by calling the static function TittaPy.find_all_eye_trackers()
.
Methods
The following method calls are available on a TittaPy.EyeTracker
instance:
Call | Inputs | Outputs | Description |
---|---|---|---|
init() |
|
Connect to the TittaPy class instance to the Tobii eye tracker and prepare it for use. | |
apply_licenses() |
|
|
Apply license(s) to the connected eye tracker. |
clear_licenses() |
Clear all licenses that may have been applied to the connected eye tracker. Refreshes the eye tracker's info, so use getConnectedEyeTracker() to check for any updated capabilities. |
||
has_stream() |
|
|
Check whether the connected eye tracker supports providing a data stream of a specified type. |
set_include_eye_openness_in_gaze() |
|
|
Set whether calls to start or stop the gaze stream should also start or stop the eye openness stream. An error will be raised if set to true, but the connected eye tracker does not provide an eye openness stream. If set to true, calls to start or stop the eyeOpenness stream will also start or stop the gaze stream. |
start() |
|
|
Start streaming data of a specified type to buffer. The default initial buffer size should cover about 30 minutes of recording gaze data at 600Hz, and longer for the other streams. Growth of the buffer should cause no performance impact at all as it happens on a separate thread. To be certain, you can indicate a buffer size that is sufficient for the number of samples that you expect to record. Note that all buffers are fully in-memory. As such, ensure that the computer has enough memory to satify your needs, or you risk a recording-destroying crash. |
is_recording() |
|
|
Check if data of a specified type is being streamed to buffer. |
consume_N() |
|
|
Return and remove data of the specified type from the buffer. |
consume_time_range() |
|
|
Return and remove data of the specified type from the buffer. |
peek_N() |
|
|
Return but do not remove data of the specified type from the buffer. |
peek_time_range() |
|
|
Return but do not remove data of the specified type from the buffer. |
clear() |
|
Clear the buffer for data of the specified type. | |
clear_time_range() |
|
Clear data of the specified type within specified time range from the buffer. | |
stop() |
|
|
Stop streaming data of a specified type to buffer. |
enter_calibration_mode() |
|
|
Queue request for the tracker to enter into calibration mode. |
is_in_calibration_mode() |
|
|
Check whether eye tracker is in calibration mode. |
leave_calibration_mode() |
|
|
Queue request for the tracker to leave the calibration mode. |
calibration_collect_data() |
|
Queue request for the tracker to collect gaze data for a single calibration point. | |
calibration_discard_data() |
|
Queue request for the tracker to discard any already collected gaze data for a single calibration point. | |
calibration_compute_and_apply() |
Queue request for the tracker to compute the calibration function and start using it. | ||
calibration_get_data() |
Request retrieval of the computed calibration as an (uninterpretable) binary stream. | ||
calibration_apply_data() |
|
Apply the provided calibration data. | |
calibration_get_status() |
|
Get the current state of TittaPy's calibration mechanism. | |
calibration_retrieve_result() |
|
Get information about tasks completed by TittaPy's calibration mechanism. |
Properties
The following read-only properties are available for a TittaPy.EyeTracker
instance:
Property | Description |
---|---|
info |
Get connected eye tracker's basic stats. |
serial_number |
Get connected eye tracker's serial number. |
model |
Get connected eye tracker's model name. |
firmware_version |
Get connected eye tracker's firmware version. |
runtime_version |
Get connected eye tracker's runtime version. |
address |
Get connected eye tracker's address. |
capabilities |
Get connected eye tracker's exposed capabilities. |
supported_frequencies |
Get connected eye tracker's supported sampling frequencies. |
supported_modes |
Get connected eye tracker's supported tracking modes. |
track_box |
Get connected eye tracker's track box. |
display_area |
Get connected eye tracker's display area. |
The following settable properties are available for a TittaPy.EyeTracker
instance:
Property | Description |
---|---|
device_name |
Get or set connected eye tracker's device name. |
frequency |
Get or set connected eye tracker's sampling frequency. |
tracking_mode |
Get or set connected eye tracker's tracking mode. |
TalkToProLab
class
Construction
An instance of TalkToProLab is constructed by calling TalkToProLab()
and optionally providing two constructor arguments:
project_name
: (optional) the name of the External Presenter project that should be opened in Pro Labdummy_mode
: (optional) a bool indicating whether to run in dummy mode. Default: false.
Methods
The following method calls are available on a TalkToProLab instance. The majority of return types are the response
dictionary, containing the operation name, the status code, and however many useful variables relevant to this operation. The status codes are as follows:
0: 'Operation successful',
100: 'Bad request',
101: 'Invalid parameter',
102: 'Operation was unsuccessful',
103: 'Operation cannot be executed in current state',
104: 'Access to the service is forbidden',
105: 'Authorization during connection to a service has not been provided',
201: 'Recording finalization failed'.
Call | Inputs | Outputs | Description |
---|---|---|---|
add_participant() |
|
response , a dictionary containing:
|
Create a new participant in the Tobii Pro Lab project. |
find_participant() |
|
|
Find whether a participant already exists in the Tobii Pro Lab project. |
list_participants() |
response , a dictionary containing:
|
List all participants in the Tobii Pro Lab project. | |
upload_media() |
|
Upload media to the Tobii Pro Lab project. | |
find_media() |
|
|
Find media by name in the Tobii Pro Lab project. |
list_media() |
response , a dictionary containing:
|
List all media in the Tobii Pro Lab project. | |
add_aois_to_image |
|
response , a dictionary containing:
|
Define an AOI for a specific media in the Pro Lab project. |
add_aois_to_video |
|
response , a dictionary containing:
|
Define an AOI for a specific media in the Pro Lab project. |
get_state() |
response , a dictionary containing:
|
Get the state of the external presenter service in Pro Lab. | |
start_recording() |
|
response , a dictionary containing:
|
Tell Pro Lab to start a recording. |
stop_recording() |
Stop a currently ongoing recording of Tobii Pro Lab. | ||
finalize_recording() |
|
Finalize the stopped recording in Tobii Pro Lab. Note: after this call, you must still click ok in the Pro Lab user interface. | |
send_stimulus_event() |
|
Inform Pro Lab when and where a media (stimulus) was shown. | |
send_custom_event() |
|
Add an event to Pro Lab's timeline. | |
disconnect() |
Disconnect from Tobii Pro Lab. |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.