wyager's Proof-of-concept code for a Leap Motion-based mouse controller. It now works with Linux, OS X and Windows.
The most recent version is on Github at github.com/openleap/pyleapmouse.
cd
to the directory all this stuff is in and run python PyLeapMouse.py
(minus quotes) or just double-click PyLeapMouse.py if you have your computer configured to launch .py files.Operation is as follows: One hand in frame: The tilt of this hand moves the mouse. Two hands in frame: Left hand controls action. All fingers closed: Mouse movement with right hand tilt. One finger open: Clicking. Left mouse button is down. Mouse movement with right hand tilt. Two fingers open: Scrolling. Scrolling with right hand movement. This is a somewhat unintuitive method of operation, but I find that it gives exceptionally better control than the most obvious "point-at-screen" method of mouse control. With this two-handed tilt based mode, it is easy to hit and properly engage small buttons, scroll through webpages, etc.
Movements are associated with commands listed in a file commands.ini
placed at the root folder. Here is an example of what the file should look like :
[screentap]
[keytap]
[swiperight]
1finger: rhythmbox-client --next
2finger: rhythmbox-client --next
3finger: rhythmbox-client --next
4finger: rhythmbox-client --next
5finger: rhythmbox-client --next
[swipeleft]
1finger: rhythmbox-client --previous
2finger: rhythmbox-client --previous
3finger: rhythmbox-client --previous
4finger: rhythmbox-client --previous
5finger: rhythmbox-client --previous
[clockwise]
1finger: rhythmbox-client --play
2finger: rhythmbox-client --play
3finger: rhythmbox-client --play
4finger: rhythmbox-client --play
5finger: rhythmbox-client --play
[counterclockwise]
1finger: rhythmbox-client --pause
2finger: rhythmbox-client --pause
3finger: rhythmbox-client --pause
4finger: rhythmbox-client --pause
5finger: rhythmbox-client --pause
Every commands could have a different behaviour if 1, 2, 3 ... 10 fingers are recognized but It's recommanded to use the same command for each number of fingers due to a lack of precision with Leap Motion.
This is a spare-time project, so it's not perfect quality. However, I tried to keep the code clean and readable. Let me know if you find any bugs (which there are certainly at least a few of). The contents of the files are as follows: PyLeapMouse.py: The actual program FingerControl.py: Pointer-finger-control specific code PalmControl.py: Palm-tilt-control specific code Linux/OSX/Windows: Various OS-specific Leap library files Mouse.py: A set of generic commands and classes to abstract away from OS-Specific mouse commands Geometry.py: Geometric functions MiscFunctions.py: Things that aren't strictly geometry and aren't specific to any interface style README.md: You are here
--smooth-aggressiveness [value]
sets the number of samples to use for pointer finger mouse smoothing.
--smooth-falloff [value]
sets the rate at which previous samples lose importance.
For every sample back in time, the previous location of the mouse is weighted with weight smooth_falloff^(-#sample).
So if smooth_falloff = 1.2, the current frame has weight 1/(1.2^0)=1, but the frame from 5 frames ago has weight 1/(1.2^5) = .4
By default, the smooth aggressiveness is 8 frames with a falloff of 1.3.
Add proper relative mouse movement. Should be pretty easy on Windows, not sure how to do so on OS X. Add multiple monitor support for absolute mouse mode (and OS X's pseudo-relative mode). Use PyUserInput for all mouse input? Or use Xlib directly for Linux?