Getting started¶
+Requirements¶
+-
+
The Beam application is installed on your system;
+you have an active subscription, which makes you able to receive head and eye tracking data;
+you run the calibration procedure within the Beam application at least once.
+
In addition, if you want to use the Python API, you need:
+-
+
Python 3.6;
+NumPy;
+adding
<YOUR_BEAM_SDK_INSTALLATION_FOLDER>/API/python
to yourPYTHONPATH
.
+
Python example¶
+from eyeware.client import TrackerClient
+import time
+import numpy as np
+
+# Build tracker client, to establish a communication with the tracker server (an Eyeware application).
+#
+# Constructing the tracker client object without arguments sets a default server hostname and port which
+# work fine in many configurations.
+# However, it is possible to set a specific hostname and port, depending on your setup and network.
+# See the TrackerClient API reference for further information.
+tracker = TrackerClient()
+
+# Run forever, until we press ctrl+c
+while True:
+ # Make sure that the connection with the tracker server (Eyeware application) is up and running.
+ if tracker.connected:
+
+ print(" * Head Pose:")
+ head_pose = tracker.get_head_pose_info()
+ head_is_lost = head_pose.is_lost
+ print(" - Lost track: ", head_is_lost)
+ if not head_is_lost:
+ print(" - Session ID: ", head_pose.track_session_uid)
+ rot = head_pose.transform.rotation
+ print(" - Rotation: |%5.3f %5.3f %5.3f|" % (rot[0, 0], rot[0, 1], rot[0, 2]))
+ print(" |%5.3f %5.3f %5.3f|" % (rot[1, 0], rot[1, 1], rot[1, 2]))
+ print(" |%5.3f %5.3f %5.3f|" % (rot[2, 0], rot[2, 1], rot[2, 2]))
+ tr = head_pose.transform.translation
+ print(" - Translation: <x=%5.3f m, y=%5.3f m, z=%5.3f m>" % (tr[0], tr[1], tr[2]))
+
+ print(" * Gaze on Screen:")
+ screen_gaze = tracker.get_screen_gaze_info()
+ screen_gaze_is_lost = screen_gaze.is_lost
+ print(" - Lost track: ", screen_gaze_is_lost)
+ if not screen_gaze_is_lost:
+ print(" - Screen ID: ", screen_gaze.screen_id)
+ print(" - Coordinates: <x=%5.3f px, y=%5.3f px>" % (screen_gaze.x, screen_gaze.y))
+ print(" - Confidence: ", screen_gaze.confidence)
+
+ time.sleep(1 / 30) # We expect tracking data at 30 Hz
+ else:
+ # Print a message every MESSAGE_PERIOD_IN_SECONDS seconds
+ MESSAGE_PERIOD_IN_SECONDS = 2
+ time.sleep(MESSAGE_PERIOD_IN_SECONDS - time.monotonic() % MESSAGE_PERIOD_IN_SECONDS)
+ print("No connection with tracker server")
+
Output¶
+Running the example code in a terminal will start printing information in real time. +There will be a lot of prints, one for each frame. +Let us zoom on the printed output associated to one frame only:
+* Head Pose:
+ - Lost track: False
+ - Session ID: 1
+ - Rotation: |-0.999 -0.005 -0.045|
+ |-0.008 0.999 0.051|
+ |0.045 0.051 -0.998|
+ - Translation: <x=0.166 m, y=0.181 m, z=0.260 m>
+* Gaze on Screen:
+ - Lost track: False
+ - Screen ID: 0
+ - Coordinates: <x=698.000 px, y=149.000 px>
+ - Confidence: TrackingConfidence.HIGH
+
For the meaning of the returned fields, refer to the section API overview.
+Explanation¶
+When creating a Python script with the purpose of consuming head and eye tracking information from Beam SDK, you must ensure that the basic classes are correctly imported:
+from eyeware.client import TrackerClient
+
We can build a TrackerClient
object, which is the main entry point of Beam SDK (see API overview for further details):
tracker = TrackerClient()
+
Then, we verify that the connection between our client object and the tracker server (Eyeware application) is up and running as follows:
+if tracker.connected:
+
and we are now ready to receive head and gaze tracking data, doing something with that data.
+Let us start from the head tracking part. +First, we will retrieve the head tracking information data structure. +Then, we will check whether tracking information is valid for the current frame. +In code:
+print(" * Head Pose:")
+head_pose = tracker.get_head_pose_info()
+head_is_lost = head_pose.is_lost
+print(" - Lost track: ", head_is_lost)
+
If the head tracking information is indeed valid (i.e., head tracking was not lost), then we retrieve the 3D coordinates of the tracked person’s head:
+if not head_is_lost:
+ print(" - Session ID: ", head_pose.track_session_uid)
+ rot = head_pose.transform.rotation
+ print(" - Rotation: |%5.3f %5.3f %5.3f|" % (rot[0, 0], rot[0, 1], rot[0, 2]))
+ print(" |%5.3f %5.3f %5.3f|" % (rot[1, 0], rot[1, 1], rot[1, 2]))
+ print(" |%5.3f %5.3f %5.3f|" % (rot[2, 0], rot[2, 1], rot[2, 2]))
+ tr = head_pose.transform.translation
+ print(" - Translation: <x=%5.3f m, y=%5.3f m, z=%5.3f m>" % (tr[0], tr[1], tr[2]))
+
For details about the rotation and translation notation, refer to the section API overview.
+Now, we want to get screen gaze tracking information. +This follows the same logic that we applied for head tracking information. +First, retrieve the screen gaze information data structure. +Then, check the data validity (whether tracking is not lost):
+print(" * Gaze on Screen:")
+screen_gaze = tracker.get_screen_gaze_info()
+screen_gaze_is_lost = screen_gaze.is_lost
+print(" - Lost track: ", screen_gaze_is_lost)
+if not screen_gaze_is_lost:
+ print(" - Screen ID: ", screen_gaze.screen_id)
+ print(" - Coordinates: <x=%5.3f px, y=%5.3f px>" % (screen_gaze.x, screen_gaze.y))
+ print(" - Confidence: ", screen_gaze.confidence)
+
The rest of the example code is about printing head and gaze tracking data numbers on the terminal. +Printing those numbers, by itself, is not very useful or interesting. +Instead, you can exploit the Beam SDK tracking data for building your own creative applications! +Let us know how it goes at contact@eyeware.tech. +We would love to hear about your projects.
+