// // main.c // Aff // Created by user on 3/2/17. // Copyright © 2017 user. All rights reserved. // #include #include #include #include #include "dclapack.h" #include #define RegisterDriver(a,b) #include "poser_daveortho.c" #define LH_ID 0 #define NUM_HMD 32 #define INDIR "full_test_triangle_on_floor/" #define MAX_POINTS SENSORS_PER_OBJECT //#define _ABS(a) ( (a)<=0 ? -(a) : (a) ) #define _SIGN(a) ( (a)<=0 ? -1.0f : 1.0f ) #define RANDF ( (float)rand() / (float)RAND_MAX ) #define PI 3.14159265358979323846264 #define STEP_SIZE_ROT 1.0 #define STEP_SIZE_POS 1.0 #define FALLOFF 0.99999 #define NITER 2000000 #define TOO_SMALL 0.0001 #define ORTHOG_PENALTY 1.0 float hmd_pos[NUM_HMD][3]; void ReadHmdPoints() { int i; FILE *fin = fopen(INDIR "HMD_points.csv","r"); if (fin==NULL) { printf("ERROR: could not open HMD_points.csv for reading\n"); exit(1); } for (i=0; i TOO_SMALL) { float scaleRot = stepSizeRot / gradSizeRot; for (j=0; j<3; j++) { for (k=0; k<3; k++) { T[j][k] += scaleRot * conj[j][k]; } } stepSizeRot *= falloff; } if (gradSizePos > TOO_SMALL) { float scalePos = stepSizePos / gradSizePos; for (j=0; j<3; j++) { T[j][3] += scalePos * conj[j][3]; } stepSizePos *= falloff; } // Constrain the gradient (such that scaling is one) if (constrain) { // Measure the scales float len[3] = {0.0, 0.0, 0.0}; for (j=0; j<3; j++) { double lenSq = 0.0; for (k=0; k<3; k++) { lenSq += (double)T[j][k] * (double)T[j][k]; } len[j] = sqrt(lenSq); } // How far off is the scale? float xzLen = 0.5 * (len[0] + len[2]); if (xzLen > TOO_SMALL) { float inv_xzLen = 1.0 / xzLen; for (j=0; j<3; j++) { T[3][j] *= inv_xzLen; } } // Rescale the thing for (j=0; j<3; j++) { if (len[j] > TOO_SMALL) { float inv_len = 1.0 / len[j]; for (k=0; k<3; k++) { T[j][k] *= inv_len; } } } } } float dist = sqrt(T[0][3]*T[0][3] + T[1][3]*T[1][3] + T[2][3]*T[2][3]); printf("AffineSolve: pos: %f %f %f dist: %f\n", T[0][3], T[1][3], T[2][3], dist); } int main() { int i,j,k,sen,axis; // Read the data files ReadHmdPoints(); ReadPtinfo(); //------------------------- // Package the lighthouse data for "AffineSolve" //------------------------- // Data for the "iterative" affine solve formula float Tcalc[4][4]; float O[MAX_POINTS][4]; float N[MAX_POINTS][3]; float D[MAX_POINTS]; int nPlanes = 0; for (sen=0; sen 0 && err < bestErr) { x[1][0]=x_y; y[1][0]=y_y; z[1][0]=z_y; bestErr=err; } if ( i == 0 && j == 1 && k == 0) { x[1][0]=x_y; y[1][0]=y_y; z[1][0]=z_y; bestErr=err; } z_y = -z_y; } y_y = -y_y; } x_y = -x_y; } printf("bestErr %f\n", bestErr); */ //------------------------- // A test version of the rescaling to the proper length //------------------------- FLOAT ydist2; FLOAT bestBestErr = 9999.0; FLOAT bestYdist = 0; for (ydist2=ydist-0.1; ydist2 0 && err < bestErr) { x2[1][0]=x_y; y2[1][0]=y_y; z2[1][0]=z_y; bestErr=err; } z_y = -z_y; } y_y = -y_y; } x_y = -x_y; } printf("ydist2 %f bestErr %f\n",ydist2,bestErr); if (bestErr < bestBestErr) { memcpy(x,x2,3*sizeof(FLOAT)); memcpy(y,y2,3*sizeof(FLOAT)); memcpy(z,z2,3*sizeof(FLOAT)); bestBestErr = bestErr; bestYdist = ydist2; } } ydist = bestYdist; /* for (i=0; i