00001
00002
00003
00004
00005
00006
00007 #ifndef __GT2005SensorDataProcessor_h_
00008 #define __GT2005SensorDataProcessor_h_
00009
00010 #include "SensorDataProcessor.h"
00011 #include "Tools/RingBuffer.h"
00012 #include "Tools/Math/Common.h"
00013
00014 static const int gt2005SensorDataProcessorBufferSize = 20;
00015
00016
00017
00018
00019 const double gt2005SensorDataProcessorFalldownTiltAngle = fromDegrees(60);
00020 const double gt2005SensorDataProcessorFalldownRollAngle = fromDegrees(60);
00021 const double gt2005SensorDataProcessorRolledOnWallAngle = fromDegrees(19);
00022
00023
00024
00025
00026
00027
00028 class GT2005SensorDataProcessor : public SensorDataProcessor
00029 {
00030 public:
00031
00032
00033
00034
00035 GT2005SensorDataProcessor(const SensorDataProcessorInterfaces& interfaces);
00036
00037
00038 virtual void execute();
00039
00040
00041 double getCameraVelocity()
00042 {
00043 return getCameraVelocity(SensorData::headPan);
00044 }
00045 double getCameraVelocity(const SensorData::sensors joint);
00046
00047
00048 double getDistanceToSIFOC();
00049
00050 protected:
00051
00052 virtual void buildCameraMatrix(const SensorData& sensorData, const BodyPosture& bP, CameraMatrix& cameraMatrix);
00053
00054
00055 virtual bool detectFallDown();
00056
00057
00058 Vector3<double> gravity;
00059
00060 private:
00061 unsigned long tempSysTime;
00062
00063
00064
00065 Vector3<double> accelerationWithGrav;
00066
00067
00068 void buildPSDPercept(const SensorData& sensorData, const CameraMatrix& cameraMatrix, SinglePSDPercept& psdPercept);
00069
00070 int detectSwitches();
00071 BodyPercept::MouthStates detectMouthState();
00072 bool detectPickup(const Vector3<double>& gravity,
00073 const Vector3<double>& acceleration);
00074
00075
00076 unsigned long lastImageFrameNumber;
00077
00078
00079 double previousAverage[3], actAverage[3];
00080
00081
00082 class SensorDataRingBuffer : public RingBuffer<SensorData,gt2005SensorDataProcessorBufferSize>
00083 {
00084 public:
00085
00086
00087
00088
00089 double getAverage (SensorData::sensors sensor, int ticks);
00090
00091
00092
00093
00094 void updateAverage (SensorData::sensors sensor, int ticks, double& average);
00095
00096 long interpolate (SensorData::sensors sensor, unsigned long frame);
00097 };
00098
00099 void calculateBodyPostureFromLegSensors(const SensorData& sensorData, BodyPosture& bP);
00100 void calculateBodyPostureFromAccelerationSensors(const SensorData& sensorData, BodyPosture& bP);
00101
00102 SensorDataRingBuffer sensorDataRingBuffer;
00103 RingBuffer<CameraMatrix,gt2005SensorDataProcessorBufferSize> cameraMatrixRingBuffer;
00104 RingBuffer<BodyPosture,gt2005SensorDataProcessorBufferSize> bodyPostureRingBuffer;
00105 unsigned long leftRollStartTime;
00106 unsigned long rightRollStartTime;
00107 };
00108
00109 #endif// __GT2005SensorDataProcessor_h_