Enabling Freedom and Knowledge
In Q4 of 2013, EyeTech contracted with an automotive company to build an HMI system that used touch, eye tracking and gesture technology. EyeTech prototyped a custom eye tracking (gaze based) user interface combined with gesture interaction, and performed testing and recordings of the interface for a car dashboard. EyeTech’s engineering team was contracted to create and set up all hardware and software involved in the project. EyeTech delivered the working software and hardware in March 2014 for the automotive partner to evaluate. With the time and resource constraints of the project, EyeTech’s partner decided to integrate the solution into a simulator with a pico projector as opposed to mounting in a car.
Simulator testing provided a close representation of actual in-car testing. Black areas of the full screen GUI interface appeared transparent, while the button flowed onto the screen akin to a windshield display. Another computer took care of the background outdoor environment which can be switched out. The GUI interface can be tested against other backdrops as needed.
Leap Motion Interaction Area
2 feet above the controller, by 2 feet wide on each side (150° angle),
by 2 feet deep on each side (120° angle).
The solution that was used during this project was to just limit available control area to a smaller area. Basically if the hand’s or fingers’ or “tool’s” average position is too far from the y axis, it is ignored.
maxDistance_mm = 70;
if( abs(hand.palmPosition().x) < maxDistance_mm and
abs(hand.palmPosition().z) < maxDistance_mm )
// use the y component of the palm position for calculations
// ignore this input frame
So now instead of tracking a large fat balloon shaped area, it only uses a rectangular prism or a square column oriented normal to the the surface of the device.
Also some minimal sampling was performed to smooth out the motion of the control. It was a just a mean calculation of the previous 5 samples. It was implemented with a rolling average, so after 5 samples come in and are added together, when subsequent samples arrive, the oldest sample in the list gets removed from the sum, and the newest sample gets added to the sum, and the sum is divided by the list size (5) to give the new value.
Limited Interaction Area
5 cm to 30 cm above the device are the variable areas, with any measurements outside of ~7 cm away from the y axis are ignored.
// map function, x1 and x2 are the domain, and y1 and y2 are the range
// x is the input
double map(x1, x, x2, y1, y2):
x = x1;
x = x2;
return y1 + (y2-y1)/(x2-x1)*(x-x1);
// example usage
// map the average value from the domain 5 to 30 centimeters,
// to an output value of 0 to 9.
// 5 => 0 and 30 => 9
mappedValue = map(5, sumOfSamples/samples.size(), 30, 0, 9);