Control_Algo

Dependencies:   mbed

main.cpp

Committer:
gkumar
Date:
2015-02-13
Revision:
0:019699da1769

File content as of revision 0:019699da1769:

#include "mbed.h"

#include "math.h"

Serial pc(USBTX, USBRX);

 

/////////// Variable declarations ////////////////////

float b[3], db[3], omega[3]; /// inputs

//initialization

float bb[3] = {0, 0, 0};

float d[3] = {0, 0, 0};

float Jm[3][3] = {{0.2730, 0, 0}, {0, 0.3018, 0}, {0, 0, 0.3031}};

float den = 0, den2;

int i, j; //temporary variables

float Mu[2], z[2], dv[2], v[2], u[2], tauc[3] = {0, 0, 0}; //outputs

float invJm[3][3];

float kmu2 = 0.07, gamma2 = 1.9e4, kz2 = 0.4e-2, kmu = 0.003, gamma = 5.6e4, kz = 0.1e-4;

//structure parameters

float inputs[9];

void inverse (float mat[3][3], float inv[3][3]); 

void getInput (float x[9]);

 //functions

int main() {

////////// Input from Matlab //////////////

while(1) {

 getInput(inputs);

//while(1)

 b[0] = inputs[0];

 b[1] = inputs[1];

 b[2] = inputs[2];

 db[0] = inputs[3];

 db[1] = inputs[4];

 db[2] = inputs[5];

 omega[0] = inputs[6];

 omega[1] = inputs[7];

 omega[2] = inputs[8];

/////////// Control Algorithm //////////////////////

// calculate norm b, norm db

den = sqrt((b[0]*b[0]) + (b[1]*b[1]) + (b[2]*b[2]));

den2 = (b[0]*db[0]) + (b[1]*db[1]) + (b[2]*db[2]);

for(i=0;i<3;i++)

{

db[i] = (db[i]*den*den-b[i]*den2) / (pow(den,3));

//db[i]/=den*den*den;

}

for(i=0;i<3;i++)

{

b[i] /= den;

}

// select kz, kmu, gamma

if(b[0]>0.9 || b[0]<-0.9)

{

kz = kz2;

kmu = kmu2;

gamma = gamma2;

}

// calculate Mu, v, dv, z, u

for(i=0;i<2;i++)

{

Mu[i] = b[i+1];

v[i] = -kmu*Mu[i];

dv[i] = -kmu*db[i+1];

z[i] = db[i+1] - v[i];

u[i] = -kz*z[i] + dv[i]-(Mu[i] / gamma);

}

inverse(Jm, invJm);

// calculate cross(omega,J*omega)

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

bb[i] += omega[j]*(omega[(i+1)%3]*Jm[(i+2)%3][j] - 

omega[(i+2)%3]*Jm[(i+1)%3][j]);

}

// calculate invJm*cross(omega,J*omega) store in d

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

d[i] += bb[j]*invJm[i][j];

}

// calculate d = cross(invJm*cross(omega,J*omega),b) -cross(omega,db) 

// bb =[0;u-d(2:3)] 

// store in bb

bb[1] = u[0] + (d[0]*b[2])-(d[2]*b[0])-(omega[0]*db[2]) + (omega[2]*db[0]);
bb[2] = u[1]-(d[0]*b[1]) + (d[1]*b[0]) + (omega[0]*db[1])-(omega[1]*db[0]);
bb[0] = 0;

// calculate N 

// reusing invJm as N

for(i=0;i<3;i++)

{

d[i] = invJm[1][i];

invJm[ 1][i] = b[2]*invJm[0][i] - b[0]*invJm[2][i];

invJm[2][i] = -b[1]*invJm[0][i] + b[0]*d[i];

invJm[0][i] = b[i];

}

// calculate inv(N) store in Jm

inverse(invJm, Jm);

// calculate tauc

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

tauc[i] += Jm[i][j]*bb[j];

}

/////////// Output to Matlab //////////////////

 for(i=0;i<3;i++) {

 printf("%f\n",tauc[i]*10000000);

 wait_ms(10);

 }

 }

 return 0;

}

void inverse(float mat[3][3], float inv[3][3])
{
int i, j;
float det = 0;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
inv[j][i] = (mat[(i+1)%3][(j+1)%3]*mat[(i+2)%3][(j+2)%3]) - (mat[(i+2)%3]
[(j+1)%3]*mat[(i+1)%3][(j+2)%3]);
}
det += (mat[0][0]*inv[0][0]) + (mat[0][1]*inv[1][0]) + (mat[0][2]*inv[2][0]);
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
inv[i][j] /= det;
}
}
void getInput (float x[9]) {
char c[10];
char tempchar[8];
int i, j;
//float f[9];
long n = 0;
float flval = 0;
for(j=0;j<9;j++) {
for(i=0;i<9;i++) {
c[i] = pc.getc();
if(i<8) {
tempchar[i] = c[i];
}
}
sscanf (tempchar, "%8x", &n);
memcpy(&flval, &n, sizeof(long));
printf("%f\n", flval);
x[j] = flval;
}
}