From b3a5eb6d32624331809fc985d9b7d83e97816968 Mon Sep 17 00:00:00 2001 From: Rikhard Kuutti Date: Thu, 18 Mar 2010 13:29:10 +0200 Subject: [PATCH] Cleanup and fixes to accelerometer class Fixed smoothdata method --- Client/accelerometer.cpp | 244 +++++----------------------------------------- Client/accelerometer.h | 54 +--------- 2 files changed, 28 insertions(+), 270 deletions(-) diff --git a/Client/accelerometer.cpp b/Client/accelerometer.cpp index fc67b2f..8daf06f 100644 --- a/Client/accelerometer.cpp +++ b/Client/accelerometer.cpp @@ -2,26 +2,18 @@ * Accelerometer class to access the device accelerometer * * @author Rikhard Kuutti - * @author Kai Rasilainen + * @author Kai Rasilainen * @copyright (c) 2010 Speed Freak team * @license http://opensource.org/licenses/gpl-license.php GNU Public License */ #include "accelerometer.h" -#include "math.h" - -#include -#include -#include -#include #include #include #include -#define kFilteringFactor 0.2 - -static int sampleIndex = 0; +#define kFilteringFactor 0.2 /** * Default constructor for Accelerometer class @@ -29,27 +21,6 @@ static int sampleIndex = 0; */ Accelerometer::Accelerometer() { - calculate = new Calculate(); - - timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(processData())); - sampleRate = 40; - initValues(); -} - -/** - * Constructor for Accelerometer class that takes accelerometer sample rate as parameter - * - * @param p_SampleRate the desired sample rate of accelerometer in milliseconds - */ -Accelerometer::Accelerometer(int p_SampleRate) -{ - calculate = new Calculate(); - - - timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(processData())); - sampleRate = p_SampleRate; initValues(); } @@ -62,45 +33,14 @@ Accelerometer::~Accelerometer() } /** - * Start measuring - * - */ -void Accelerometer::start() -{ - initValues(); - //calibrate(); - timer->start(sampleRate); - now.restart(); -} - -/** * Init class members * */ void Accelerometer::initValues() { - calculate->reset(); - accelerationX = 0; - accelerationY = 0; - accelerationZ = 0; - trueAccelerationX = 0; - trueAccelerationY = 0; - trueAccelerationZ = 0; previousAccelerationX = 0; previousAccelerationY = 0; previousAccelerationZ = 0; - previousSpeed = 0; - currentSpeed = 0; - currentAcceleration = 0; - previousAcceleration = 0; - totalAcceleration = 0; - intervalTime = 0; - totalTime = 0; - distanceTraveled = 0; - lastDistanceTraveled = 0; - averageSpeed = 0; - sampleRate = 0; - firstRun = true; calibrationX = 0; calibrationY = 0; calibrationZ = 0; @@ -131,95 +71,33 @@ void Accelerometer::calibrate(void) calibrationX = calibrationX/1024; // division by 1024 calibrationY = calibrationY/1024; calibrationZ = calibrationZ/1024; - -} - -/** - * Stop measuring - * - */ -void Accelerometer::stop() -{ - timer->stop(); } /** - * Processes Accelerometer data - * - * Opens the accelerometer value file for reading and reads and parses accelerometer values. - * Forwards data to Calculate class for processing + * Smooths Accelerometer data by applying a low pass filter to data * + * @param x accelerometer's x-axis input + * @param y accelerometer's y-axis input + * @param z accelerometer's z-axis input */ -/* -void Accelerometer::processData() +void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z) { - getAcceleration(accelerationX, accelerationY, accelerationZ); - //smoothData(accelerationX, accelerationY, accelerationZ); - - // Apply calibration - accelerationX = accelerationX - calibrationX; - accelerationY = accelerationY - calibrationY; - accelerationZ = accelerationZ - calibrationZ; - - // If the function is run the first time, make sure that there - // are no differences with previous and current acceleration - if (firstRun) { - previousAccelerationX = accelerationX; - previousAccelerationY = accelerationY; - previousAccelerationZ = accelerationZ; - firstRun = false; - } - - // Calculate the current acceleration for each axis - trueAccelerationX = (accelerationX - previousAccelerationX); - trueAccelerationY = (accelerationY - previousAccelerationY); - trueAccelerationZ = (accelerationZ - previousAccelerationZ); - - previousAccelerationX = accelerationX; - previousAccelerationY = accelerationY; - previousAccelerationZ = accelerationZ; - - currentAcceleration = sqrt((trueAccelerationX * trueAccelerationX) + - (trueAccelerationY * trueAccelerationY) + - (trueAccelerationZ * trueAccelerationZ)); + x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor); + y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor); + z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor); - // Discrimination window for currentAcceleration - if ( fabs(currentAcceleration) < 0.10 ) { currentAcceleration = 0; } - - // Measure time interval - intervalTime = now.restart(); - intervalTime = intervalTime/1000; // millisecs to secs - totalTime = totalTime + intervalTime; - - // Using calculate class to calculate velocity and distance etc. - calculate->calculateParameters(currentAcceleration,intervalTime ); - - currentSpeed = calculate->getCurrentSpeed(); - distanceTraveled = calculate->getDistanceTraveled(); + previousAccelerationX = x; + previousAccelerationY = y; + previousAccelerationZ = z; } -*/ + /** - * Smooths Accelerometer data + * Gets the raw acceleration data from accelerometer * * @param x accelerometer's x-axis input * @param y accelerometer's y-axis input * @param z accelerometer's z-axis input */ -void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z) -{ - accelerationX = x; - accelerationY = y; - accelerationZ = z; - - if (sampleIndex > 0) - { - accelerationX = ((previousAccelerationX) * (1-kFilteringFactor)) + (accelerationX * kFilteringFactor); - accelerationY = ((previousAccelerationY) * (1-kFilteringFactor)) + (accelerationY * kFilteringFactor); - accelerationZ = ((previousAccelerationZ) * (1-kFilteringFactor)) + (accelerationZ * kFilteringFactor); - } - sampleIndex++; -} - void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z) { QDBusConnection connection(QDBusConnection::systemBus()); @@ -235,100 +113,30 @@ void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z) } /** - * Set the sample rate of accelerometer + * Get the x calibration component * - * @param pSampleRate desired sample rate + * @return calibrationX x calibration component */ -void Accelerometer::setSampleRate(int pSampleRate) +qreal Accelerometer::getCalibrationX() { - sampleRate = pSampleRate; + return calibrationX; } /** - * Get the sample rate of accelerometer + * Get the y calibration component * - * @return sampleRate the sample rate of the accelerometer in milliseconds + * @return calibrationY y calibration component */ -int Accelerometer::getSampleRate() -{ - return sampleRate; -} - -qreal Accelerometer::getCurrentAcceleration() -{ - return currentAcceleration; -} - -qreal Accelerometer::getPreviousTotalAcceleration() -{ - return previousAcceleration; -} - -qreal Accelerometer::getTotalAcceleration() -{ - return totalAcceleration; -} - -qreal Accelerometer::getDistanceTraveled() -{ - return distanceTraveled; -} - -qreal Accelerometer::getLastDistanceTraveled() -{ - return lastDistanceTraveled; -} - -qreal Accelerometer::getAverageSpeed() -{ - return averageSpeed; -} - -qreal Accelerometer::getTrueAccelerationX() -{ - return trueAccelerationX; -} - -qreal Accelerometer::getTrueAccelerationY() -{ - return trueAccelerationY; -} - -qreal Accelerometer::getTrueAccelerationZ() -{ - return trueAccelerationZ; -} - -qreal Accelerometer::getPreviousSpeed() -{ - return previousSpeed; -} - -qreal Accelerometer::getCurrentSpeed() -{ - return currentSpeed; -} - -qreal Accelerometer::getIntervalTime() -{ - return intervalTime; -} - -qreal Accelerometer::getTotalTime() -{ - return totalTime; -} - -qreal Accelerometer::getCalibrationX() -{ - return calibrationX; -} - qreal Accelerometer::getCalibrationY() { return calibrationY; } +/** + * Get the z calibration component + * + * @return calibrationZ z calibration component + */ qreal Accelerometer::getCalibrationZ() { return calibrationZ; diff --git a/Client/accelerometer.h b/Client/accelerometer.h index cd0c2ef..46e31da 100644 --- a/Client/accelerometer.h +++ b/Client/accelerometer.h @@ -2,7 +2,7 @@ * Accelerometer class to access the device accelerometer * * @author Rikhard Kuutti - * @author Kai Rasilainen + * @author Kai Rasilainen * @copyright (c) 2010 Speed Freak team * @license http://opensource.org/licenses/gpl-license.php GNU Public License */ @@ -22,70 +22,20 @@ class Accelerometer : public QObject Q_OBJECT public: Accelerometer(); - Accelerometer(int p_SampleRate); ~Accelerometer(); void getAcceleration(qreal &x, qreal &y, qreal &z); void smoothData(qreal &x, qreal &y, qreal &z); void calibrate(); - - void start(); - void stop(); - void initValues(); - void setSampleRate(int pSampleRate); - int getSampleRate(); - - qreal getTrueAccelerationX(); - qreal getTrueAccelerationY(); - qreal getTrueAccelerationZ(); - - qreal getPreviousSpeed(); - qreal getCurrentSpeed(); - - qreal getDistanceTraveled(); - qreal getLastDistanceTraveled(); - qreal getAverageSpeed(); - - qreal getCurrentAcceleration(); - qreal getTotalAcceleration(); - qreal getPreviousTotalAcceleration(); - qreal getCalibrationX(); qreal getCalibrationY(); qreal getCalibrationZ(); - qreal getIntervalTime(); - qreal getTotalTime(); - - Calculate *calculate; - -private slots: - //void processData(); - - private: - qreal accelerationX, accelerationY, accelerationZ; - qreal trueAccelerationX,trueAccelerationY,trueAccelerationZ; - qreal previousAccelerationX,previousAccelerationY,previousAccelerationZ; - qreal previousSpeed, currentSpeed; - qreal currentAcceleration, previousAcceleration, totalAcceleration; + qreal previousAccelerationX, previousAccelerationY, previousAccelerationZ; qreal calibrationX, calibrationY, calibrationZ; - - QTime now; - QTimer *timer; - - double intervalTime; - double totalTime; - double distanceTraveled; - double lastDistanceTraveled; - double averageSpeed; - double sampleRate; - - bool firstRun; - }; #endif // ACCELEROMETER_H - -- 1.7.9.5