Robot's source code
Dependencies: mbed
Diff: main.cpp
- Revision:
- 35:54b13e154801
- Parent:
- 34:95b9e61c7dae
- Child:
- 36:54f86bc6fd80
--- a/main.cpp Sat Feb 07 07:26:52 2015 +0000 +++ b/main.cpp Sun Mar 08 15:15:59 2015 +0000 @@ -1,25 +1,8 @@ #include "mbed.h" #include "QEI.h" -#include "Odometry.h" #include "Map.h" -/*---------------------------------------------------------------------------------------------------------*/ -/*---------------------------------------------------------------------------------------------------------*/ -/*KalmanFilter*/ -#include "EKF.h" -Mat<double> motion_bicycle3( Mat<double> state, Mat<double> command, double dt = 0.5); -Mat<double> sensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt = 0.5 ); -Mat<double> jmotion_bicycle3( Mat<double> state, Mat<double> command, double dt = 0.5); -Mat<double> jmotion_bicycle3_command(Mat<double> state, Mat<double> command, double dt = 0.5); -Mat<double> jsensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt = 0.5); -void measurementCallback( Mat<double>* z, Odometry* odometry); -bool setPWM(PwmOut *servo,float p); - -Mat<double> bicycle(3,1); -int reduc = 16; -/*---------------------------------------------------------------------------------------------------------*/ -/*---------------------------------------------------------------------------------------------------------*/ - +#include "Asserv.h" /*----------------------------------------------------------------------------------------------*/ /*Serial*/ Serial pcs(USBTX, USBRX); // tx, rx @@ -77,103 +60,25 @@ QEI qei_right(D4,D5,NC,1024*4,QEI::X4_ENCODING); Odometry odometry(&qei_left,&qei_right,63/2.,63/2.,280); bool testOdo = true; - /*----------------------------------------------------------------------------------------------*/ - - + Asserv<float> instanceAsserv(&odometry); /*----------------------------------------------------------------------------------------------*/ - /*KalmanFilter*/ - //double phi_max = 100; - /*en millimetres*/ - bicycle.set((double)36, 1,1); /*radius*/ - bicycle.set((double)36, 2,1); - bicycle.set((double)220, 3,1); /*entre-roue*/ - - int nbrstate = 5; - int nbrcontrol = 2; - int nbrobs = 5; - double dt = (double)0.05; - double stdnoise = (double)0.05; - - Mat<double> initX((double)0, nbrstate, 1); - initX.set( (double)0, 3,1); - Mat<double> X(initX); - - bool extended = true; - bool filterOn = true; - pcs.printf("mise a jour des pwm.\n"); - EKF<double> instance(nbrstate, nbrcontrol, nbrobs, dt, stdnoise, /*current state*/ initX, extended, filterOn); - - instance.initMotion(motion_bicycle3); - instance.initSensor(sensor_bicycle3); - instance.initJMotion(jmotion_bicycle3); - //instance.initJMotionCommand(jmotion_bicycle3_command); - instance.initJSensor(jsensor_bicycle3); - - /*desired State : (x y theta phiright phileft)*/ - Mat<double> dX((double)0, nbrstate, 1); - dX.set( (double)300, 1,1); - dX.set( (double)0, 2,1); - dX.set( (double)0, 3,1); - dX.set( (double)0, 4,1); - dX.set( (double)0, 5,1); - - Mat<double> ki((double)0, nbrcontrol, nbrstate); - Mat<double> kp((double)0, nbrcontrol, nbrstate); - Mat<double> kd((double)0, nbrcontrol, nbrstate); - //Mat<double> kdd((double)0.0015, nbrcontrol, nbrstate); - - for(int i=1;i<=nbrstate;i++) - { - kp.set( (double)0.01, i, i); - kd.set( (double)0.0001, i, i); - ki.set( (double)0.0001, i, i); - } - - instance.setKi(ki); - instance.setKp(kp); - instance.setKd(kd); - //instance.setKdd(kdd); - - Mat<double> u(transpose( instance.getCommand()) ); - - /*Observations*/ - /*il nous faut 5 observation : mais on n'en met à jour que 3...*/ - Mat<double> z((double)0,5,1); - measurementCallback(&z, &odometry); - - /*----------------------------------------------------------------------------------------------*/ - while(1) { t.start(); - //pcs.printf("%f : %f : %f\n", (double)odometry.getX()*100,(double)odometry.getY()*100,(double)odometry.getTheta()*180/3.14); - - - /*------------------------------------------------------------------------------------------*/ - /*Asservissement*/ - - measurementCallback(&z, &odometry); - instance.measurement_Callback( z, dX, true ); - - instance.state_Callback(); - //instance.setX(z); - X = instance.getX(); - - //instance.computeCommand(dX, (double)dt, -2); - instance.computeCommand(dX, (double)t.read(), -2); - double phi_r = instance.getCommand().get(1,1); - double phi_l = instance.getCommand().get(2,1); - - double phi_max = 1.0; - + //pcs.printf("%f : %f : %f\n", (double)odometry.getX()*100,(double)odometry.getY()*100,(double)odometry.getTheta()*180/3.14); + instanceAsserv.update(); //pcs.printf("command : \n phi_r = %f \n phi_l = %f \n", ((double)phi_r/phi_max), ((double)phi_l/phi_max)); //(instance.getCommand()).afficher(); //blue.printf("State : \n\r"); //(instance.getX()).afficherMblue(); //blue.printf("Odometry : \n\r"); //z.afficherMblue(); + Mat<float> X( instanceAsserv.getX() ); + float phi_r = instanceAsserv.getPhiR(); + float phi_l = instanceAsserv.getPhiL(); + float phi_max = instanceAsserv.getPhiMax(); blue.printf(" x : %f ;\t y : %f ;\t theta : %f ;\t phiD = %f ;\t phiG = %f \n\r",X.get(1,1),X.get(2,1),X.get(3,1), X.get(4,1), X.get(5,1) ); //pcs.printf("Sigma : \n\r"); //(instance.getSigma()).afficher(); @@ -235,164 +140,4 @@ led = !led; wait(1); } -} - -void measurementCallback( Mat<double>* z, Odometry* odometry) -{ - z->set( (double)/*conversionUnitée mm */odometry->getX(), 1,1); - z->set( (double)/*conversionUnitée mm*/odometry->getY(), 2,1); - double theta = odometry->getTheta(); - theta = atan21(sin(theta),cos(theta)); - z->set( (double)/*conversionUnitée rad*/theta, 3,1);//odometry->getTheta(), 3,1); - double vx = (double)odometry->getVx(); - double vy = (double)odometry->getVy(); - z->set( sqrt(vx*vx+vy*vy),4,1); - z->set( (double)odometry->getW(),5,1); - - //z->afficherM(); -} - -Mat<double> motion_bicycle3( Mat<double> state, Mat<double> command, double dt) -{ - Mat<double> r(state); - //double v = bicycle.get(1,1)/(2*bicycle.get(3,1))*(r.get(4,1)+r.get(5,1)); - //double w = bicycle.get(1,1)/(2*bicycle.get(3,1))*(r.get(4,1)-r.get(5,1)); - double v = state.get(4,1); - double w = state.get(5,1); - - r.set( r.get(1,1) + v*cos(r.get(3,1))*dt, 1,1); - r.set( r.get(2,1) + v*sin(r.get(3,1))*dt, 2,1); - - double angle = (r.get(3,1) + dt*w); - if( angle < -PI) - { - angle = angle - PI*ceil(angle/PI); - } - else if( angle > PI) - { - angle = angle - PI*floor(angle/PI); - } - - r.set( atan21(sin(angle), cos(angle)), 3,1); - - - /*----------------------------------------*/ - /*Modele du moteur*/ - /*----------------------------------------*/ - //double r1 = bicycle.get(3,1)/bicycle.get(1,1)*(command.get(1,1)/bicycle.get(3,1)+command.get(2,1)); - //double r2 = bicycle.get(3,1)/bicycle.get(1,1)*(command.get(1,1)/bicycle.get(3,1)-command.get(2,1)); - double r1 = bicycle.get(1,1)/2*(command.get(1,1)+command.get(2,1)); - double r2 = bicycle.get(1,1)/bicycle.get(3,1)*(command.get(1,1)-command.get(2,1)); - - - r.set( r1, 4,1); - r.set( r2, 5,1); - - - /*----------------------------------------*/ - /*----------------------------------------*/ - - return r; -} - - -Mat<double> sensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt) -{ - /* - double angle = state.get(3,1); - if( angle < -PI) - { - angle = angle - PI*ceil(angle/PI); - } - else if( angle > PI) - { - angle = angle - PI*floor(angle/PI); - } - - state.set( atan21(sin(angle), cos(angle)), 3,1); - */ - return state; -} - - -Mat<double> jmotion_bicycle3( Mat<double> state, Mat<double> command, double dt) -{ - double h = sqrt(numeric_limits<double>::epsilon())*norme2(state); - Mat<double> var( (double)0, state.getLine(), state.getColumn()); - var.set( h, 1,1); - Mat<double> G(motion_bicycle3(state+var, command, dt) - motion_bicycle3(state-var, command,dt)); - - for(int i=2;i<=state.getLine();i++) - { - var.set( (double)0, i-1,1); - var.set( h, i,1); - G = operatorL(G, motion_bicycle3(state+var, command, dt) - motion_bicycle3(state-var, command,dt) ); - } - - - return (1.0/(2*h))*G; -} - -Mat<double> jmotion_bicycle3_command(Mat<double> state, Mat<double> command, double dt) -{ - double h = sqrt(numeric_limits<double>::epsilon())*10e2+sqrt(numeric_limits<double>::epsilon())*norme2(state); - Mat<double> var( (double)0, command.getLine(), command.getColumn()); - var.set( h, 1,1); - Mat<double> G(motion_bicycle3(state, command+var, dt) - motion_bicycle3(state, command-var,dt)); - - for(int i=2;i<=command.getLine();i++) - { - var.set( (double)0, i-1,1); - var.set( h, i,1); - G = operatorL(G, motion_bicycle3(state, command+var, dt) - motion_bicycle3(state, command-var,dt) ); - } - - - return (1.0/(2*h))*G; -} - -Mat<double> jsensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt) -{ - double h = sqrt(numeric_limits<double>::epsilon())*10e2+sqrt(numeric_limits<double>::epsilon())*norme2(state); - Mat<double> var((double)0, state.getLine(), state.getColumn()); - var.set( h, 1,1); - Mat<double> H(sensor_bicycle3(state+var, command, d_state, dt) - sensor_bicycle3(state-var, command, d_state, dt)); - - for(int i=2;i<=state.getLine();i++) - { - var.set( (double)0, i-1,1); - var.set( h, i,1); - H = operatorL(H, sensor_bicycle3(state+var, command, d_state, dt) - sensor_bicycle3(state-var, command, d_state, dt) ); - } - - - return (1.0/(2*h))*H; - /* - double h = sqrt(numeric_limits<double>::epsilon())*10e2+sqrt(numeric_limits<double>::epsilon())*norme2(state); - Mat<double> var((double)0, state.getLine(), state.getColumn()); - var.set( h, 1,1); - Mat<double> H(sensor_bicycle3(state+var, command, d_state, dt) - sensor_bicycle3(state-var, command, d_state, dt)); - - for(int i=2;i<=state.getLine();i++) - { - var.set( (double)0, i-1,1); - var.set( h, i,1); - H = operatorL(H, sensor_bicycle3(state+var, command, d_state, dt) - sensor_bicycle3(state-var, command, d_state, dt) ); - - } - - - return (1.0/(2*h))*H; - */ -} - -bool setPWM(PwmOut *servo,float p) -{ - if(p <= 1.0f && p >= 0.0f) - { - servo->write(p); - return true; - } - - return false; } \ No newline at end of file