GestureRecognizer
GestureRecognizer copied to clipboard
A gesture recognizer for the Raspberry Pi and a MPU6050 accelerometer
uWave and gestureRecognizer
About:
A gesture recognition system that works with accelerometer x/y/z axis data based on uWave.
History:
I stumbled upon uWave, a gesture recognition system. While it worked fine it was not very efficient and the implementation was lacking and hard to follow.
uWave did not support continuous gesture recognition which I need for a project of mine. The implementation was certainly not suitable for continuous gesture recognition due to excessive memory allocation/deallocation, intensive recursive calculations and excessive i/o operations.
I thus decided to refactor a bit of uWave in order to understand it before re-implementing it in C++.
The use of static filenames and buffers in the code is because the classes will be further refactored and re-used on an embedded processor with limited ram and no file based i/o.
Copyright:
The original uWave code (uWave.h and uWave.c) is copyright of the authors: http://www.owlnet.rice.edu/~zw3/files/RICE/uWave/uWaveGestureLibraryReadme.html
They say I must include this statement: "Jiayang Liu, Zhen Wang, Lin Zhong, Jehan Wickramasuriya, and Venu Vasudevan, "uWave: Accelerometer-based personalized gesture recognition and its applications," in Proc. IEEE Int. Conf. Pervasive Computing and Communication (PerCom), March 2009."
The re-factored code and my new implementation also require that the above statement be included if it is re-used in addition to requiring the following statement:
"This product includes components of gestureRecognizer by Dominic Clifton"
Other than that the GPL v3 applies (See LICENCE)
Setup:
Connect a MPU6050 to a raspberry pi's i2c bus. Use default MPU6050 address. Raspberry Pi Model B v2.0 used for development. i2c device address is hard-coded in the i2c library. "/dev/i2c-1"
Build:
To build both executables (uWave and gestureRecognizer) issue:
make
To build just uWave:
make uWave
To build just gestureRecognizer:
make gestureRecognizer
Usage:
Record gestures:
Gestures are always recorded in "record.ges". Gestures are always 1 second long.
sudo ./gestureRecognizer RECORD mv record.ges 0.ges sudo ./gestureRecognizer RECORD mv record.ges 1.ges sudo ./gestureRecognizer RECORD mv record.ges 2.ges
.. and so on. Max supported gestures is currently 16. See config.h
Match a single gesture:
sudo ./gestureRecognizer
Continuously match gestures:
sudo ./gestureRecognizer CONTINUOUS
Replay gesture matching:
cp mygesture.ges replay.ges ./gestureRecognizer REPLAY
Notes:
The uWave executable does not have any specific timing, that is it runs as fast as possible. This means that any gestures recorded (*.uwv) are not very useful or re-usable on other machines/systems/etc.
Currently recorded gestures can be imported into gestureRecognizer via the Gesture::import() method, you would also need to enable USE_QUANTIZER in Config.h. The import method will probably be removed at a later date but it is useful during development to compare results.
It seems that the uWave library mangles the data, see USE_QUANTIZER but the method of data mangling doesn't lend itself well to the values provided by the MPU6050. See the other uWave examples.