DataThreads.cc
00001
00002
00003
00004
00005
00006
00007
00008 #include <cstdio>
00009
00010 #include <opencv/highgui.h>
00011 #include <opencv/cv.h>
00012 #include <pthread.h>
00013 #include <sys/time.h>
00014
00015 #include "Control.h"
00016 #include "DataThreads.h"
00017 #include "Atomic6DOF.h"
00018 #include "TestrigGUI.h"
00019 #include "KalmanFilter.h"
00020 #include "SimpleRectangleFinder.h"
00021
00022 extern struct currentIMUData curIMUData;
00023 extern struct KalmanFilterData pitchFilter, rollFilter;
00024
00025 struct CollectedData myData;
00026 bool isRunning;
00027 TestrigGUI * myGui;
00028 pthread_mutex_t camMutex, imuMutex;
00029
00030 CvCapture * camera;
00031 IplImage * frame;
00032
00033 double outlierWeights[OUTLIER_SUM_RANGE];
00034 double weightedSum[NUM_POINTS];
00035
00036
00037 void initializeDataThreads() {
00038
00039 isRunning = true;
00040
00041 myData.oldestPoint = 0;
00042
00043 for (int i = 0; i < NUM_POINTS; i++) {
00044 myData.camPitchAngle[i] = 0;
00045 myData.camRollAngle[i] = 0;
00046 myData.imuPitchAccelVal[i] = 0;
00047 myData.imuPitchAngle[i] = 0;
00048 myData.imuPitchGyroVal[i] = 0;
00049 myData.imuRollAccelVal[i] = 0;
00050 myData.imuRollAngle[i] = 0;
00051 myData.imuRollGyroVal[i] = 0;
00052 myData.imuDeltaT[i] = 0;
00053 }
00054
00055 for (int i = 0; i < OUTLIER_SUM_RANGE; i++) {
00056 myData.imuOutlierSumPoints[i] = 0;
00057 outlierWeights[i] = 1.0;
00058 }
00059
00060 for (int i = 0; i < STARTING_SUM_NUM; i++) {
00061
00062 }
00063
00064 myData.imuLastT = 0;
00065
00066
00067 myData.frameCounter = 0;
00068
00069 pthread_mutex_init(&camMutex, NULL);
00070 pthread_mutex_init(&imuMutex, NULL);
00071
00072 }
00073
00074 void shutdownDataThreads() {
00075 isRunning = false;
00076 }
00077
00078 void * runGuiThread(void * var) {
00079
00080 while (isRunning) {
00081 myGui->emitReadyToUpdateGUI();
00082 usleep(100000);
00083 }
00084
00085 pthread_mutex_destroy(&camMutex);
00086 pthread_mutex_destroy(&imuMutex);
00087 pthread_exit(NULL);
00088 return NULL;
00089 }
00090
00091 void * runIMUThread(void * var) {
00092
00093 if (!initializeAtomic6DOF()) {
00094 printf("Not getting IMU stuffs...That makes me a sad panda.\n");
00095 pthread_exit(NULL);
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 struct timeval curTime;
00109
00110 initializeKalmanFilter(&pitchFilter, 0.012, 0.001, 0.003);
00111 initializeKalmanFilter(&rollFilter, 0.012, 0.001, 0.003);
00112
00113 while (isRunning) {
00114
00115 while (!isIMUDataReady()) {}
00116 gettimeofday(&curTime, 0);
00117
00118
00119 double delta_t = (curTime.tv_usec - myData.imuLastT)/ 1000000.0;
00120 if (delta_t < 0)
00121 delta_t += 1.0;
00122
00123
00124 pthread_mutex_lock(&imuMutex);
00125 int oldestVal = myData.oldestPoint;
00126 updateKalmanFilter(&pitchFilter, curIMUData.adj_gyro_pitch, curIMUData.adj_accel_pitch, delta_t);
00127 updateKalmanFilter(&rollFilter, curIMUData.adj_gyro_roll, curIMUData.adj_accel_roll, delta_t);
00128 myData.imuPitchAccelVal[oldestVal] = curIMUData.accel_y;
00129 myData.imuPitchGyroVal[oldestVal] = curIMUData.gyro_pitch;
00130 myData.imuRollAccelVal[oldestVal] = curIMUData.accel_x;
00131 myData.imuRollGyroVal[oldestVal] = curIMUData.gyro_roll;
00132 myData.imuPitchAngle[oldestVal] = pitchFilter.x_0;
00133 myData.imuRollAngle[oldestVal] = rollFilter.x_0;
00134 myData.imuDeltaT[oldestVal] = delta_t*1000.0;
00135 myData.imuLastT = curTime.tv_usec;
00136
00137 myData.oldestPoint++;
00138 if (myData.oldestPoint == NUM_POINTS)
00139 myData.oldestPoint = 0;
00140 pthread_mutex_unlock(&imuMutex);
00141
00142
00143
00144 usleep(2000);
00145
00146 }
00147
00148
00149 shutdownAtomic6DOF();
00150
00151
00152 pthread_exit(NULL);
00153
00154 return NULL;
00155 }
00156
00157 void * runCamThread(void * var) {
00158 pthread_exit(NULL);
00159
00160 IplImage * gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
00161 IplImage * rChan = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
00162
00163
00164 SimpleRectangleFinder rect (rChan);
00165
00166
00167 while (isRunning) {
00168
00169
00170 frame = cvQueryFrame(camera);
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 pthread_mutex_lock(&camMutex);
00197 cvCopy(frame, myData.currentCamImage);
00198 myData.frameCounter++;
00199 pthread_mutex_unlock(&camMutex);
00200
00201 usleep(20000);
00202 }
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 cvReleaseImage(&gray);
00236 cvReleaseImage(&rChan);
00237
00238 pthread_exit(NULL);
00239 }