This post first appeared on pygaze.org, in May 2017
Gazepoint is a relatively small player on the eye-tracking market. They sell two devices: the 60 Hz GP3 at a price of $695, and the 150 Hz GP3 HD at $1995 (both of those prices exclude VAT and shipping). Because of its relatively low price, the basic GP3 is an appealing model for researchers on a budget. As of today, PyGaze supports Gazepoint’s trackers through their OpenGaze API. Download the new code from GitHub, and have fun!
In a blog about the affordable EyeTribe tracker calling it quits, I mentioned potential alternatives, including Gazepoint’s GP3. To be specific, I wrote that none of the PyGaze developers have access to a GP3, but that I would be open to support it if someone were to send me one. Well, Ivan Moser and his supervisor came through. They sent me a GP3, and now PyGaze supports it.
The temporal resolution of both the GP3 and the GP3 HD is low. Too low for measuring the properties of saccades, for example. On the other hand, fixation analyses (where people looked at in an image) and measuring pupil size should be possible at sampling rates of 60 or 150 Hz. As for the spatial properties: I don’t know how good the precision (internal validity, or how consist the measurements are), and the accuracy (external validity, or how well the measurements correspond to the real world) are.
Gazepoint devices can be accessed through their OpenGaze API. Although it’s called ‘open’, I couldn’t find the actual source code. The documentation is freely available in a PDF. From this, we can learn that Gazepoint devices work with a locally running server. This server communicates directly with the tracker, and is open to clients who can communicate with it using messages in an XML format. (See the documentation PDF for specifics.)
Gazepoint in PyGaze
As with all the other trackers (SR Research’s EyeLink, SensoMotoric Instruments, Tobii, and EyeTribe), you can simply set a single constant (TRACKERTYPE) to choose the GP3. Set it to ‘opengaze’ to use Gazepoint’s OpenGaze API. See below for an example.
# Display properties
DISPSIZE = (1920, 1080)
DISPTYPE = 'psychopy'
# Eye tracker properties
TRACKERTYPE = 'opengaze'
Now in an experiment script, you can simply use PyGaze’s common interface to get the GP3 to calibrate, to record data, and to get samples from the tracker while it’s recording data (useful for gaze-contingent displays). For an example, see below.
# This is an example script to go with the above constants.py
from pygaze.display import Display
from pygaze.screen import Screen
from pygaze.eyetracker import EyeTracker
import pygaze.libtime as timer
# Initialise the Display and a Screen.
disp = Display()
scr = Screen()
# Show a waiting message.
scr.draw_text("Preparing experiment...", fontsize=20)
# Open a connection to the eye tracker.
tracker = EyeTracker(disp)
# Calibrate the eye tracker.
# Start streaming and logging samples.
# Run for 5000 milliseconds, showing a dot on the current gaze position.
t0 = timer.get_time()
while timer.get_time() - t0 < 5000:
# Get the latest gaze sample.
gazepos = tracker.sample()
# Clear the current contents of the Screen.
# Draw a dot on the Screen, at the current gaze position.
# Show the Screen.
# Stop streaming and logging samples.
# Close the connection to the tracker.
# Close the display.
Independent Python wrapper
There is good news if, for some unfathomable reason, you don’t like PyGaze: I wrote a Python wrapper for the OpenGaze API too. In fact, this is what allows PyGaze to work with Gazepoint’s trackers! The wrapper is called PyOpenGaze, and you can find it on GitHub.