#include "TuLiPControl.h" //not implemented yet void abstract(Controller* controller) { return; } //compute the control input u(k) and store it in controller.u void compute_control(Controller* controller) { Polytope* currentRegion = cartesian_prod(regions[controller->dRegion],input_bound); Polytope* projGoalRegion = regions[controller->goal]; //todo: check if the computation is successful get_input_helper(n, p, controller->nSteps, A, B, currentRegion->A, currentRegion->b, currentRegion->k, projGoalRegion->A, projGoalRegion->b, projGoalRegion->k,controller->hatx, projGoalRegion->center, controller->u); free_polytope(currentRegion); } Controller* instantiate_controller(){ Controller *c = MALLOC(sizeof(Controller)); int i; c->u = (pfloat*)MALLOC(p*sizeof(pfloat)); c->y = (pfloat*)MALLOC(m*sizeof(pfloat)); c->dInput = (idxint*)MALLOC(nInputVariable*sizeof(idxint)); for (i = 0;idInput+i) = 0; } c->hatx = (pfloat*)MALLOC(n*sizeof(pfloat)); return c; } void init_controller(Controller* controller) { init_input_bound(); init_region(); printf("successful init input and ppp polytopes\n"); fflush(stdout); int i; for(i=0;ihatx+i) = x0[i]; } controller->dRegion = dRegion0; controller->nSteps = totalSteps; controller->fsm=init_fsm(); printf("successful init fsm\n"); fflush(stdout); controller->goal = fsm_transition(controller->fsm,controller->dInput); compute_control(controller); controller->nSteps--; } void free_controller(Controller* controller) { FREE(controller->u); FREE(controller->y); FREE(controller->hatx); free_fsm(controller->fsm); FREE(controller); free_region(); free_input_bound(); } void transition_function(Controller* controller) { estimate_function(controller); //arrives at the goal if (controller->nSteps<=0) { //todo:check if the goal is really reached controller->dRegion = controller->goal; //reset nSteps controller->nSteps = totalSteps; controller->goal = fsm_transition(controller->fsm, controller->dInput); } compute_control(controller); controller->nSteps--; //display_controller(controller); } void output_function(Controller* controller, pfloat u[]){ int i; for(i=0;iu+i); } } void input_function(Controller* controller,const pfloat y[], const idxint dInput[]){ int i; for(i=0;iy+i) = y[i]; } for(i=0;idInput+i) = dInput[i]; } } //assuming perfect full state observation //possibly consider noisy observations in the future void estimate_function(Controller* controller){ int i; for(i=0;ihatx+i) = *(controller->y+i); } } void display_controller(Controller* controller){ int i; printf("State Estimation: "); for(i=0;ihatx+i)); } printf("\nControl Inputs: "); for(i=0;iu+i)); } printf("\nSensor Measurements: "); for(i=0;iy+i)); } printf("\nState of the Mealy machine: %d",controller->fsm->currentState); printf("\nDiscrete Region: %d",controller->dRegion); printf("\nNext goal: %d",controller->goal); printf("\nSteps left to reach goal: %d\n",controller->nSteps); fflush(stdout); return; } idxint get_input_helper(const idxint n, const idxint p, const idxint N, const pfloat* A, const pfloat* B, const pfloat* A1, const pfloat* b1, const idxint l1, const pfloat* A2, const pfloat* b2, const idxint l2, const pfloat* x0, const pfloat* xc, pfloat* u0) { idxint i, j, k, l, sparsepr; idxint exitflag = ECOS_FATAL; pwork* mywork; /*the state is [x0,u0,x1,u1,...,uN-1,xN,a,b,t], where a,b,t are auxiliary variables. * a,b,t satifies the following equalities and inequality: * a = (t-1)/2, b = (t+1)/2 * norm([u0,...,uN-1,xN,a],2)<= b * these equalities and inequality implies that u0^2+...+(uN-1)^2 + xN^2<=t*/ idxint ecos_n = n*(N+1) + p*N + 3; idxint ecos_m = l1 * N + l2 + p*N + n + 2; idxint ecos_p = n*(N+1) + 2; idxint ecos_l = l1 * N + l2; idxint ecos_ncones = 1; idxint ecos_q[1] = {p*N + n + 2}; /*generating matrix G of ECOS*/ idxint nnzG = N*p + n + N*(n+p)*l1 + n*l2 + 2; pfloat *ecos_Gpr = (pfloat*)MALLOC(sizeof(pfloat)*nnzG); if (ecos_Gpr == NULL) return ECOS_FATAL; idxint *ecos_Gjc = (idxint*)MALLOC(sizeof(idxint)*(ecos_n+1)); if (ecos_Gjc == NULL) return ECOS_FATAL; idxint *ecos_Gir = (idxint*)MALLOC(sizeof(idxint)*nnzG); if (ecos_Gir == NULL) return ECOS_FATAL; sparsepr = 0; for(k=0; k= n) { *(ecos_Gpr+sparsepr) = -1; *(ecos_Gir+sparsepr) = j-n+k*p+N*l1+l2+2; sparsepr++; } } } for(j=N*(n+p); j= (n+p)*N && i< (n+p)*N+n) { *(ecos_c + i) = -2*(*(xc + i - (n+p)*N)); } else { *(ecos_c+i) = 0; } } /* h is of the form [-b1,...,-b1,-b2,0,...,0] */ pfloat *ecos_h = (pfloat*)MALLOC(sizeof(pfloat)*ecos_m); if (ecos_h == NULL) return ECOS_FATAL; for (i = 0; i < ecos_m; i++) { if (i < l1*N) { *(ecos_h + i) = -1 * (*(b1 + i%l1)); } else if (i < l1*N + l2) { *(ecos_h + i) = -1 * (*(b2 + i - l1*N)); } else { *(ecos_h + i) = 0; } } /*b is of the form [x0,0,...,0,-0.5,0.5]*/ pfloat *ecos_b = (pfloat*)MALLOC(sizeof(pfloat)*ecos_p); if (ecos_b == NULL) return ECOS_FATAL; for (i = 0; i < ecos_p; i++) { if (i < n) { *(ecos_b + i) = *(x0 + i); } else { *(ecos_b + i) = 0; } } *(ecos_b + ecos_p - 2) = -0.5; *(ecos_b + ecos_p - 1) = 0.5; mywork = ECOS_setup(ecos_n, ecos_m, ecos_p, ecos_l, ecos_ncones, ecos_q, ecos_Gpr, ecos_Gjc, ecos_Gir, ecos_Apr, ecos_Ajc, ecos_Air, ecos_c, ecos_h, ecos_b); if( mywork != NULL ){ mywork->stgs->verbose = 0; // solve exitflag = ECOS_solve(mywork); for (i = 0; i < p; i++) { *(u0+i) = mywork->x[i+n]; } ECOS_cleanup(mywork, 0); } FREE(ecos_Gpr); FREE(ecos_Gjc); FREE(ecos_Gir); FREE(ecos_Apr); FREE(ecos_Ajc); FREE(ecos_Air); FREE(ecos_c); FREE(ecos_h); FREE(ecos_b); return exitflag; }