Eyetracking calibration check

Hi,

I’m using a tobii spectrum eyetracker and running it through iohub. However one thing I haven’t been able to figure out is if the calibration performed can be visually checked. Simply because a calibration passes does not mean that it’s a good calibration. For instance, I tried calibrating the eyetracker while having my eyes fixated on only one part of the screen the entire time and the calibration passed because it was able to detect my eyes the entire time. Using the tobii Eye Tracker Manager and the Matlab example tobii provides I’m able to check the quality of the calibration. Is there a way to do this in psychopy? Please let me know.

As a side-note, I’m not able to redo the calibration if I choose to. After calibration if I hit ANY button, the code continues. I’ve needed to add an additional code in the case I’d like to redo calibration in the event that it fails.

Hi,
There is now a component called Eye-tracker Validation (in addition to Eye-tracker Calibration) and if you go in the tab ‘Data’ you can check the box “Show results screen” so at the end you will see the quality of the calibration not just if it is passed or not.

Also could you share here, the lines of your code component? I would be very interested to be able to redo the calibration in those cases where technically the calibration is passed but the quality is still rather poor as we can see with this results screen. Thanks!

As Camille says there is a built-in validation routine, if it works that’s the easiest route. You can also make one yourself fairly easily - all you need to do is create an object that has its location set by the gaze location on every frame. I have a couple experiments that do this, the code is very straightforward:

circEyes = visual.Circle(win, units='pix', radius = 25, lineColor='red', fillColor='red')
done = False
while not done:
        gpos = tracker.getLastGazePosition()
        if type(gpos) in [tuple, list]:
            circEyes.pos = gpos
        else:
            circEyes.pos = [-900,-700]
        circEyes.draw()
        win.flip()
        #some condition to end the loop, e.g. a keypress

I also have an array of target dots to check that it’s accurate at various locations on the screen, but it’s easy to add something like that into this loop. The important part is that you have this object with a location being updated according to the last position detected by the eye-tracker.