Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@23:228317fe0457, 2014-12-14 (annotated)
- Committer:
- Jagang
- Date:
- Sun Dec 14 18:12:08 2014 +0000
- Revision:
- 23:228317fe0457
- Parent:
- 22:80fdb12c167f
- Child:
- 24:3c0422e1ebd6
Initialisation des obstacles
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Jagang | 0:41149573d577 | 1 | #include "mbed.h" |
| Jagang | 0:41149573d577 | 2 | #include "QEI.h" |
| Jagang | 0:41149573d577 | 3 | #include "Odometry.h" |
| Near32 | 17:f360e21d3307 | 4 | #include <iostream> |
| Jagang | 23:228317fe0457 | 5 | #include "Map.h" |
| Jagang | 0:41149573d577 | 6 | |
| Near32 | 3:573a0dc8383f | 7 | /*---------------------------------------------------------------------------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 8 | /*---------------------------------------------------------------------------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 9 | /*KalmanFilter*/ |
| Near32 | 3:573a0dc8383f | 10 | #include "EKF.h" |
| Near32 | 17:f360e21d3307 | 11 | Mat<double> motion_bicycle3( Mat<double> state, Mat<double> command, double dt = 0.5); |
| Near32 | 17:f360e21d3307 | 12 | Mat<double> sensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt = 0.5 ); |
| Near32 | 17:f360e21d3307 | 13 | Mat<double> jmotion_bicycle3( Mat<double> state, Mat<double> command, double dt = 0.5); |
| Near32 | 17:f360e21d3307 | 14 | Mat<double> jsensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt = 0.5); |
| Near32 | 3:573a0dc8383f | 15 | void measurementCallback( Mat<double>* z, Odometry* odometry); |
| Near32 | 17:f360e21d3307 | 16 | bool setPWM(PwmOut *servo,float p); |
| Near32 | 3:573a0dc8383f | 17 | |
| Near32 | 3:573a0dc8383f | 18 | Mat<double> bicycle(3,1); |
| Near32 | 17:f360e21d3307 | 19 | int reduc = 16; |
| Near32 | 3:573a0dc8383f | 20 | /*---------------------------------------------------------------------------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 21 | /*---------------------------------------------------------------------------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 22 | |
| Near32 | 17:f360e21d3307 | 23 | /*----------------------------------------------------------------------------------------------*/ |
| Near32 | 17:f360e21d3307 | 24 | /*Serial*/ |
| Near32 | 17:f360e21d3307 | 25 | Serial pcs(USBTX, USBRX); // tx, rx |
| Near32 | 17:f360e21d3307 | 26 | /*----------------------------------------------------------------------------------------------*/ |
| Jagang | 21:5443f93819db | 27 | |
| Jagang | 23:228317fe0457 | 28 | /* --- Initialisation de la liste des obstable --- */ |
| Jagang | 23:228317fe0457 | 29 | int Obstacle::lastId = 0; |
| Jagang | 23:228317fe0457 | 30 | |
| Jagang | 0:41149573d577 | 31 | int main() |
| Jagang | 0:41149573d577 | 32 | { |
| Near32 | 17:f360e21d3307 | 33 | |
| Near32 | 17:f360e21d3307 | 34 | |
| Near32 | 17:f360e21d3307 | 35 | PwmOut pw1(p22); |
| Near32 | 17:f360e21d3307 | 36 | DigitalOut dir1(p21); |
| Near32 | 17:f360e21d3307 | 37 | PwmOut pw2(p24); |
| Near32 | 17:f360e21d3307 | 38 | DigitalOut dir2(p23); |
| Near32 | 17:f360e21d3307 | 39 | |
| Near32 | 17:f360e21d3307 | 40 | //mbuino |
| Near32 | 17:f360e21d3307 | 41 | /* |
| Near32 | 17:f360e21d3307 | 42 | PwmOut pw1(P0_17); |
| Near32 | 17:f360e21d3307 | 43 | DigitalOut dir1(P0_18); |
| Near32 | 17:f360e21d3307 | 44 | PwmOut pw2(P0_23); |
| Near32 | 17:f360e21d3307 | 45 | DigitalOut dir2(P0_19); |
| Near32 | 17:f360e21d3307 | 46 | */ |
| Near32 | 17:f360e21d3307 | 47 | /* |
| Near32 | 17:f360e21d3307 | 48 | //nucleo |
| Near32 | 17:f360e21d3307 | 49 | PwmOut pw1(PB_8); |
| Near32 | 17:f360e21d3307 | 50 | DigitalOut dir1(D12); |
| Near32 | 17:f360e21d3307 | 51 | PwmOut pw2(PB_9); |
| Near32 | 17:f360e21d3307 | 52 | DigitalOut dir2(D13); |
| Near32 | 17:f360e21d3307 | 53 | */ |
| Near32 | 17:f360e21d3307 | 54 | pw1.period_us(10); |
| Near32 | 17:f360e21d3307 | 55 | pw2.period_us(10); |
| Near32 | 17:f360e21d3307 | 56 | |
| Near32 | 17:f360e21d3307 | 57 | |
| Near32 | 17:f360e21d3307 | 58 | dir1.write(0); |
| Near32 | 17:f360e21d3307 | 59 | dir2.write(0); |
| Near32 | 17:f360e21d3307 | 60 | pw1.write(1.0); |
| Near32 | 17:f360e21d3307 | 61 | pw2.write(0.8); |
| Near32 | 17:f360e21d3307 | 62 | //setPWM(&pw1,0.9); |
| Near32 | 17:f360e21d3307 | 63 | pcs.printf("mise à jour des pwm.\n"); |
| Near32 | 17:f360e21d3307 | 64 | //while(1); |
| Near32 | 3:573a0dc8383f | 65 | /*----------------------------------------------------------------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 66 | /*Odometry*/ |
| Near32 | 17:f360e21d3307 | 67 | QEI qei_left(p15,p16,NC,1024*reduc,QEI::X4_ENCODING); |
| Near32 | 17:f360e21d3307 | 68 | //QEI qei_left(P0_2,P0_7,NC,1024*reduc,QEI::X4_ENCODING);//mbuino |
| Near32 | 17:f360e21d3307 | 69 | //QEI qei_left(PA_3,PA_2,NC,1024*reduc,QEI::X4_ENCODING);//nucleo |
| Near32 | 17:f360e21d3307 | 70 | |
| Near32 | 17:f360e21d3307 | 71 | QEI qei_right(p17,p18,NC,1024*reduc,QEI::X4_ENCODING); |
| Near32 | 17:f360e21d3307 | 72 | //QEI qei_right(P0_8,P0_20,NC,1024*reduc,QEI::X4_ENCODING);//mbuino |
| Near32 | 17:f360e21d3307 | 73 | //QEI qei_right(PA_10,PB_3,NC,1024*reduc,QEI::X4_ENCODING);//nucleo |
| Jagang | 0:41149573d577 | 74 | |
| Jagang | 0:41149573d577 | 75 | Odometry odometry(&qei_left,&qei_right,0.07,0.07,0.26); |
| Near32 | 3:573a0dc8383f | 76 | /*----------------------------------------------------------------------------------------------*/ |
| Jagang | 0:41149573d577 | 77 | |
| Near32 | 3:573a0dc8383f | 78 | |
| Near32 | 3:573a0dc8383f | 79 | |
| Near32 | 3:573a0dc8383f | 80 | /*----------------------------------------------------------------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 81 | /*KalmanFilter*/ |
| Near32 | 8:1150a13f6967 | 82 | double phi_max = 100; |
| Near32 | 3:573a0dc8383f | 83 | /*en millimetres*/ |
| Near32 | 3:573a0dc8383f | 84 | bicycle.set((double)100, 1,1); /*radius*/ |
| Near32 | 3:573a0dc8383f | 85 | bicycle.set((double)100, 2,1); |
| Near32 | 3:573a0dc8383f | 86 | bicycle.set((double)66, 3,1); /*entre-roue*/ |
| Near32 | 3:573a0dc8383f | 87 | |
| Near32 | 3:573a0dc8383f | 88 | int nbrstate = 5; |
| Near32 | 3:573a0dc8383f | 89 | int nbrcontrol = 2; |
| Near32 | 17:f360e21d3307 | 90 | int nbrobs = 5; |
| Near32 | 3:573a0dc8383f | 91 | double dt = (double)0.05; |
| Near32 | 8:1150a13f6967 | 92 | double stdnoise = (double)0.05; |
| Near32 | 3:573a0dc8383f | 93 | |
| Near32 | 3:573a0dc8383f | 94 | Mat<double> initX((double)0, nbrstate, 1); |
| Near32 | 3:573a0dc8383f | 95 | initX.set( (double)0, 3,1); |
| Near32 | 3:573a0dc8383f | 96 | |
| Near32 | 3:573a0dc8383f | 97 | bool extended = true; |
| Near32 | 17:f360e21d3307 | 98 | bool filterOn = false; |
| Near32 | 17:f360e21d3307 | 99 | EKF<double> instance(&pcs, nbrstate, nbrcontrol, nbrobs, dt, stdnoise, /*current state*/ initX, extended, filterOn); |
| Near32 | 3:573a0dc8383f | 100 | |
| Near32 | 17:f360e21d3307 | 101 | instance.initMotion(motion_bicycle3); |
| Near32 | 17:f360e21d3307 | 102 | instance.initSensor(sensor_bicycle3); |
| Near32 | 17:f360e21d3307 | 103 | instance.initJMotion(jmotion_bicycle3); |
| Near32 | 17:f360e21d3307 | 104 | instance.initJSensor(jsensor_bicycle3); |
| Near32 | 3:573a0dc8383f | 105 | |
| Near32 | 3:573a0dc8383f | 106 | /*desired State : (x y theta phiright phileft)*/ |
| Near32 | 3:573a0dc8383f | 107 | Mat<double> dX((double)0, nbrstate, 1); |
| Near32 | 17:f360e21d3307 | 108 | dX.set( (double)100, 1,1); |
| Near32 | 17:f360e21d3307 | 109 | dX.set( (double)0, 2,1); |
| Near32 | 4:4025c071b207 | 110 | dX.set( (double)0, 3,1); |
| Near32 | 3:573a0dc8383f | 111 | dX.set( (double)0, 4,1); |
| Near32 | 3:573a0dc8383f | 112 | dX.set( (double)0, 5,1); |
| Near32 | 3:573a0dc8383f | 113 | |
| Near32 | 17:f360e21d3307 | 114 | Mat<double> ki((double)0, nbrcontrol, nbrstate); |
| Near32 | 17:f360e21d3307 | 115 | Mat<double> kp((double)0, nbrcontrol, nbrstate); |
| Near32 | 17:f360e21d3307 | 116 | Mat<double> kd((double)0, nbrcontrol, nbrstate); |
| Near32 | 17:f360e21d3307 | 117 | //Mat<double> kdd((double)0.0015, nbrcontrol, nbrstate); |
| Near32 | 17:f360e21d3307 | 118 | |
| Near32 | 17:f360e21d3307 | 119 | for(int i=1;i<=nbrstate;i++) |
| Near32 | 17:f360e21d3307 | 120 | { |
| Near32 | 17:f360e21d3307 | 121 | kp.set( (double)0.01, i, i); |
| Near32 | 17:f360e21d3307 | 122 | kd.set( (double)0.0001, i, i); |
| Near32 | 17:f360e21d3307 | 123 | ki.set( (double)0.0001, i, i); |
| Near32 | 17:f360e21d3307 | 124 | } |
| Near32 | 17:f360e21d3307 | 125 | |
| Near32 | 17:f360e21d3307 | 126 | instance.setKi(ki); |
| Near32 | 17:f360e21d3307 | 127 | instance.setKp(kp); |
| Near32 | 17:f360e21d3307 | 128 | instance.setKd(kd); |
| Near32 | 17:f360e21d3307 | 129 | //instance.setKdd(kdd); |
| Near32 | 17:f360e21d3307 | 130 | |
| Near32 | 3:573a0dc8383f | 131 | Mat<double> u(transpose( instance.getCommand()) ); |
| Near32 | 3:573a0dc8383f | 132 | |
| Near32 | 3:573a0dc8383f | 133 | /*Observations*/ |
| Near32 | 17:f360e21d3307 | 134 | /*il nous faut 5 observation :*/ |
| Near32 | 17:f360e21d3307 | 135 | Mat<double> z((double)0,5,1); |
| Near32 | 3:573a0dc8383f | 136 | measurementCallback(&z, &odometry); |
| Near32 | 3:573a0dc8383f | 137 | |
| Near32 | 3:573a0dc8383f | 138 | /*----------------------------------------------------------------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 139 | |
| Near32 | 3:573a0dc8383f | 140 | |
| Jagang | 0:41149573d577 | 141 | while(1) |
| Jagang | 0:41149573d577 | 142 | { |
| Near32 | 17:f360e21d3307 | 143 | //wait(1); |
| Near32 | 17:f360e21d3307 | 144 | pcs.printf("%f : %f : %f\n",odometry.getX()*100,odometry.getY()*100,odometry.getTheta()*180/3.14); |
| Near32 | 17:f360e21d3307 | 145 | |
| Near32 | 3:573a0dc8383f | 146 | |
| Near32 | 3:573a0dc8383f | 147 | /*------------------------------------------------------------------------------------------*/ |
| Near32 | 17:f360e21d3307 | 148 | /*Asservissement*/ |
| Near32 | 17:f360e21d3307 | 149 | |
| Near32 | 17:f360e21d3307 | 150 | //measurementCallback(&z, &odometry); |
| Near32 | 17:f360e21d3307 | 151 | instance.measurement_Callback( instance.getX(), dX, true ); |
| Near32 | 17:f360e21d3307 | 152 | |
| Near32 | 3:573a0dc8383f | 153 | instance.state_Callback(); |
| Near32 | 17:f360e21d3307 | 154 | |
| Near32 | 10:bca0274a007b | 155 | double phi_r = instance.getCommand().get(1,1); |
| Near32 | 10:bca0274a007b | 156 | double phi_l = instance.getCommand().get(2,1); |
| Near32 | 8:1150a13f6967 | 157 | |
| Near32 | 17:f360e21d3307 | 158 | double phi_max = 100; |
| Near32 | 3:573a0dc8383f | 159 | |
| Near32 | 17:f360e21d3307 | 160 | instance.computeCommand(dX, (double)dt, -2); |
| Near32 | 22:80fdb12c167f | 161 | pcs.printf("command : \n phi_r = %f \n phi_l = %f \n", (phi_r/phi_max)*100, (phi_l/phi_max)*100); |
| Near32 | 17:f360e21d3307 | 162 | //instance.getX().afficher(); |
| Near32 | 17:f360e21d3307 | 163 | |
| Near32 | 17:f360e21d3307 | 164 | |
| Near32 | 17:f360e21d3307 | 165 | if(phi_r <= 0) |
| Near32 | 17:f360e21d3307 | 166 | dir1.write(0); |
| Near32 | 17:f360e21d3307 | 167 | else |
| Near32 | 17:f360e21d3307 | 168 | dir1.write(1); |
| Near32 | 17:f360e21d3307 | 169 | |
| Near32 | 17:f360e21d3307 | 170 | if(phi_l <= 0) |
| Near32 | 17:f360e21d3307 | 171 | dir2.write(0); |
| Near32 | 17:f360e21d3307 | 172 | else |
| Near32 | 17:f360e21d3307 | 173 | dir2.write(1); |
| Near32 | 17:f360e21d3307 | 174 | |
| Near32 | 17:f360e21d3307 | 175 | if(abs(phi_r/phi_max) < 1.0) |
| Near32 | 22:80fdb12c167f | 176 | setPWM(&pw1, (float)abs((double)phi_r/phi_max)); |
| Near32 | 17:f360e21d3307 | 177 | else |
| Near32 | 17:f360e21d3307 | 178 | cout << "P1..." << endl; |
| Near32 | 17:f360e21d3307 | 179 | |
| Near32 | 17:f360e21d3307 | 180 | if(abs(phi_l/phi_max) < 1.0) |
| Near32 | 22:80fdb12c167f | 181 | setPWM(&pw2,(float)abs((double)phi_l/phi_max)); |
| Near32 | 17:f360e21d3307 | 182 | else |
| Near32 | 17:f360e21d3307 | 183 | pcs.printf("P2..."); |
| Near32 | 17:f360e21d3307 | 184 | |
| Near32 | 17:f360e21d3307 | 185 | pcs.printf("\n\n----------------- Commande mise executee. ------------------ \n\n"); |
| Near32 | 3:573a0dc8383f | 186 | |
| Jagang | 0:41149573d577 | 187 | } |
| Jagang | 0:41149573d577 | 188 | } |
| Near32 | 3:573a0dc8383f | 189 | |
| Near32 | 3:573a0dc8383f | 190 | void measurementCallback( Mat<double>* z, Odometry* odometry) |
| Near32 | 3:573a0dc8383f | 191 | { |
| Near32 | 3:573a0dc8383f | 192 | z->set( (double)/*conversionUnitée mm */odometry->getX(), 1,1); |
| Near32 | 3:573a0dc8383f | 193 | z->set( (double)/*conversionUnitée mm*/odometry->getY(), 2,1); |
| Near32 | 3:573a0dc8383f | 194 | z->set( (double)/*conversionUnitée rad*/odometry->getTheta(), 3,1); |
| Near32 | 3:573a0dc8383f | 195 | } |
| Near32 | 3:573a0dc8383f | 196 | |
| Near32 | 17:f360e21d3307 | 197 | Mat<double> motion_bicycle3( Mat<double> state, Mat<double> command, double dt) |
| Near32 | 3:573a0dc8383f | 198 | { |
| Near32 | 3:573a0dc8383f | 199 | Mat<double> r(state); |
| Near32 | 3:573a0dc8383f | 200 | double v = bicycle.get(1,1)/(2*bicycle.get(3,1))*(r.get(4,1)+r.get(5,1)); |
| Near32 | 17:f360e21d3307 | 201 | double w = bicycle.get(1,1)/(2*bicycle.get(3,1))*(r.get(4,1)-r.get(5,1)); |
| Near32 | 3:573a0dc8383f | 202 | |
| Near32 | 3:573a0dc8383f | 203 | r.set( r.get(1,1) + v*cos(r.get(3,1))*dt, 1,1); |
| Near32 | 3:573a0dc8383f | 204 | r.set( r.get(2,1) + v*sin(r.get(3,1))*dt, 2,1); |
| Near32 | 3:573a0dc8383f | 205 | |
| Near32 | 17:f360e21d3307 | 206 | double angle = (r.get(3,1) + dt*w); |
| Near32 | 3:573a0dc8383f | 207 | if( angle < -PI) |
| Near32 | 3:573a0dc8383f | 208 | { |
| Near32 | 3:573a0dc8383f | 209 | angle = angle - PI*ceil(angle/PI); |
| Near32 | 3:573a0dc8383f | 210 | } |
| Near32 | 3:573a0dc8383f | 211 | else if( angle > PI) |
| Near32 | 3:573a0dc8383f | 212 | { |
| Near32 | 3:573a0dc8383f | 213 | angle = angle - PI*floor(angle/PI); |
| Near32 | 3:573a0dc8383f | 214 | } |
| Near32 | 3:573a0dc8383f | 215 | |
| Near32 | 17:f360e21d3307 | 216 | r.set( atan21(sin(angle), cos(angle)), 3,1); |
| Near32 | 3:573a0dc8383f | 217 | |
| Near32 | 17:f360e21d3307 | 218 | |
| Near32 | 17:f360e21d3307 | 219 | /*----------------------------------------*/ |
| Near32 | 17:f360e21d3307 | 220 | /*Modele du moteur*/ |
| Near32 | 17:f360e21d3307 | 221 | /*----------------------------------------*/ |
| Near32 | 17:f360e21d3307 | 222 | double r1 = bicycle.get(3,1)/bicycle.get(1,1)*(command.get(1,1)/bicycle.get(3,1)+command.get(2,1)); |
| Near32 | 17:f360e21d3307 | 223 | double r2 = bicycle.get(3,1)/bicycle.get(1,1)*(command.get(1,1)/bicycle.get(3,1)-command.get(2,1)); |
| Near32 | 17:f360e21d3307 | 224 | |
| Near32 | 17:f360e21d3307 | 225 | |
| Near32 | 17:f360e21d3307 | 226 | r.set( r1, 4,1); |
| Near32 | 17:f360e21d3307 | 227 | r.set( r2, 5,1); |
| Near32 | 17:f360e21d3307 | 228 | |
| Near32 | 17:f360e21d3307 | 229 | |
| Near32 | 17:f360e21d3307 | 230 | /*----------------------------------------*/ |
| Near32 | 17:f360e21d3307 | 231 | /*----------------------------------------*/ |
| Near32 | 3:573a0dc8383f | 232 | |
| Near32 | 3:573a0dc8383f | 233 | return r; |
| Near32 | 3:573a0dc8383f | 234 | } |
| Near32 | 3:573a0dc8383f | 235 | |
| Near32 | 3:573a0dc8383f | 236 | |
| Near32 | 17:f360e21d3307 | 237 | Mat<double> sensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt) |
| Near32 | 17:f360e21d3307 | 238 | { |
| Near32 | 17:f360e21d3307 | 239 | return state; |
| Near32 | 3:573a0dc8383f | 240 | } |
| Near32 | 3:573a0dc8383f | 241 | |
| Near32 | 17:f360e21d3307 | 242 | |
| Near32 | 17:f360e21d3307 | 243 | Mat<double> jmotion_bicycle3( Mat<double> state, Mat<double> command, double dt) |
| Near32 | 3:573a0dc8383f | 244 | { |
| Near32 | 3:573a0dc8383f | 245 | double h = numeric_limits<double>::epsilon()*10e2; |
| Near32 | 3:573a0dc8383f | 246 | Mat<double> var( (double)0, state.getLine(), state.getColumn()); |
| Near32 | 3:573a0dc8383f | 247 | var.set( h, 1,1); |
| Near32 | 17:f360e21d3307 | 248 | Mat<double> G(motion_bicycle3(state, command, dt) - motion_bicycle3(state+var, command,dt)); |
| Near32 | 3:573a0dc8383f | 249 | |
| Near32 | 3:573a0dc8383f | 250 | for(int i=2;i<=state.getLine();i++) |
| Near32 | 3:573a0dc8383f | 251 | { |
| Near32 | 3:573a0dc8383f | 252 | var.set( (double)0, i-1,1); |
| Near32 | 3:573a0dc8383f | 253 | var.set( h, i,1); |
| Near32 | 17:f360e21d3307 | 254 | G = operatorL(G, motion_bicycle3(state, command, dt) - motion_bicycle3(state+var, command,dt) ); |
| Near32 | 3:573a0dc8383f | 255 | } |
| Near32 | 3:573a0dc8383f | 256 | |
| Near32 | 3:573a0dc8383f | 257 | |
| Near32 | 3:573a0dc8383f | 258 | return (1.0/h)*G; |
| Near32 | 3:573a0dc8383f | 259 | } |
| Near32 | 3:573a0dc8383f | 260 | |
| Near32 | 17:f360e21d3307 | 261 | Mat<double> jsensor_bicycle3( Mat<double> state, Mat<double> command, Mat<double> d_state, double dt) |
| Near32 | 3:573a0dc8383f | 262 | { |
| Near32 | 3:573a0dc8383f | 263 | double h = numeric_limits<double>::epsilon()*10e2; |
| Near32 | 3:573a0dc8383f | 264 | Mat<double> var((double)0, state.getLine(), state.getColumn()); |
| Near32 | 3:573a0dc8383f | 265 | var.set( h, 1,1); |
| Near32 | 17:f360e21d3307 | 266 | Mat<double> H(sensor_bicycle3(state, command, d_state, dt) - sensor_bicycle3(state+var, command, d_state, dt)); |
| Near32 | 3:573a0dc8383f | 267 | |
| Near32 | 3:573a0dc8383f | 268 | for(int i=2;i<=state.getLine();i++) |
| Near32 | 17:f360e21d3307 | 269 | { |
| Near32 | 3:573a0dc8383f | 270 | var.set( (double)0, i-1,1); |
| Near32 | 3:573a0dc8383f | 271 | var.set( h, i,1); |
| Near32 | 17:f360e21d3307 | 272 | Mat<double> temp(sensor_bicycle3(state, command, d_state, dt) - sensor_bicycle3(state+var, command, d_state, dt)); |
| Near32 | 17:f360e21d3307 | 273 | |
| Near32 | 17:f360e21d3307 | 274 | H = operatorL(H, temp ); |
| Near32 | 17:f360e21d3307 | 275 | pcs.printf("sensor bicycle %d...\n",i); |
| Near32 | 3:573a0dc8383f | 276 | } |
| Near32 | 3:573a0dc8383f | 277 | |
| Near32 | 3:573a0dc8383f | 278 | |
| Near32 | 3:573a0dc8383f | 279 | return (1.0/h)*H; |
| Near32 | 17:f360e21d3307 | 280 | } |
| Near32 | 17:f360e21d3307 | 281 | |
| Near32 | 17:f360e21d3307 | 282 | bool setPWM(PwmOut *servo,float p) |
| Near32 | 17:f360e21d3307 | 283 | { |
| Near32 | 17:f360e21d3307 | 284 | if(p <= 1.0f && p >= 0.0f) |
| Near32 | 17:f360e21d3307 | 285 | { |
| Near32 | 17:f360e21d3307 | 286 | servo->write(p); |
| Near32 | 17:f360e21d3307 | 287 | return true; |
| Near32 | 17:f360e21d3307 | 288 | } |
| Near32 | 17:f360e21d3307 | 289 | |
| Near32 | 17:f360e21d3307 | 290 | return false; |
| Near32 | 3:573a0dc8383f | 291 | } |

